我想用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
树看起来像:
有人可以帮我解决这个语法吗? 因此,解析后的树包含所有参数以及嵌套作品
注意: 在我建议之后我把它改写成
//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 )
有关
termspannear(xxx,termspannear(xxx,xxx,5,true),5,true)
答案 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 ;