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' 作为分隔符,理想情况下不会将其解析为输出。

我在 权威指南 中阅读了 Isl​​and 语法,也尝试过使用词法分析器模式,但无法使其以这种方式工作。非常感谢任何提示和帮助。

你已经很接近了,只是避免定义一个换行符标记两次。这个语法对我有用(我把它放在一个组合语法文件中):

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 解析规则基于行,这需要换行标记。