24

我见过许多使用空格处理的 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;

有效输入是“ not true ”或“ not false ”,但也有“ nottrue ”,这不是期望的结果。将语法更改为:

grammar Not;

start:      expression;

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

NOT:    'not';

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

WS: [ \n\t\r];

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

通常,我希望每个标记之间有一个空格,但有一些例外(例如,' !true ' 之间不需要空格)。

有没有一种简单的方法可以做到这一点?

4

1 回答 1

24

添加IDENTIFIER词法分析器规则来处理不是关键字的单词。

IDENTIFIER : [a-zA-Z]+;

现在文本nottrue是一个单一的IDENTIFIER标记,你的解析器不会接受它来代替not true.

确保在您的其他关键字之后IDENTIFIER定义。词法分析器将找到两者并匹配 text ,并将标记类型分配给语法中出现的第一个。NOTIDENTIFIERnot

于 2013-03-19T15:29:50.310 回答