2012-08-30 34 views
7

這應該相當簡單。 我正在使用ANTLR處理詞法分析器語法,並希望將變量標識符的最大長度限制爲30個字符。我試圖用這條線來完成這個(以下正常的正則表達式 - 除了「」的事情 - 語法):ANTLR中的範圍量詞語法正則表達式

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");} 
    ; 

代碼生成沒有錯誤,但編譯生成的代碼,這是根本原因未能行:

0,29

顯然ANTLR走的是括號內文字的部分,將其放置在接受國家區域與打印線一起。我搜查了ANTLR網站,並且沒有找到相關表達的例子或參考。 這個表達式的語法應該是什麼?

回答

8

ANTLR不支持{m,n}量詞語法。 ANTLR看到你的量詞的{},並且不能告訴他們圍繞你的動作的{}

解決方法:

  1. 強制限制語義。讓它收集一個無限大小的ID,然後將其作爲動作代碼的一部分或稍後在編譯器中投訴/截斷。
  2. 手動創建量化規則。

這是限制ID來8.

SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_') 
     ; 
ID : ('a'..'z'|'A'..'Z') 
    (SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)? 
    ; 

個人手動規則的一個例子,我會去與語義溶液(#1)。目前幾乎沒有理由限制某種語言的標識符,甚至在違反這樣的規則時導致語法錯誤(早期中止編譯)的原因就更少了。

+0

謝謝你的幫助。 – user1634761

+1

如果ANTLR僅用於爲編程語言生成編譯器,那麼對於量詞可能幾乎沒有用處。但是用於驗證任何類型的結構化數據的語法(模式)肯定需要它們 - 信用卡號碼是16位數字,而不是13或25. ANTLR4書籍具有JSON和XML語法,但沒有基本的標記約束,將很難使用ANTLR語法作爲JSON Schema和XSD的抽象(獨立於編解碼器)版本。 – Dave

+0

「現在很少有理由限制某種語言的標識符」 - 這並不意味着沒有限制標識符的語言存在,人們也不需要爲它們編寫解析器。 –