我正在为 C/C++ 源代码开发词法分析器语法。语法的目标是打击大学学生之间的剽窃。
为了提高语法的有效性,我希望 ANTLR 为学生可以增加变量的 4(?)不同方式创建相同的标记:
i++
++i
i += 1
(i = i + 1) [I doubt that this can be solved with ANTLR]
这些表达式中的每一个都应导致令牌 INCREMENT。
到目前为止我想出的:(这里只复制了语法的必要部分)
options {
language = CSharp3;
filter = true;
k = 2;
}
INCREMENT : IDENTIFIER (PLUSPLUS | ADDEQUAL '1') | PLUSPLUS IDENTIFIER ;
IDENTIFIER
: LETTER (LETTER | DIGIT)*;
/*
* covers both decimal and hex integer literals
*/
INTEGER_LITERAL :
DIGIT+ | '0x' HEX_DIGIT+;
ADDEQUAL : '+=';
PLUSPLUS : '++';
fragment
LETTER : 'A'..'Z' | 'a'..'z';
fragment
HEX_DIGIT : DIGIT | 'a'..'f' | 'A'..'F';
fragment
DIGIT : '0'..'9';
测试此语法以i += 1
获取令牌序列中的结果,IDENTIFIER ADDEQUAL INTEGER_LITERAL
而不是INCREMENT
.
这是为什么?据我了解,规则的优先级是从上到下加上INCREMENT
“更大”的规则。
我需要对语法进行哪些调整才能获得预期的结果?