用于解析简单表达式的Antlr语法

时间:2014-03-27 20:42:40

标签: antlr grammar antlr4

我想用antlr4解析下面的表达式

termspannear ( xxx, xxx , 5 , true ) 

termspannear ( xxx, termspannear ( xxx, xxx , 5 , true ) , 5 , true ) 

其中termspannear函数可以嵌套

这是我的语法:

//Define a gramar to parse TermSpanNear
grammar TermSpanNear;
start       : TERMSPAN ;

TERMSPAN    : TERMSPANNEAR | 'xxx' ;
TERMSPANNEAR: 'termspannear' OPENP BODY CLOSEP ;
BODY        : TERMSPAN COMMA TERMSPAN COMMA SLOP COMMA ORDERED ;
COMMA       : ',' ;
OPENP       : '(' ;
CLOSEP      : ')' ;
SLOP        : [0-9]+ ;
ORDERED     : 'true' | 'false' ;
WS          : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

跑完后:

antlr4 TermSpanNear.g4
javac TermSpanNear*.java
grun TermSpanNear start -gui
termspannear ( xxx, xxx , 5 , true )
^D![enter image description here][1]
line 1:0 token recognition error at: 'termspannear '
line 1:13 extraneous input '(' expecting TERMSPAN

树看起来像:

enter image description here

有人可以帮我解决这个语法吗? 因此,解析后的树包含所有参数以及嵌套作品

注意: 在我建议之后我把它改写成

//Define a gramar to parse TermSpanNear
grammar TermSpanNear;
start       : termspan EOF;

termspan    : termspannear | 'xxx' ;
termspannear: 'termspannear' '('  body  ')' ;
body        : termspan ',' termspan ',' SLOP ',' ORDERED ;

SLOP        : [0-9]+ ;
ORDERED     : 'true' | 'false' ;
WS          : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

我认为现在它有效 我正在考虑以下树木: 对于

termspannear ( xxx, xxx , 5 , true ) 

enter image description here

有关
    termspannear(xxx,termspannear(xxx,xxx,5,true),5,true)

enter image description here

1 个答案:

答案 0 :(得分:1)

你正在使用过多的词法规则。

当您定义这样的令牌时:

BODY        : TERMSPAN COMMA TERMSPAN COMMA SLOP COMMA ORDERED ;

然后,tokenizer(lexer)将尝试创建(single!)标记:xxx,xxx,5,true。例如。它允许它之间的任何空间。 Lexer规则(以资本开头的规则)应该是" atoms"你的语言(最小的部分)。每当你开始创建像body一样的元素时,你就会在解析器规则中将粘合原子放在一起,而不是在词法分析器规则中。

尝试这样的事情:

grammar TermSpanNear;

// parser rules (the elements)
start          : termpsan EOF ;
termpsan       : termpsannear | 'xxx' ;
termpsannear   : 'termspannear' OPENP body CLOSEP ;
body           : termpsan COMMA termpsan COMMA SLOP COMMA ORDERED ;

// lexer rules (the atoms)
COMMA          : ',' ;
OPENP          : '(' ;
CLOSEP         : ')' ;
SLOP           : [0-9]+ ;
ORDERED        : 'true' | 'false' ;
WS             : [ \t\r\n]+ -> skip ;