2

我正在为 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“更大”的规则。

我需要对语法进行哪些调整才能获得预期的结果?

4

1 回答 1

2

测试此语法以i += 1获取令牌序列中的结果,IDENTIFIER ADDEQUAL INTEGER_LITERAL而不是INCREMENT.

这是为什么?

因为"i += 1"包含您在规则中未考虑的空格INCREMENT

我需要对语法进行哪些调整才能获得预期的结果?

考虑空格(可能还有换行符)。

然而,单独创建一个词法分析器似乎不是这里的方法。你真的需要一个解析器,IMO。并且选项k = 2;集会提前查看解析器规则,而不是词法分析器规则:因此,如果您只坚持词法分析,您最好将其删除。

于 2012-08-23T19:36:45.863 回答