关于antlr:Xtext语法歧义(回溯无效)

Xtext Grammar Ambiguities (Backtracking is not working)

我正在尝试使用Xtext设计一种简单的语言来处理数字集。

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

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

我正在使用以下语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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工作流程时,出现以下错误:

1
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文件中启用了回溯。

我在其中包含以下代码片段:

1
2
3
4
5
6
// 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建议我启用回溯功能(如果已启用)?
我的语法有什么问题吗?


该错误源于

的语法

1
2
3
SetPrimary returns SetExpression:
    SetAtom | '(' SetAddition ')'
;

1
2
3
4
Primary returns ArithmeticTerm:
    ArithmeticAtom |
    '(' Addition ')'
;

,可以减少为

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

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

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