XText 是否具有覆盖操作以仅恢复规则右侧的一部分而无需命名
Does XText have an override operation to recover only part of the right hand side of a rule without the need to name it
在 grako 中,可以使用 @:e
调用覆盖运算符,使完整规则的 AST 成为 e 的 AST。如果添加了多个项目,则该条目将转换为列表。覆盖运算符可用于仅恢复规则右侧的一部分而无需命名,然后添加语义操作以恢复有趣的部分。
Xtext有这样的东西吗?我知道 += 会生成一个列表,但我找不到不做类似 X+=stuff
的方法,其中 X 是 lhs
的名称
例如,如何将其翻译成 xtext
X1 =@:x{',' @:x}* ';'
虽然我原来的是
X1: <not sure> +=x (',' <not sure>+=x)* ';' ;
____EDIT ______
这个想法是,对于语句中的命名列表,即 nameList1 list1,nameList2 list2,nameList3 list3
我可以调用 stmt_list 规则,它将元素放入正确的列表中
'statements'
( 'nameList1' list1+=stmt_list
| 'nameList2' 列表 2+=stmt_list)*
'nameList3' 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 )* ';';
我不确定我是否理解你,但你可以使用所谓的分配操作来重写 AST。
这个一般用来写表达式https://typefox.io/parsing-expressions-with-xtext
您可以执行以下操作,但我不知道这是否是您想要执行的操作
Model:
(things+=Thing ";")*
;
Thing:
SimpleThing (({ThingList.things+=current}"," things+=SimpleThing) ("," things+=SimpleThing)* )?
;
SimpleThing:
name=ID
;
在 grako 中,可以使用 @:e
调用覆盖运算符,使完整规则的 AST 成为 e 的 AST。如果添加了多个项目,则该条目将转换为列表。覆盖运算符可用于仅恢复规则右侧的一部分而无需命名,然后添加语义操作以恢复有趣的部分。
Xtext有这样的东西吗?我知道 += 会生成一个列表,但我找不到不做类似 X+=stuff
的方法,其中 X 是 lhs
例如,如何将其翻译成 xtext
X1 =@:x{',' @:x}* ';'
虽然我原来的是
X1: <not sure> +=x (',' <not sure>+=x)* ';' ;
____EDIT ______ 这个想法是,对于语句中的命名列表,即 nameList1 list1,nameList2 list2,nameList3 list3
我可以调用 stmt_list 规则,它将元素放入正确的列表中 'statements' ( 'nameList1' list1+=stmt_list | 'nameList2' 列表 2+=stmt_list)* 'nameList3' 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 )* ';';
我不确定我是否理解你,但你可以使用所谓的分配操作来重写 AST。
这个一般用来写表达式https://typefox.io/parsing-expressions-with-xtext
您可以执行以下操作,但我不知道这是否是您想要执行的操作
Model:
(things+=Thing ";")*
;
Thing:
SimpleThing (({ThingList.things+=current}"," things+=SimpleThing) ("," things+=SimpleThing)* )?
;
SimpleThing:
name=ID
;