Я пытаюсь использовать textx для разбора языка, похожего на SQL.Я хотел бы использовать ссылки на правила ссылок, чтобы ссылаться на псевдонимы до их объявления.
Я получаю ошибку "Неизвестный объект" Foo "класса" Bar "" при попытке выполнить такую прямую ссылку.
Простейший пример, показывающий, что я хотел бы проанализировать,ниже:
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