左递归的问题

Problems with left-recursion

我有一些语法,其中包含一些必须与 Numbers 一起使用的命令以及其中一些命令 return Numbers。
我的语法片段如下所示:

Command:
    name Numbers
    | Numbers "test"
;  
name:
    "abs"
    | "acos"
;

Numbers:
   NUMBER
   | numberReturn
;
    numberReturn:
        name Numbers
    ;
terminal NUMBER:
    ('0'..'9')+("."("0".."9")+)?
;

在规则命令中插入 "Numbers 'test'" 部分后,编译器抱怨非 LL() 决策并告诉我必须解决这些问题(左因式分解、句法谓词、回溯)但我的问题是我不知道在这种情况下什么样的输入不会是非 LL() 也不知道如何左因子我的语法(我不知道想打开回溯)。

编辑:
此语法应匹配的几个示例:

abs 3;
acos abs 4; //interpreted as "acos (abs 4)"
acos 3 test; //(acos 3) test

此致
乌鸦

您要实现的语法是左递归的;这意味着解析器不知道如何区分 (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 测试) 测试)
  • acos 腹肌 20
  • acos 20
  • (20 次测试)

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