我对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不应该有空格。任何其他位置的空白都不重要。
答案 0 :(得分:3)
即使您正在跳过WS,词法分析器规则仍然对空白字符的存在敏感。 Skip只是意味着解析器不会生成任何令牌供消费者使用。因此,词法分析器Addr
规则明确不允许任何内部空白字符。
相反,a
和idList
解析器规则永远不会看到内部空白标记,因此这些规则对生成的标记之间出现的空白字符不敏感。
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]+;
其他选项