2016-04-22 32 views
1

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

回答

0

我不確定我是否理解你,但你可以使用所謂的分配動作來進行一種AST重寫。

這是後容易用來編寫表達式https://typefox.io/parsing-expressions-with-xtext

你可以做類似下面的,但我不知道這是否是你想要做

Model: 
    (things+=Thing ";")* 
; 

Thing: 
    SimpleThing (({ThingList.things+=current}"," things+=SimpleThing) ("," things+=SimpleThing)*)? 
; 

SimpleThing: 
    name=ID 
; 
+0

添加編輯我的問題,以更好地解釋什麼。 我有兩個問題關於你當前的答案 你在哪裏定義的東西。 是東西可以包含一個東西還是一個簡單的東西,而東西也可以包含一個簡單的東西? 爲什麼things.list有.things? – Quantico

+0

我還是不明白你的要求是什麼。你能用一個模型和你想創建的ast來解釋嗎?在我的情況下,事物可以是簡單事物或事物列表,它是簡單事物的列表。 (如果你寫的是逗號,它會自動變成一個列表,而左手邊(又名'''current'''被指定爲該列表的成員)。因爲在xtext中沒有像所有東西都是列表或字典(使用來自grako doc的術語)的東西,但一切都是字典的可能性(類型)值可以是一個列表,我必須將ThingList引入爲顯式命名類型 –

+0

但你在哪裏定義ThingList? 另外,我會嘗試再次解釋我有'statments',它是一個關鍵詞,它可以是幾個列表的列表,例如 type1有一個stmt1列表。這些列表中的每個列表都有stmt_list,stmt_list中的 我試圖將X放入stmt_list – Quantico