В grako можно использовать @:e
для вызова оператора переопределения, который делает AST для всего правила AST для e. Если добавлено более одного элемента, запись преобразуется в список. Оператор переопределения полезен для восстановления только части правой части правила без необходимости называть ее, а затем добавления семантического действия для восстановления интересующей части.
Есть ли в 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, которое поместит элементы в правильный список 'операторов' ('nameList1' list1 + = stmt_list | 'nameList2' list2 + = 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 )* ';';