在编译器中定义除保留字之外的变量名
我正在尝试使用 JavaCC 为 Java 的子集做一个词法分析器。变量名可以是字母、数字和_的任意组合,以字母开头。我只有一个问题,保留字(例如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"] >
}
TOK_ID 是变量名称的规则。
谢谢你,如果有什么不清楚的地方可以问我。
I am trying to do a lexer for a subset of Java with JavaCC. And a variable name can be any combination of letter, digit and _, beginning with a letter. I have only one problem, reserved words (such as int
, new
, ...) can not be used as a variable name and I was wondering how to declare this. Right now I have this where the reserved words are declared first, and then the rule for variable names, is it enought and then it will be to the parser to deal with it ?
//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"] >
}
TOK_ID is the rule for variable name.
Thank you and ask me if something is not clear.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
JavaCC 词法分析器选择获得最长匹配的第一个定义,因此您的定义应该足够了。
JavaCC TokenManager 教程 中记录了此行为。 JavaCC FAQ 对此进行了解释此处。
The JavaCC lexer chooses the first definition that gains the longest match, so your definition should be sufficient.
This behavior is documented in the JavaCC TokenManager Tutorial. The JavaCC FAQ explains it here.