ANTLR4:空白处理(ANTLR4: Whitespace handling)

2019-08-17 18:33发布

我已经看到,使用空格处理很多这样的ANTLR语法:

WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);

所以空格被扔掉分别发送到隐藏的通道。

有了这样的语法:

grammar Not;

start:      expression;
expression: NOT expression
          | (TRUE | FALSE);

NOT:    'not';
TRUE:   'true';
FALSE:  'false';
WS: [ \n\t\r]+ -> skip;

有效输入是“ 不真 ”或“ 不假 ”,而且“nottrue”,这是不期望的结果。 更改语法:

grammar Not;

start:      expression;

expression: NOT WS+ expression
          | (TRUE | FALSE);

NOT:    'not';

TRUE:   'true';
FALSE:  'false';

WS: [ \n\t\r];

解决了这个问题,但我不希望手动处理空格每个规则。

一般来说,我想有一些例外每个令牌之间的空格(例如“!真 ”并不需要之间的空格)。

是否有这样做的一个简单的方法?

Answer 1:

添加IDENTIFIER的词法规则来处理的话这不是关键字。

IDENTIFIER : [a-zA-Z]+;

现在文本nottrue是一个IDENTIFIER令牌,该令牌解析器将不到位不同的关键字接受not true

确保IDENTIFIER是其他关键字之后定义。 词法分析器会发现,两者NOTIDENTIFIER匹配的文本not ,并且将分配记号类型出现在语法中的第一个。



文章来源: ANTLR4: Whitespace handling