ANTLR4中如何根据关键字跳过输入
How to skip input according to keywords in 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' 作为分隔符,理想情况下不会将其解析为输出。
我在 权威指南 中阅读了 Island 语法,也尝试过使用词法分析器模式,但无法使其以这种方式工作。非常感谢任何提示和帮助。
你已经很接近了,只是避免定义一个换行符标记两次。这个语法对我有用(我把它放在一个组合语法文件中):
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
解析规则基于行,这需要换行标记。
我是 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' 作为分隔符,理想情况下不会将其解析为输出。
我在 权威指南 中阅读了 Island 语法,也尝试过使用词法分析器模式,但无法使其以这种方式工作。非常感谢任何提示和帮助。
你已经很接近了,只是避免定义一个换行符标记两次。这个语法对我有用(我把它放在一个组合语法文件中):
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
解析规则基于行,这需要换行标记。