我正在尝试在ANTLR中编写语法,识别ID和int文字的规则编写如下:
ID : Letter(Letter|Digit|'_')*;
TOK_INTLIT : [0-9]+ ;
//this is not the complete grammar btw
当输入为:
void main(){
int 2a;
}
问题是,词法分析器将 2 识别为int literal而将 a 识别为ID,这完全符合我编写的语法,但是我不希望2a被这种方式识别,而是我希望显示一个错误,因为标识符不能以字母以外的东西开头......我对这个编译器课程很新...这里应该做什么?
答案 0 :(得分:1)
至少有趣的是,在C和C ++中,2n
是无效的数字,而不是无效的标识符。这是因为标准的C词法分析器(或更确切地说,预处理器)需要来解释以数字开头的任何数字和字母序列作为“预处理器号”。稍后,尝试将预处理器编号(如果它仍然是预处理代码的一部分)重新解释为许多可能的数字语法之一。 2n
不是,因此此时会生成错误。
预处理器编号比这更复杂,但这应该足以让您为您的问题提出一个简单的解决方案。