是否可以以先行方式使用 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
;
我正在尝试使用 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
;