2015-11-04 56 views
1

我正在嘗試爲一種語言創建xtext語法,該語言具有可根據其結構分組在一起的多行。在生成語法時,我無法擺脫語法警告。作爲一個例子我已經把以下語法具有相同的問題:xtext分組語法警告

Groups: groups += Group*; 

Group: content = (As | Bs); 

As: 'a'+; 

Bs: 'b'+; 

例如,對於輸入「AAAA」它曖昧如果一個組的4層a的或兩個基團的2的(或其他選擇)。

我只想讓它成爲4組的一組。但是沒有地方放置'=>'謂詞?

有誰知道如何重構這個語法,以消除歧義?

回答

1

是的,你的語法是不明確的。你的paser可以用不同的方式匹配'aaaa'。爲了解決這個問題,你可以添加一個語法謂詞如下:

Groups: groups += Group*; 

Group: content = (As | Bs); 

As: =>'a'+; 

Bs: =>'b'+; 
+0

太棒了,謝謝,我不確定如何做謂詞 –

1

添加語法謂詞不能解決含糊你的語法。問題是由詞法分析器提供的標記流不包含任何一個組是否完整的信息。在你的conrete案件中有規則As: 'a'+;。它描述了至少一個或多個字母列表a。在這些a之間的每個upcomming a被消耗,但所謂的Whitespaces(例如,簡單的空白,標籤或換行符)將被忽略。解析器將繼續將下一個正在使用的a置於此規則中,直到令牌流中會出現另一個字母(b)。

您的語法問題在於,您的文法中可能會分析多於一個a的列表。例如:

a 
aa 
aaa 

是你的語法有效輸入,但是解析器不知道第一As規則在第一行中的一個之後結束。這是因爲換行符是一個被忽略的空白字符!對於解析器,這三個As塊的輸入看起來等於一個Asaaaaaa

引入句法謂詞並不能解決這個問題!對於我的意見,你的問題只有兩個解決方案。

  1. 提供一些'語法糖'例如通過用分號或任何其他符號關閉As規則。該規則是這樣的:As: 'a'+ ';';
  2. 請小心,防止公司的一個詞之間的空格,並確保至少有一個空格一個單詞後occure:

    Group: content = (As | Bs) WS+; 
    As hidden(): 'a'+; 
    Bs hidden(): 'b'+; 
    

    然後,你的語法進行編譯和行爲像打算一樣。