我有一些语法,其中包含一些必须与Numbers一起使用的命令,其中一些命令也会返回数字。
我的语法片段如下所示:
Command:
name Numbers
| Numbers "test"
;
name:
"abs"
| "acos"
;
Numbers:
NUMBER
| numberReturn
;
numberReturn:
name Numbers
;
terminal NUMBER:
('0'..'9')+("."("0".."9")+)?
;
插入"数字'测试""参与规则命令,编译器抱怨非LL()的假设,并告诉我必须解决这些(左因素,句法谓词,回溯)但我的问题是我不知道什么样的输入不会在这种情况下,不是LL(),我也不知道如何左语法我的语法(我不想要回溯)。
编辑:
这个语法应该匹配的几个例子:
abs 3;
acos abs 4; //interpreted as "acos (abs 4)"
acos 3 test; //(acos 3) test
最好的问候 乌鸦
答案 0 :(得分:1)
你想要达到的语法是左递归的;这意味着解析器不知道如何在(acos 10) test
和acos (10 test)
之间进行判断(没有括号)。但是,您可以为解析器提供一些提示,以便知道正确的顺序,例如带括号的表达式。
这将是一个有效的Xtext语法,带有test
带括号的表达式:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model
: operations += UnaryOperation*
;
UnaryOperation returns Expression
: 'abs' exp = Primary
| 'acos' exp = Primary
| '(' exp = Primary 'test' ')'
;
Primary returns Expression
: NumberLiteral
| UnaryOperation
;
NumberLiteral
: value = INT
;
解析器将正确识别表达式,例如:
这些文章可能对您有所帮助: