Compiler construction 在编译器中定义除reservred worsd之外的变量名

Compiler construction 在编译器中定义除reservred worsd之外的变量名,compiler-construction,lexer,javacc,Compiler Construction,Lexer,Javacc,我试图用JavaCC为Java的一个子集做一个lexer。变量名可以是字母、数字和_的任意组合,以字母开头。我只有一个问题,保留字(如int,new,…)不能用作变量名,我想知道如何声明它。现在我有一个先声明保留字,然后声明变量名规则的地方,它是否足够,然后由解析器来处理它 //Reserved words TOKEN:{ < TOK_BOOLEAN : "boolean" > | < TOK_BREAK : "break" > | < TOK_CLAS

我试图用JavaCC为Java的一个子集做一个lexer。变量名可以是字母、数字和_的任意组合,以字母开头。我只有一个问题,保留字(如
int
new
,…)不能用作变量名,我想知道如何声明它。现在我有一个先声明保留字,然后声明变量名规则的地方,它是否足够,然后由解析器来处理它

//Reserved words
TOKEN:{
  < TOK_BOOLEAN : "boolean" > |
  < TOK_BREAK : "break" > |
  < TOK_CLASS : "class" >
}

TOKEN:{
  < TOK_ID : <LETTER> (<LETTER>|<DIGIT>|"_")+ > |
  < #DIGIT : ["0"-"9"] > |
  < #LETTER : ["a"-"z"] | ["A"-"Z"] >
}
//保留字
代币:{
|
|

}
代币:{
|
<#数字:[“0”-“9”]>|
<#字母:[“a”-“z”]|[a”-“z”]>
}
TOK_ID是变量名的规则


谢谢您,如果有什么不清楚的地方,请询问我。

JavaCC lexer选择第一个获得最长匹配的定义,因此您的定义应该足够了

此行为记录在中。这就是原因