Можно ли использовать ссылку на правило ссылки в режиме ожидания?
Я пытаюсь использовать 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
1 ответ
Проблема в том, что в From
править Query
совпадение ни к чему не присваивается, поэтому оно отбрасывается, и поэтому ссылки во внутреннем запросе отбрасываются. Вот обновленный From
правило:
From:
(source=DataSource | '(' query=Query ')') 'AS' alias=SourceAlias
;