在XText中解析左递归SQL语法定义表和连接

时间:2017-11-02 17:02:19

标签: antlr xtext

对于练习,我目前正在为简单的SELECT语句定义语法,例如

SELECT * FROM table1 as t1 JOIN table 2 AS t2 ON (t1.field1=t2.field2);

为此,我使用XText。以下是语法的摘录,在FROM部分中定义表:

table: 
    name=ID (('AS')? alias=ID)?
    | 
    join
;

join:
    left_table=table (type=join_type)? 'JOIN' right_table=table 'ON' condition=predicate
;

显然,规则“表”是递归的。 我已经阅读了所有指南,描述了如何在XText(或分别是ANTLR)中解析左递归。但我不明白,或者至少,我无法将解释映射到我的特定代码......

我的定义有什么问题,如何解决左递归?

1 个答案:

答案 0 :(得分:1)

这对你的语法来说是一个很大的操作。

为什么它是左递归的?

  • table:join; //所以join是表格最左边的非终端
  • 加入:表'加入'表' ON'条件; //所以表是最左边的非终结点
  • 相互递归以及最左边的连接和表的两种用法使得两个规则都是左递归的

如何解决这个问题?

  • 您可以将JOIN规则重写为列表:join: ('JOIN' table)*
  • 以及在语法的其余部分中需要更改的任何内容,以使此更改保持语法。
  • 请注意,更改将影响树模型的形状