我遇到了一个稍微不同的语法问题,它是一个只有一个规则(一个巨大的规则)的语法,并且有几个调用本身。我不知道如何用Xtext来表示这个语法,这是一项学术工作,对语言的指定有要求。从文章中得到的原语法为:
和我失败的尝试如下所示:
Relax:
root+=General+;
//nao tinha o tipo boleano
terminal BOOLEAN returns ecore::EBoolean:
'true'|'false'
;
General:
root+=BOOLEAN|STRING|ShallOperator|MayOperator|EventuallyOperator|UntilOperator|BeforeOperator|AfterOperator|InOperator;
ShallOperator:
'shall' elements=General;
MayOperator:
"may" action1=General 'or' action2=General;
EventuallyOperator:
'eventually' element=General;
UntilOperator:
// {General.left=current}'&' right=General;
// ({General.left=current}) 'until' element2=General;
left=General 'until' right=General;
错误"此规则调用是递归调用图的一部分"出现在最后一行。
除了这个错误之外,即使是"正确"的语法部分也不能产生正确的结果。
我搜索了错误,但我无法理解这个问题,我仍然是初学者,所以我有2个问题:
我翻译语法正确吗?
如何解决这个左递归错误?
附加问题:学习材料(我已经阅读了官方文档)。
欢迎任何帮助。
默认的文本左保理方式应该有帮助
Relax:
root+=General+;
terminal BOOLEAN returns ecore::EBoolean:
'true'|'false'
;
General:
root=Rest =>({UntilOperator.left=current}'until' right=General)*;
Rest:
Primitive|ShallOperator|MayOperator|EventuallyOperator
;
Primitive:
BooleanValue | StringValue
;
BooleanValue:
value=BOOLEAN
;
StringValue:
value=STRING
;
ShallOperator:
'shall' elements=General;
MayOperator:
"may" action1=General 'or' action2=General;
EventuallyOperator:
'eventually' element=General;