如何使用ANTLR区分保留字和变量?

时间:2012-03-15 19:18:23

标签: antlr antlr3

我正在使用ANTLR来标记一个简单的语法,需要区分一个ID:

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。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:8)

每当2(或更多)规则匹配相同数量的字符时,首先定义的规则将“赢”。因此,如果您在RESERVED_WORD之前定义ID,请执行以下操作:

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