如何解决如何根据ANTLR4中的关键字跳过输入
我是antlr4的新手,想知道它是否能满足我的需求。这是一个示例输入:
There is a lot of text
in this file that i do not care
about
Lithium 20 g/ml
Bor that should be skipped
Potassium 300g/ml
...
和代码:
SempredParser.g4
parser grammar SempredParser;
options { tokenVocab=SempredLexer ;}
file : line+ EOF;
line : KEYWORD (NUM UNIT)+ '\n'+;
SempredLexer.g4:
lexer grammar SempredLexer;
//lexer rules
KEYWORD : ('Lithium' | 'Potassium' ) ;
NL : '\n';
NUM : [0-9]+ ('.'[0-9]+)? ;
UNIT : 'g/ml';
UNKNOWN : . -> skip ;
我想跳过所有不包含关键字的行(我大约有100个关键字)。请注意,我在这里仅使用'\ n'作为分隔符,并且理想情况下不会将其解析为输出。
我在权威指南中了解了岛屿语法,并尝试使用词法分析器模式,但无法使其工作。任何提示和帮助都将不胜感激。
解决方法
您非常接近,只需避免两次定义换行标记。该语法对我有用(我将其放入组合的语法文件中):
grammar IslandTest;
start: NL+ line+ EOF;
line: KEYWORD (NUM UNIT)+ NL+;
KEYWORD: ('Lithium' | 'Potassium');
NUM: [0-9]+ ('.' [0-9]+)?;
UNIT: 'g/ml';
NL: '\n';
UNKNOWN: . -> skip;
您的输入使我得到了这棵分析树:
还请注意:您无法避免在输出中使用NL令牌,因为您决定基于line
解析规则行,而这需要换行符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。