C# 为所有可能的增量表达式创建相同的标记

C# 为所有可能的增量表达式创建相同的标记,c#,antlr,grammar,antlr3,C#,Antlr,Grammar,Antlr3,我正在为C/C++源代码开发一个lexer语法。语法的目标是打击大学学生之间的剽窃行为 为了提高语法的有效性,我希望ANTLR为学生增加变量的4种不同方式创建相同的标记: i++ ++i i += 1 (i = i + 1) [I doubt that this can be solved with ANTLR] 这些表达式中的每一个都应导致标记增量 到目前为止,我的想法是:(这里只复制了语法的必要部分) 测试该语法的i+=1将导致令牌序列标识符ADDEQUAL INTEGER\u LITER

我正在为C/C++源代码开发一个lexer语法。语法的目标是打击大学学生之间的剽窃行为

为了提高语法的有效性,我希望ANTLR为学生增加变量的4种不同方式创建相同的标记:

i++
++i
i += 1
(i = i + 1) [I doubt that this can be solved with ANTLR]
这些表达式中的每一个都应导致标记增量

到目前为止,我的想法是:(这里只复制了语法的必要部分)

测试该语法的
i+=1
将导致令牌序列
标识符ADDEQUAL INTEGER\u LITERAL
而不是
增量

为什么呢? 根据我的理解,规则的优先级是从上到下加上
INCREMENT
是“更大”的规则

我需要对语法做哪些调整才能得到想要的结果

测试该语法的
i+=1
将导致令牌序列
标识符ADDEQUAL INTEGER\u LITERAL
而不是
增量

为什么呢

因为
“i+=1”
包含您在
增量规则中未考虑的空格

我需要对语法做哪些调整才能得到想要的结果

说明空格(可能还有换行符)


然而,单独创建lexer似乎并不是解决问题的方法。你真的需要一个解析器,IMO.和选项
k=2设置语法分析器规则,而不是词法分析器规则:因此,如果您坚持只使用词法分析,您最好将其删除。

holy sh*t。非常感谢。这真是难以置信的愚蠢,可能是今天辞职的标志
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';