XText是否具有覆盖操作以仅恢复规则右侧的一部分而无需为其命名

时间:2016-04-22 16:55:16

标签: xtext

在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 )* ';';

1 个答案:

答案 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
;