2012-03-15 16 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