我正在为 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
,而不是 INCRMENT
。
这是为什么呢?
根据我的理解,规则的优先级是从上到下,加上 INCRMENT
是“更大”的规则。
我需要对语法进行哪些调整才能获得所需的结果?
最佳答案
testing this grammar for
i += 1
results in the token sequenceIDENTIFIER ADDEQUAL INTEGER_LITERAL
instead ofINCREMENT
.Why is that?
因为 "i += 1"
包含您在 INCRMENT
规则中未考虑到的空格。
What adjustments to the grammar need I make to get the desired result?
考虑空格(可能还有换行符)。
但是,单独创建词法分析器似乎并不是解决问题的方法。在我看来,你确实需要一个解析器。并且选项 k = 2;
设置解析器规则的前瞻,而不是词法分析器规则:因此,如果您坚持仅进行词法分析,您最好将其删除。
关于c# - 为所有可能的增量表达式创建相同的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12098770/