左递归问题

时间:2015-07-19 13:31:35

标签: xtext

我有一些语法,其中包含一些必须与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

最好的问候 乌鸦

1 个答案:

答案 0 :(得分:1)

你想要达到的语法是左递归的;这意味着解析器不知道如何在(acos 10) testacos (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
    ;

解析器将正确识别表达式,例如:

  • (acos abs(20 test)test)
  • acos abs 20
  • acos 20
  • (20测试)

这些文章可能对您有所帮助: