【问题标题】:Problems with left-recursion左递归的问题
【发布时间】:2015-07-19 13:31:35
【问题描述】:

我有一个小语法,其中包含一些必须与 Numbers 一起使用的命令,其中一些命令也返回 Numbers。
我的语法 sn-p 是这样的:

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

最好的问候
乌鸦

【问题讨论】:

  • 我不知道您正在使用的解析器生成器,但在我看来,任何以 name 开头的东西都会模棱两可,因为您可以使用 name 作为起始符号Command -> name Numbers... 或 Command -> Numbers "test" -> Numbers: numberReturn -> numberReturn: name...
  • 是的,就是这样......现在我也看到了。现在的问题是如何解决这种歧义。不过还是谢谢
  • 你看过文档了吗?我认为它很好地涵盖了它:eclipse.org/Xtext/documentation/301_grammarlanguage.html 搜索“Assigned Actions”和“Syntactic Predicates”
  • 我确实试图猜测您要做什么,但我需要有关您的问题的更多详细信息。在你的 DSL 中可能有什么样的陈述?请添加一些示例,以便我找出可能的语法。
  • 添加了一些示例...希望它们足够有用

标签: xtext


【解决方案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 次测试)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2011-12-10
    相关资源
    最近更新 更多