忽略Antlr4中的空格(在某些部分中)

时间:2015-04-08 20:41:30

标签: parsing antlr4 removing-whitespace

我对antlr不太熟悉。我正在使用版本4,我有一个语法,其中空格在某些部分并不重要(但它可能在其他部分,或者说它的运气)。

所以说我们有以下语法

grammar Foo;
program : A* ;
A  : ID '@' ID '(' IDList ')' ';' ;
ID : [a-zA-Z]+ ;
IDList : ID (',' IDList)* ;
WS : [ \t\r\n]+ -> skip ;

和测试输入

foo@bar(X,Y);
foo@baz  ( z,Z) ;

正确解析第一行而第二行则不正确。 我不想在空白无关的地方对我的规则进行规范,因为我的实际语法比玩具示例更复杂。如果不清楚部件ID' @' ID不应该有空格。任何其他位置的空白都不重要。

2 个答案:

答案 0 :(得分:3)

即使您正在跳过WS,词法分析器规则仍然对空白字符的存在敏感。 Skip只是意味着解析器不会生成任何令牌供消费者使用。因此,词法分析器Addr规则明确不允许任何内部空白字符。

相反,aidList解析器规则永远不会看到内部空白标记,因此这些规则对生成的标记之间出现的空白字符不敏感。

grammar Foo;

program : a* EOF ; // EOF will require parsing the entire input

a  : Addr LParen IDList RParen Semi ;
idList : ID (Comma ID)* ;  // simpler equivalent construct

Addr : ID '@' ID 
ID : [a-zA-Z]+ ;
WS : [ \t\r\n]+ -> skip ;

答案 1 :(得分:1)

ID '@' ID定义为词法分析器而不是解析器令牌。

A  : AID '(' IDList ')' ';' ;

AID : [a-zA-Z]+ '@' [a-zA-Z]+;

其他选项

  • 启用/禁用令牌流中的空格,例如here
  • 启用/禁用具有词法分析器模式的空格(可能是一个问题,因为词法模式是在上下文中触发的,在您的情况下不容易确定)