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

标签 c# antlr grammar antlr3

我正在为 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 sequence IDENTIFIER ADDEQUAL INTEGER_LITERAL instead of INCREMENT.

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/

相关文章:

C++、ANTLR 和 VECTORS

antlr - 如何在antlr中找到 token 的长度?

parsing - 是否可以将这个文法转化为LR(1)文法?

c# - 是否可以在xamarin表单中访问从第一页到第二页的进度条?

c# - 我可以使用 Node.js 调用 C# 方法吗?

ANTLR 制作用于解析插入/更新/删除 SQL 查询的语法

c - 如何阅读这个语法? (C 程序设计语言 2e)

compiler-construction - Haskell - 如何最好地表示编程语言的语法?

c# - 使模拟在更改时触发 PropertyChanged

c# - 不能在数据绑定(bind) datagridview 控件上设置列计数属性 c#