【问题标题】:ANTLR LEXER RULE to have two rules, one will accept every characters including symbols and another will accept only charactersANTLR LEXER RULE 有两个规则,一个将接受包括符号在内的所有字符,另一个将只接受字符
【发布时间】:2017-03-29 16:58:23
【问题描述】:

在 ANTLR LEXER RULE 中是否有可能有两个规则,一个将接受包括所有符号在内的每个字符(如 ()_ 等),另一个将只接受字符 a 到 @987654325 @?

如下所示:

String: ('a'..'z'|'A'..'Z')*;
EVERYTHING:(.)*;   

【问题讨论】:

    标签: antlr grammar antlr3 lexical-analysis antlrworks


    【解决方案1】:

    是的,有可能。

    这是 ANTLR 词法分析器决定使用哪个规则的方式: - 哪个规则可以匹配输入的最长子序列(从输入中的当前位置开始) - 如果更多规则可以匹配此子序列(即它是平局),则第一个规则(如语法文件中定义)获胜

    因此,在您的情况下,对于仅 alpha 输入,两个规则都将匹配它,但由于 String 在语法中更靠前,因此将使用它。在非 alpha 输入的情况下,EVERYTHING 规则将能够匹配更长的子序列,因此将被使用。

    但是请注意,正如它所写的那样,您的 EVERYTHING 规则甚至匹配空格和换行符,因此在这种特定情况下,String 规则将仅在整个输入只是字母字符而不是其他字符时使用;在任何一种情况下,整个输入都将作为单个标记匹配。所以在真正的语法中,EVERTYHING 规则可能会略有不同。

    【讨论】:

    • 好的,我尝试保留两个词法分析器规则,但它会产生问题,说字符串规则永远无法使用并失败。请建议可以做些什么来同时拥有词法分析器规则并且不应该影响其他规则?
    • 你能edit你的帖子并添加一个失败的最小示例语法吗?
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2018-12-13
    • 1970-01-01
    相关资源
    最近更新 更多