解决 XText 中的左递归 SQL-语法定义表和连接

Resolve left-recursion in XText SQL-grammar defining tables and joins

为了练习,我目前正在为简单的 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
;

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

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

这对你的语法来说是个大手术。

为什么是左递归的?

  • table:加入; // 所以 join 是 table
  • 最左边的非终结符
  • 加入:table'JOIN'table'ON'条件; // 所以 table 是 join
  • 的最左边的非终结符
  • 相互递归和 join 的两种用法,table 最左边使得两个规则都是左递归的

如何解决这个问题?

  • 您可以将 JOIN 规则重写为列表:join: ('JOIN' table)*
  • 以及您需要对其余语法进行更改以使此更改保持语法不变。
  • 请注意,更改会影响树模型的形状