Можно ли использовать ссылку на правило ссылки в режиме ожидания? - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь использовать 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 Ответ

1 голос
/ 07 июня 2019

Проблема в том, что в правиле From совпадение Query ни к чему не присваивается, поэтому оно отбрасывается и, следовательно, ссылки во внутреннем запросе отбрасываются.Вот обновленное правило From:

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