C# 为所有可能的增量表达式创建相同的标记
我正在为C/C++源代码开发一个lexer语法。语法的目标是打击大学学生之间的剽窃行为 为了提高语法的有效性,我希望ANTLR为学生增加变量的4种不同方式创建相同的标记: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
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';