2014-01-06 98 views
1

我已經寫了下面的語法XTEXT交叉引用

Model: 
package = PackageDec? 
greetings+=Greeting* 
usage+=Usage* ; 

PackageDec: 
    'package' name=QualifiedName ; 

Greeting: 
'greet' name=ID '{' ops += Operation* '}' ; 

Operation: 
'op' name=ID ('(' ')' '{' '}')? ; 

QualifiedName: 
ID ('.' ID)*; 

Usage: 
    'use'; 

通過以上我可以下面的腳本編寫。

package p1.p2 
    greet G1 {op f1 op f2 } 

現在我需要寫的東西是這樣的:

package p1.p2 
    greet G1 {op f1 op f2 op f3} 
    use p1.p2.G1.f1 
    use p1.p2.G1 
    use p1.p2.G1.f3 

爲了支持我改變了使用規則是這樣

Usage: 
'use' head=[Greet|QualifiedName] =>('.' tail=[Operation])? 

然而,當我產生XTEXT文物是抱怨多備擇方案。

請讓我知道如何爲此寫出正確的語法規則。

回答

1

這是因爲QualifiedName消耗點(.)。添加('.' ...)?提供了兩種選擇。考慮輸入

a.b.c 

如果我理解你的使用謂詞=>權的意圖這可以被解析爲

  • head="a"tail = "b.c"
  • head="a.b"tail = "c"

,比你只需要更換

head=[Greet|QualifiedName] 

head=[Greet] 

在這種情況下,然而,你將無法用點解析引用。

作爲一種解決方案,我建議用其他字符替換你的點。例如冒號:

Usage: 
'use' head=[Greet|QualifiedName] (':' tail=[Operation])?