我正在尝试使用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
答案 0 :(得分:1)
问题在于,在From
规则中,Query
匹配项没有分配任何内容,因此将其丢弃,因此内部查询中的引用也将被丢弃。这是更新后的From
规则:
From:
(source=DataSource | '(' query=Query ')') 'AS' alias=SourceAlias
;