【问题标题】:ANTLR - mismatched input error (between token and rule)ANTLR - 不匹配的输入错误(在令牌和规则之间)
【发布时间】:2021-11-08 11:24:15
【问题描述】:

My grammar:


    SELECT column
    FROM 
                 tableAndAlias       #any_name
                          |  from_model              #from_model_function;
        
       

    from_model: ML.model_function_name'(' MODEL any_name ( (',' (TABLE table_name);

    any_name :
                |   IDENTIFIER
                |   STRING_LITERAL
                |   '(' any_name ')'
                |   NULL


    IDENTIFIER :    
              '"' (~'"' | '""')* '"'
            | '`' (~'`' | '``')* '`'
            | [a-zA-Z_0-9] [a-zA-Z_0-9]*;
    STRING_LITERAL : '\'' ( ~'\'' | '\'\'' )* '\'' ;


ML:         M L;
MODEL:      M O D E L;
TABLE:      T A B L E;

我正在尝试解析:

从表中选择列

错误: com.cooladata.parser.exceptions.ParseException:语法错误:在第 4 行,字符 5:'table' 附近的意外标记

如果我删除 TABLE 令牌,它将正常工作:

//表格:T A B L E;

如果我将表名从 TABLE TO TABLEA 更改,它会正常工作:

从表中选择列

如何使用也可以具有标记名称的文本? 请指教。

【问题讨论】:

  • 您能否修改您的问题以使示例语法被 ANTLR 接受?这是几个明显的 ANTLR 语法错误。更正这些错误会更容易回答你的问题(也许)。
  • 请提供完整的语法。它看起来不像是有效的 Antlr (v4?) 语法:缺少“语法 YourGrammarName;”宣言; "SELECT colum FROM tablealias ..." 不以 "rule_name :" 开头;规则“from_model”包含不平衡的括号。
  • 我已经发布了一个答案,它可能是您现在正在处理的特定识别问题的根源。但是,您的示例暗示了其他几个中间理解:ANTLR 语法语法。例如,我很确定带有 `#any_name` 标记的替代项不会像您认为的那样做,而顶级规则中的 | 可能是一个严重的误解。规则备选名称仅适用于顶级备选。从语法上讲,您在该规则中有 2 个顶级替代方案,但您的实际意图不太可能。
  • @MikeCargal 我的语法很长很复杂,我只写了有问题的部分并尽可能地简化了它。这不是语法的开始,只是一小部分:)

标签: antlr


【解决方案1】:

回复:“如果我将表名从 TABLE TO TABLEA 更改,它会正常工作”

和“如果我删除 TABLE 令牌,它将正常工作://TABLE: T A B L E;”

您需要确保您对 ANTLR 的 Lexing 和解析阶段有深刻的了解。词法分析器获取一个字符流,并且在没有来自解析器的任何输入的情况下,生成一个由解析器规则使用的标记流。

养成转储令牌流的习惯是一个好习惯(grun 命令上的-tokens 选项,如果您已设置)。这个流是令牌是解析器规则看到的。

在您的情况下,您有一个相当知名的问题,其中字符“t”、“a”、“b”、“l”和“e”的解释可能是某些中的 TABLE 关键字情况,以及其他情况下的简单标识符。

不幸的是(为了解决这个问题),Lexer 没有上下文的概念,如果你有 TABLE 规则,它将简单地将这个字符串标识为 TABLE 标记,或者如果你有 IDENTIFIER 没有那个规则。

你必须选择走哪条路,然后在你的规则中处理它。

因为TABLE 可能不是唯一一个也可以是表名的关键字。您可能需要在规则中接受“表格”IDENTIFIER 才能识别 TABLE 定义。 (本质上,您需要一个语义谓词 - 仅当它恰好是一个不区分大小写的“表”时才接受这个 IDENTIFIER

有一个 ANTLR 语法库here。您可以选择一种 SQL 语法并查看其他人是如何处理此问题的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2016-04-23
    • 2022-01-14
    • 1970-01-01
    • 2022-12-09
    • 2017-05-13
    相关资源
    最近更新 更多