2014-02-25 54 views
3

我的.g4文件中有以下代碼。爲什麼在爲頻道分配標記時出現錯誤?

@lexer::members{ 
public static final int WHITESPACE = 1; 
public static final int COMMENTS = 2; 
} 


WS : (' '|'\t'|'\f')+ -> channel(WHITESPACE) 
    ; 

COMMENT 
    : '//' ~('\n'|'\r')* -> channel(COMMENTS) 
    ; 

LINE_COMMENT 
    : '/*' .*? '*/' NEWLINE? -> channel(WHITESPACE) 
    ; 

我發現了以下錯誤:

警告(155):Shiro.g4:239:34:規則 'WS' 包含具有一個無法識別的恆定值的詞法分析器命令;詞法解釋器可能產生不正確的輸出

警告(155):Shiro.g4:243:38:規則'COMMENT'包含具有無法識別的常量值的詞法分析命令;詞法分析器可能產生不正確的輸出

警告(155):Shiro.g4:247:42:規則'LINE_COMMENT'包含帶無法識別的恆定值的詞法分析命令;詞法分析器可能產生不正確的輸出

這是Terrence在ANTLR4書中描述的將令牌放在不同通道上的技術。爲什麼我會收到這些警告?我應該擔心嗎?

回答

3

您沒有收到錯誤;這是一個警告。特別是,它是UNKNOWN_LEXER_CONSTANT警告,這是ANTLR 4.2的新功能。

編譯器警告155

規則「規則」包含具有一個無法識別的恆定值的詞法分析器命令;詞法分析器可能產生不正確的輸出

詞法分析器規則包含標準詞法分析器命令,但命令的常量值參數是無法識別的字符串。因此,詞法分析器命令將被翻譯爲自定義詞法分析器操作,從而阻止命令在某些解釋模式下執行。詞法分析器的輸出可能與生成的詞法分析器的輸出不匹配。

以下規則會產生此警告。

@members { 
public static final int CUSTOM = HIDDEN + 1; 
} 

X : 'foo' -> channel(HIDDEN);   // ok 
Y : 'bar' -> channel(CUSTOM);   // warning 155 
+0

你是對的。這是我的錯誤。我應該叫它警告。什麼是「詞法解釋器的輸出可能與生成的詞法分析器的輸出不匹配」。意思? –

+0

@ 280Z28如果我明確設置了'public static final int CUSTOM = 2;',我可以忽略這個警告嗎? – petrbel

+1

@petrbel不,在這種情況下,ANTLR代碼生成器在代碼生成時仍然不知道常量的值,這意味着警告仍然有效。當前抑制警告的唯一方法是在名爲'CUSTOM'的詞法分析器中定義一個標記(在'tokens {}'塊中)或一個模式。在這些情況下,您無法控制分配給該常量的數字值。 –