是否可以以超前方式使用链接规则引用?

时间:2019-06-07 03:02:08

标签: peg textx

我正在尝试使用textx来解析类似于SQL的语言。我想在声明别名之前使用链接规则引用来引用别名。

尝试进行此类前向引用时,出现“ Bar”类的“ Foo”的“未知对象”错误。

下面给出了我想解析的最简单示例:

SELECT B.c
FROM A AS B

在这种情况下,我希望B中的B.c引用后来定义的别名(B中的A AS B)。

编辑

进一步研究它,似乎我已经解析了上面给出的简单示例的语法,但是当我尝试在FROM子句中使用嵌套查询时遇到了问题。

这是我正在使用的语法:

Expression: Query | Atomic | Tuple;

Query:
    'SELECT' selections+=Selection[',']
    'FROM' from=From
;

Selection[noskipws]:
    /\s*/
    source=[SourceAlias] ('.' source_selectors+=ID['.'])?  /\s*/ ('AS' /\s*/ alias=ID)?
    /\s*/
;

From:
        (source=DataSource | '(' Query ')') 'AS' alias=SourceAlias
;

DataSource: source_name=ID '.' source_attributes+=ID['.'];

SourceAlias: name=ID;

Tuple: '(' atoms+=Atomic[','] ')';

Atomic: NUMBER | STRING | BOOL;

这是我的语法失败的示例,错误为"test.qql:2:14: error: Unknown object "B" of class "SourceAlias"

SELECT inner.o AS outer
FROM (SELECT B.huh AS aha FROM A.b AS B) AS inner

1 个答案:

答案 0 :(得分:1)

问题在于,在From规则中,Query匹配项没有分配任何内容,因此将其丢弃,因此内部查询中的引用也将被丢弃。这是更新后的From规则:

From:
        (source=DataSource | '(' query=Query ')') 'AS' alias=SourceAlias
;