2012-02-08 54 views
1

我想解析語句由EOL分隔的語言。我在詞法分析器語法(從一個示例中的文檔複製)嘗試這樣做:ANTLR將多個EOL作爲一個整體來對待?

EOL : ('\r'? '\n')+ ; // any number of consecutive linefeeds counts as a single EOL 

然後在分析器語法中使用這樣的:

stmt_sequence : (stmt EOL)* ; 

解析器拒絕代碼與由一個或分隔的語句更多的空白行。

然而,這是成功的:

EOL : '\r'? '\n' ; 

stmt_sequence : (stmt EOL+)* ; 

我是一個新手ANTLR。似乎兩者都應該工作。是否有關於我不明白的貪婪/非理性詞法分析掃描?

我試過3.2和3.4;我在Eclipse中運行ANTLR IDE Indigo on OS X 10.6。

謝謝。

回答

0

錯誤不在原文中;但在輸入數據。我使用的編輯器(在Eclipse中)在EOL後自動插入標籤,所以我的「空白行」並不是真的空白。

我修改語法如下:

fragment SPACE: ' ' | '\t'; 

EOL : ('\r'? '\n' SPACE*)+; 

這種語法按預期工作。

這裏的教訓是,你必須小心空格。詞法分析器可能會在分析器看不到的輸入中看到空白(因爲它已經發送到隱藏通道)。