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} 的并集)
我正在使用以下语法:
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 版本是集成在 Full Eclipse 中的 Xtext 2.8.0,可从 Xtext 网站获得。
为什么 ANTLR 提示我启用回溯(如果它已经启用)?
我的语法有什么问题吗?
错误源于您的
语法
SetPrimary returns SetExpression:
SetAtom | '(' SetAddition ')'
;
和
Primary returns ArithmeticTerm:
ArithmeticAtom |
'(' Addition ')'
;
可以减少到
SetPrimary returns SetExpression:
ArithmeticAtom | '(' Addition ')' | '(' SetAddition ')'
;
因为 Addition 和 SetAddition 与有限先行无法区分(两者都可以从无限数量的开放 (
开始)。因此,您首先需要回溯 - 您可能需要重新考虑语法或 AST 结构。
无论如何,请将回溯也添加到您的工作流程中的XtextAntlrUiGeneratorFragment
。
我正在尝试使用 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 版本是集成在 Full Eclipse 中的 Xtext 2.8.0,可从 Xtext 网站获得。
为什么 ANTLR 提示我启用回溯(如果它已经启用)? 我的语法有什么问题吗?
错误源于您的
语法SetPrimary returns SetExpression:
SetAtom | '(' SetAddition ')'
;
和
Primary returns ArithmeticTerm:
ArithmeticAtom |
'(' Addition ')'
;
可以减少到
SetPrimary returns SetExpression:
ArithmeticAtom | '(' Addition ')' | '(' SetAddition ')'
;
因为 Addition 和 SetAddition 与有限先行无法区分(两者都可以从无限数量的开放 (
开始)。因此,您首先需要回溯 - 您可能需要重新考虑语法或 AST 结构。
无论如何,请将回溯也添加到您的工作流程中的XtextAntlrUiGeneratorFragment
。