我遇到了一个模糊的Xtext语法问题,但我找不到正确的解决方案。
Program: (statements+=Statement)+
Statement: (AssignmentStatement | ResetStatement);
ResetStatement returns Statement:
'RESET' (fields+=Identifier)+
;
AssignStatement returns Statement:
target=Identifier ':=' object=Identifier
;
我得到的问题是RESET语句可能有几个字段要复位;但是,当':='如果找到了token,则解析器应该检测AssignmentStatement的开头。我尝试过使用语法谓词,但我只能消除语法歧义:
ResetStatement returns Statement:
'RESET' =>(fields+=Identifier)+
;
但是,您可能会注意到这不是预期的行为,如:
RESET ID1 ID2
ID3 := ID1
在':='处返回错误令牌。我尝试将谓词标记添加到AssignmentStatement:
Statement: (=>AssignmentStatement | ResetStatement);
还有:
AssignStatement returns Statement:
=>(target=Identifier ':=') object=Identifier
;
但没有成功。错误在所有情况下都是:
[fatal] rule ruleResetStatement 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.
我很失落所以任何提示都很受欢迎。