【发布时间】: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