【问题标题】:Xtext Grammar Ambiguities (Backtracking is not working)Xtext 语法歧义(回溯不起作用)
【发布时间】:2015-07-01 04:08:23
【问题描述】:

我正在尝试使用 Xtext 设计一种简单的语言来对数字集进行操作。

以下是该语言中字符串的一些示例:

  • {2,1+6}(一组数字 2 和 7)
  • {1+3, 3+5} + {2..5}(集合 {4, 8} 和 {2, 3, 4, 5} 的并集)

我正在使用以下语法:

grammar org.example.Set with org.eclipse.xtext.common.Terminals

generate set "http://www.set.net/set"




SetAddition returns SetExpression:
    SetMultiplication ({SetAddition.left=current} '+' right=SetMultiplication)*     
;

SetMultiplication returns SetExpression:
    SetPrimary ({SetMultiplication.left=current} ('*'|'\\') right=SetPrimary)*
;

SetPrimary returns SetExpression:
    SetAtom | '(' SetAddition ')'
;

SetAtom returns SetExpression:
    Set | Range 
;

Set:
  lhs = '{' (car=ArithmeticTerm (',' cdr+=ArithmeticTerm)*)? '}'
;

Range:
    '{' lhs=ArithmeticTerm '.' '.' rhs=ArithmeticTerm '}'
;
ArithmeticTerm:
    Addition //| Multiplication
;

Addition returns ArithmeticTerm:
    Multiplication ({Addition.lhs=current} ('+'|'-') rhs=Multiplication)*
;

Multiplication returns ArithmeticTerm:
    Primary ({Multiplication.lhs=current} ('*'|'/'|'%') rhs=Primary)*
;

Primary returns ArithmeticTerm:
    ArithmeticAtom |
    '(' Addition ')'
;

ArithmeticAtom:
       value = INT 
;

当我执行 MWE2 工作流程时,我收到以下错误:

error(211): ../net.certware.argument.language.ui/src-gen/net/certware/argument/language/ui/contentassist/antlr/internal/InternalL.g:420:1: [fatal] rule rule__SetAtom__Alternatives has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2.  Resolve by left-factoring or using syntactic predicates or using backtrack=true option.

我确实在 mwe2 文件中启用了回溯。

我有这段代码:

// The antlr parser generator fragment.
        fragment = parser.antlr.XtextAntlrGeneratorFragment auto-inject {
          options = {
              backtrack = true
          }
        }

并且mwe2文件中没有其他提到ANTLR的片段。

我使用的 Xtext 版本是 Xtext 2.8.0,集成在 Xtext 网站上的 Full Eclipse 中。

为什么 ANTLR 建议我启用回溯(如果已经启用)? 我的语法有什么问题吗?

【问题讨论】:

    标签: antlr grammar xtext ambiguous-grammar


    【解决方案1】:

    错误源于您的语法

    SetPrimary returns SetExpression:
        SetAtom | '(' SetAddition ')'
    ;
    

    Primary returns ArithmeticTerm:
        ArithmeticAtom |
        '(' Addition ')'
    ;
    

    可以简化为

    SetPrimary returns SetExpression:
        ArithmeticAtom | '(' Addition ')' | '(' SetAddition ')'
    ;
    

    由于 Addition 和 SetAddition 在有限前瞻中无法区分(两者都可以从无限数量的开头 ( 开始)。因此,您首先需要回溯 - 您可能需要重新考虑语法或 AST 结构。

    无论如何,请将回溯也添加到您的工作流程中的XtextAntlrUiGeneratorFragment

    【讨论】:

    • 谢谢!!!我同意任何 K 的语法都不是 LL(k)。修改 XtextAntlrUiGeneratorFragment 有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多