在grako中,可以使用@:e
來調用覆蓋運算符,這就使得完整規則的AST成爲AST前面。如果添加了多個項目,則會將該項目轉換爲列表。重寫操作符對於僅恢復規則右側的一部分而無需命名它是有用的,然後添加語義操作來恢復有趣的部分。XText是否具有覆蓋操作來恢復規則的右側的一部分而不需要命名
Xtext是否有類似的東西?我知道+ =會導致一個名單,但我不能找到一個辦法不這樣做X+=stuff
,其中X是LHS
例如的名字,怎麼會一個翻譯這XTEXT
X1 [email protected]:x{',' @:x}* ';'
我原來雖然是
X1: <not sure> +=x (',' <not sure>+=x)* ';' ;
____EDIT ______ 的想法是永遠命名列表中的語句,即nameList1列表1,nameList2列表2,nameList3項目list3
我可以調用stmt_list規則,這會將元素放入正確的列表中 '語句' ('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)* ';';
添加編輯我的問題,以更好地解釋什麼。 我有兩個問題關於你當前的答案 你在哪裏定義的東西。 是東西可以包含一個東西還是一個簡單的東西,而東西也可以包含一個簡單的東西? 爲什麼things.list有.things? – Quantico
我還是不明白你的要求是什麼。你能用一個模型和你想創建的ast來解釋嗎?在我的情況下,事物可以是簡單事物或事物列表,它是簡單事物的列表。 (如果你寫的是逗號,它會自動變成一個列表,而左手邊(又名'''current'''被指定爲該列表的成員)。因爲在xtext中沒有像所有東西都是列表或字典(使用來自grako doc的術語)的東西,但一切都是字典的可能性(類型)值可以是一個列表,我必須將ThingList引入爲顯式命名類型 –
但你在哪裏定義ThingList? 另外,我會嘗試再次解釋我有'statments',它是一個關鍵詞,它可以是幾個列表的列表,例如 type1有一個stmt1列表。這些列表中的每個列表都有stmt_list,stmt_list中的 我試圖將X放入stmt_list – Quantico