2012-02-15 105 views
1

假設我有一個語法如果我給它像這需要全局變量,和cANTLR語法不是回溯

program: (declaration)* (procedure)*; 
declaration: typespec identifier ';'; 
procedure: typespec identifier '(' ')' ';'; 
typespec: 'char' | 'int'; 
identifier: ('a' .. 'z' | 'A' .. 'Z') ('A' - 'Z' | 'a' .. 'z' | '0' .. '9' | '_')*; 

一些變化的一些方法聲明的護理:

int MAX; 
char proc(); 

語法讀取int MAX;正確的,但它然後希望將聲明規則也應用到第二行,並且它到達時失敗(在這一點上,我期望它回溯並應用程序的下一個規則。有人請告訴我爲什麼這不會發生?

回答

1
您是否發佈了所有的語法?我無法將它編譯爲您發佈的內容......但是我發佈了您發佈的內容以使其與您的示例相匹配:

program: (declaration)* (procedure)*; 
statement: TYPE_SPEC IDENT ; 
declaration: statement ';'; 
procedure: statement '(' ')' ';'; 

TYPE_SPEC 
    : 'char' | 'int'; 

IDENT 
    : ('a' .. 'z' | 'A' .. 'Z') ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' | '_')*; 

WHITESPACE 
    : ('\r' | '\n' | '\r\n' | ' ' | '\t') {$channel=HIDDEN;} 
    ; 

我建議你製作詞法分析器規則(大寫字母的規則),以便讓你的令牌匹配,而不是使它們成爲你的分析規則的一部分 - 我已經爲你做了其中的一些,你可以看到。

+0

這不是整個語法,我只是隔離了一個例子。我試圖運行你的語法,我得到了以下內容(<語法SimpleC>(程序NoViableAltException(6 @ [()* loopback 2:10:(declaration)*])) – user692734 2012-02-15 00:48:50

+0

你測試時輸入了什麼? – 2012-02-15 00:51:37

+0

上面那個。問題是我和解說員一起跑了,我得到了那個錯誤。如果我用Tool創建實際的詞法分析器和解析器,它就可以工作。我覺得我一整天都被譯員愚弄了:| – user692734 2012-02-15 00:54:33