如何根据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;

您的输入使我得到了这棵分析树:

enter image description here

还请注意:您无法避免在输出中使用NL令牌,因为您决定基于line解析规则行,而这需要换行符。