具有冲突标记的 ANTLR 行为

标签 antlr antlr4 lexer

在 token 冲突的情况下,ANTLR 词法分析器的行为如何定义? 让我解释一下“冲突”标记的含义。 例如,假设定义了以下内容:

INT_STAGE       :   '1'..'6';
INT             :   '0'..'9'+;

这里存在冲突,因为在读取一系列数字后,词法分析器将不知道是否有一个 INT 或多个 INT_STAGE 标记(或两者的不同组合)。 经过测试,看起来如果 INT 是在 INT_STAGE 之后定义的,那么词法分析器会更愿意找到 INT_STAGE,但也许不是 INT 呢?否则,将永远找不到 INT_STAGE。

另一个例子是:

FOOL: ' fool'
FOO: 'foo'
ID              :   ('a'..'z'|'A'..'Z'|'_'|'%') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'%')*;

我被告知这是识别所有标记的“正确”顺序: 在读取“fool”时,词法分析器将找到一个 FOOL 标记,而不是 FOO ID 或其他内容。

最佳答案

以下逻辑适用:

  1. 词法分析器匹配尽可能多的字符
  2. 如果应用规则 1 后,有 2 个或更多规则匹配相同数量的字符,则第一个定义的规则将“获胜”

考虑到这一点,输入 "1", "2", ..., "6" 被标记为INT_STAGE:INT_STAGEINT 都匹配相同数量的字符,但先定义 INT_STAGE

输入“12”被标记为INT,因为它匹配最多的字符。

I was told that this is the "right" order to recognize all the tokens: while reading "fool" the lexer will find one FOOL token and not FOO ID or something else.

这是正确的。

关于具有冲突标记的 ANTLR 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592107/

相关文章:

ANTLR "unexpected end of subtree"

java - Antlr4 - 获取函数的参数 Java

antlr4 - 如何在我的语法中执行操作优先级 (+ * -/)?

Python 解析器 ply 匹配错误的正则表达式

compiler-construction - %option noinput nounput : what are they for?

Antlr4 Listener 找不到子项

antlr - 如何解决这种有歧义的语法?

python - ANTLR4 + Python 从字符串而不是路径解析

java - 理解 Antlr4 中的上下文数据结构

parsing - 使用 Free Monad 实现词法分析器