是否可以以先行方式使用 link 规则引用?

Is it possible to use a link rule reference in a lookahead fashion?

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

我在尝试进行这种前向引用时收到 "Unknown Object of "Foo" of class "Bar"" 错误。

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

SELECT B.c
FROM A AS B

在这种情况下,我希望 B.c 中的 B 引用之后定义的别名(A AS B 中的 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

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

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