2013-01-16 39 views
0

我試圖在Xtext中實現一個簡單的語法到識別由ID和函數調用組成的函數調用(Java類語法)。即無論由ID和/或函數組成的鏈,總是以函數結尾。由於遞歸規則調用,Xtext規則具有非LL(*)決策

示例源代碼:a.b(a).c(b()).b.d();

我寫了下面的Xtext語法:

Test: Chain ';'; 
Chain: (IdOrFunc '.')* ID Func; 
IdOrFunc: ID Func?; 
Func: '(' IdOrFunc? ')'; 

不過,我得到試圖生成通過的Xtext語言代碼時出現以下錯誤:

[fatal] rule ruleChain has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option. 

如果我將Chain規則中的ID替換爲'xyz',即語法開始工作。 e。

Chain: (IdOrFunc '.')* 'xyz' Func;` 

我在做什麼錯?

回答

0

又是怎麼回事:

Test: Chain ';'; 
Chain: IdOrFunc ('.' ID Func)*; 
IdOrFunc: ID Func?; 
Func: '(' IdOrFunc? ')'; 

我不能完全肯定它分析完全一樣的表情,但是,因爲我剛在它快速瀏覽(左遞歸是在(IdOrFund」。 ')*聲明)。

+0

你的語法做了不同的事情 - 它檢測到例如: a();一個;一個()灣;意圖是限定名稱以函數結尾,即a.b()。c.d()。 –