在grako中,可以使用@:e
来调用覆盖运算符,使得完整规则的AST为e的AST。如果添加了多个项目,则该条目将转换为列表。覆盖操作符仅用于恢复规则右侧的一部分而无需命名,然后添加语义操作以恢复有趣的部分。
Xtext有这样的东西吗?我知道+ =会产生一个列表,但我找不到像X+=stuff
那样的方法,其中X是lhs的名字
例如,如何将其转换为xtext
X1 =@:x{',' @:x}* ';'
我原来的是
X1: <not sure> +=x (',' <not sure>+=x)* ';' ;
____编辑______ 这个想法是在语句中命名列表,即nameList1 list1,nameList2 list2,nameList3 list3
我可以调用stmt_list规则,将元素放入正确的列表中 &#39;报表&#39; (&#39; nameList1&#39; list1 + = stmt_list | &#39; nameList2&#39; list2中+ = stmt_list)* &#39; nameList3&#39;项目list3 +:stmt_list
stmt_list:
stmt_list+=stmt_def (',' stmt_list+=stmt_def )* ';';
所以这里stmt_list + =应该匹配调用它的正确列表。
因此,当我解析规则后,我会写我的语言 我可以写这样的东西
nameList1 foo(a, b, c, d)
nameList1 bar(e);
nameList2 zap();
nameList3 zip();
其中a,b,c,d,e将进入右侧命名列表
所以基本上,它应该是这样的,但不是每次在每种类型的命名列表中重写所有列表结构,我有一个共享规则
( 'nameList1' list1+=stmt_def (',' list1+=stmt_def )* ';';
| 'nameList2' list2+=stmt_def (',' list2+=stmt_def )* ';';
'nameList3' list3+=stmt_def (',' list3+=stmt_def )* ';';
答案 0 :(得分:0)
我不确定我是否理解你,但你可以使用所谓的指定动作进行一种AST重写。
这通常用于编写表达式https://typefox.io/parsing-expressions-with-xtext
你可以做类似以下的事情,但我不知道这是否是你想做的事情
Model:
(things+=Thing ";")*
;
Thing:
SimpleThing (({ThingList.things+=current}"," things+=SimpleThing) ("," things+=SimpleThing)* )?
;
SimpleThing:
name=ID
;