2011-04-06 91 views
0

對於解析測試文件,我想讓標識符以數字開頭。ANTLR可以根據以下字符區分詞法規則嗎?

我的原則是:

ID : ('a'..'z' | 'A'..'Z' | '0'..'9' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '&' | '/' | '-' | '.')* 
; 

但是我也需要在這個文件中匹配的數字爲好。我的規則是:

INT : '0'..'9'+ 
; 

顯然Antlr不會讓我這樣做,因爲INT永遠不會匹配。

有沒有辦法讓這個?具體而言,我想匹配一個INTEGER,後面跟一個沒有空格的ID作爲一個ID,並且只有在後面跟着一個空格時才創建一個INT令牌。

例如:

3BOB -> [ID with text "3BOB"] 
3 BOB -> [INT with text "3"] [ID with text "BOB"] 

回答

2

只要改變在其中ID和INT令牌被定義的順序。

grammar qqq; 

// Parser's rules. 

root: 
    (integer|identifier)+ 
; 

integer: 
    INT {System.out.println("INT with text '"+$INT.text+"'.");} 
; 

identifier: 
    ID {System.out.println("ID with text '"+$ID.text+"'.");} 
; 

// Lexer's tokens. 

INT: '0'..'9'+ 
; 

ID: ('a'..'z' | 'A'..'Z' | '0'..'9' | '_') 
     ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '&' | '/' | '-' | '.')* 
; 

WS: ' ' {skip();} 
; 

UNPREDICTED_TOKEN 
: 
    ~(' ') {System.out.println("Unpredicted token.");} 
; 

在其中令牌在語法中定義的順序是顯著:在殼體的字符串可以歸因於多個令牌被歸因於其中之一首先被定義。在你的情況下,如果你想在INT仍然符合ID時把整數'123'歸爲INT - 首先把INT定義。

Antlr的令牌匹配是貪婪的,所以它不會停留在'123BOB'中的'123'上,而是會一直持續到令牌的非匹配字符串並且匹配上一個令牌。所以你的標識符現在可以以數字開頭。

關於令牌訂單的評論也可以在this article by Mark Volkmann中找到。

+0

我不清楚這將如何幫助。這是如何讓我的標識符以數字開頭的? – chollida 2011-05-04 15:05:23

+0

@chollida,我試着做出一個更好的解釋,看看它是否有幫助。 – ilyaigpetrov 2011-05-05 21:12:55

+0

感謝您的澄清。 – chollida 2011-05-20 14:44:27

1

以下規則中的微小變化應該做的伎倆:

ID : ('0'..'9')* // optional numbers 
     ('a'..'z' | 'A'..'Z' | '_' | '&' | '/' | '-' | '.') // followed by mandatory character which is not a number 
     ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '&' | '/' | '-' | '.')* // followed by more stuff (including numbers) 
; 

INT : '0'..'9'+ // a number 
; 

你乾脆讓讓你的標識符開始與一個可選的號碼,並進行以下字符強制性的。

+0

感謝您的回答 – chollida 2011-05-20 14:44:15

相關問題