在ANTLR中定义标识符的规则

时间:2015-02-24 21:45:45

标签: java parsing compiler-construction antlr flex-lexer

我正在尝试在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被这种方式识别,而是我希望显示一个错误,因为标识符不能以字母以外的东西开头......我对这个编译器课程很新...这里应该做什么?

1 个答案:

答案 0 :(得分:1)

至少有趣的是,在C和C ++中,2n是无效的数字,而不是无效的标识符。这是因为标准的C词法分析器(或更确切地说,预处理器)需要来解释以数字开头的任何数字和字母序列作为“预处理器号”。稍后,尝试将预处理器编号(如果它仍然是预处理代码的一部分)重新解释为许多可能的数字语法之一。 2n不是,因此此时会生成错误。

预处理器编号比这更复杂,但这应该足以让您为您的问题提出一个简单的解决方案。