префикс каретки вместо постфикса в antlr

Я знаю, что означает постфикс вставки в antlr (т.е. сделать root), но как насчет того, когда вставка является префиксом, как в следующей грамматике, которую я читал (эта грамматика совершенно новая и сделана новой командой, изучающей antlr).. ..

selectClause
    : SELECT resultList -> ^(SELECT_CLAUSE resultList) 
    ;


fromClause
    : FROM tableList -> ^(FROM_CLAUSE tableList) 
    ;

Кроме того, я знаю, что означает =>, но как насчет ->? Что означает ->?

спасибо, Дин


person Dean Hiller    schedule 06.07.2012    source источник


Ответы (1)


^ используется как встроенный оператор дерева, указывающий, что определенный токен должен стать корнем дерева.

Например, правило:

p : A B^ C;

создает следующий AST:

  B
 / \
A   C

Есть еще один способ создать AST, использующий правило перезаписи. Правило перезаписи размещается после (или справа) альтернативного правила парсера. Вы начинаете правило перезаписи со "стрелки" ->, за которой следуют правила/токены, которые должны быть в AST.

Возьмите предыдущее правило:

p : A B C;

и вы хотите перевернуть токены, но сохранить ASST «плоским» (без корневого узла). Это можно сделать с помощью следующего правила перезаписи:

p : A B C -> C B A;

И если вы хотите создать AST, аналогичный p : A B^ C;, вы начинаете свое правило перезаписи с ^( ... ), где первый токен/правило внутри круглых скобок станет корневым узлом. Итак правило:

p : A B C -> ^(B A C);

производит тот же AST, что и p : A B^ C;.


Связанный:

person Bart Kiers    schedule 06.07.2012