我正在使用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。我怎么能做到这一点?
答案 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
。