2012-03-15 47 views
4

我使用ANTLR來標記語法簡單,並且需要一個ID來區分:如何區分使用ANTLR的保留字和變量?

ID    : LETTER (LETTER | DIGIT)* ; 

fragment DIGIT : '0'..'9' ; 
fragment LETTER : 'a'..'z' | 'A'..'Z' ; 

和RESERVED_WORD:

RESERVED_WORD : 'class' | 'public' | 'static' | 'extends' | 'void' | 'int' | 'boolean' | 'if' | 'else' | 'while' | 'return' | 'null' | 'true' | 'false' | 'this' | 'new' | 'String' ; 

說我輸入運行詞法分析器:

class abc 

我收到「class」和「abc」的兩個ID令牌,而我希望「class」被識別爲RESERVED_WORD。我怎樣才能做到這一點?

回答

6

每當2個(或更多)規則匹配相同數量的字符時,首先定義的規則將「贏」。所以,如果你ID之前定義RESERVED_WORD,像這樣:

RESERVED_WORD : 'class' | 'public' | 'static' | 'extends' | 'void' | 'int' | 'boolean' | 'if' | 'else' | 'while' | 'return' | 'null' | 'true' | 'false' | 'this' | 'new' | 'String' ; 

ID    : LETTER (LETTER | DIGIT)* ; 

fragment DIGIT : '0'..'9' ; 
fragment LETTER : 'a'..'z' | 'A'..'Z' ; 

輸入"class"將被標記化作爲RESERVED_WORD

注意,它不會使一個很有意義創建匹配任何保留字單個標記:通常是這樣完成的:

// ... 

NULL : 'null'; 
TRUE : 'true'; 
FALSE : 'false; 

// ... 

ID    : LETTER (LETTER | DIGIT)* ; 

fragment DIGIT : '0'..'9' ; 
fragment LETTER : 'a'..'z' | 'A'..'Z' ; 

現在"false"將成爲FALSE令牌,並"falser"一個ID