2014-04-13 59 views
0

顯然,我無法通過在島上的文法退出帖子識別錯誤的帖子推斷出我的問題的答案,所以我希望有人可以給我一個關於如何正確地做到這一點。ANTLR 4中的簡單島語法:令牌識別錯誤

基本上,我試圖編寫一個包含proprocessor指令的語言。我將問題簡化爲一個非常簡單的例子。在我的例子lanuage,下面應該是有效的語法:

@@some preprocessor text 
PRINT some regular text 

當解析的代碼,我希望能夠識別記號「一些預處理文本」,「打印」和「一些普通文本「。

這是解析器語法:

parser grammar myp; 

root: (preprocessor | command)*; 
preprocessor: PREPROC PREPROCLINE; 
command: PRINT STRINGLINE; 

這是詞法分析器語法:

lexer grammar myl; 

PREPROC: '@@' -> pushMode(PREPROC_MODE); 
PRINT: 'PRINT' -> pushMode(STRING_MODE); 

WS: [ \t\r\n] -> skip; 

mode PREPROC_MODE; 

PREPROCLINE: (~[\r\n])*[\r\n]+ -> popMode; 

mode STRING_MODE; 

STRINGLINE: (~[\r\n])*[\r\n]+ -> popMode; 

當我解析上述示例代碼時,得到下面的錯誤:

line 1:2 extraneous input 'some preprocessor text\r\n' expecting PREPROCLINE line 2:5 token recognition error at: ' some regular text'

無論是否爲「WS:[\ t \ r \ n] - > skip;「是否包含在詞法分析器語法中。我猜如果我將引號引入到標記PREPROCLINE和STRINGLINE而不是行結尾,它將起作用(至少我在其他語言中成功實現了常規字符串)。但用這種特定的語言,我真的想要沒有引號的字符串。

任何有關爲何發生此錯誤或如何使用未加引號的字符串實現預處理器語言的幫助非常感謝。

感謝

回答

1

更新:首先,識別錯誤是因爲你的解析器需要引用詞法分析器記號。加入的選項阻止與解析器:

options { 
    tokenVocab=MyLexer; 
} 

其次,當你生成你的詞法分析器/解析器,要知道,一般的警告需要考慮並在繼續之前糾正。

最後,一旦添加了選項塊,這些都是可行的替代方案。

XXXX: (~[\r\n])*[\r\n]+ -> popMode; 

是有點清潔劑爲:

XXXX: .*? '\r'? '\n' -> popMode; 

不包括行尾,嘗試

XXXX: .*? ~[\r\n] -> popMode; 
+0

謝謝你,GRosenberg。我按照你的建議替換了令牌規則。在第一種情況下('。*?'\ r'?'\ n' - > popMode;')發生錯誤。在第二種情況下('。*?〜[\ r \ n] - > popMode;')我得到 '行1:2無關輸入'''預期PREPROCLINE 行2:5無關輸入''期待{, PREPROC,PRINT}' –