在 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"
, ..., "6"
被标记为INT_STAGE
:INT_STAGE
和 INT
都匹配相同数量的字符,但先定义 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/