【问题标题】:ANTLR behaviour with conflicting tokens具有冲突令牌的 ANTLR 行为
【发布时间】:2016-01-04 13:18:50
【问题描述】:

在令牌冲突的情况下如何定义 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 令牌,而不是 FOO ID 或其他东西。

【问题讨论】:

    标签: antlr antlr4 lexer


    【解决方案1】:

    以下逻辑适用:

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

    考虑到这一点,输入 "1""2"、...、"6" 被标记为 INT_STAGEINT_STAGEINT 匹配相同数量的字符,但 @先定义987654327@。

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

    有人告诉我这是识别所有标记的“正确”顺序:在读取“傻瓜”时,词法分析器会找到一个 FOOL 标记,而不是 FOO ID 或其他东西。

    没错。

    【讨论】:

    • 我还有一个问题 - 为什么 TEST_TOKEN : 'Stage' ('1'..'6'); ID : ('a'..'z'|'A'..'Z'|''|'%') ('a'..'z'|'A'..'Z'| '0'..'9'|''|'%')*;不工作 - 没有找到 TEST_TOKEN ?
    • @user1607242,那么请随时提出新问题。这些评论框不适合问答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多