Как можно указать неассоциативные операторы, такие как ‹, в грамматиках ANTLR4?

В правиле expr : expr '<' expr | ...; синтаксический анализатор ANTLR будет принимать выражения вида 1 < 2 < 3 (и строить левоассоциативные деревья, соответствующие скобкам (1 < 2) < 3.

Вы можете указать ANTLR рассматривать операторы как правоассоциативные, например.

expr : expr '<'<assoc=right> expr | ...; 

для получения деревьев синтаксического анализа 1 < (2 < 3).

Однако во многих языках реляционные операторы неассоциативны, т. е. выражение 1 < 2 < 3 запрещено. Это можно указать в YACC и его производных.

Можно ли это также указать в ANTLR? Например, как expr : expr '<'<assoc=no> expr | ...;

Мне пока не удалось найти что-то в книге ANTLR4.


person user2818521    schedule 26.09.2013    source источник
comment
IANAGuru, но может случиться так, что вы не можете (разумно) обеспечить его соблюдение, кроме как (A) добавив предикаты/код действия в грамматику или (B) выполнив шаг проверки после синтаксического анализа.   -  person Darien    schedule 27.09.2013
comment
Хм, до сих пор нет ответа? Что бы вы сделали в любом случае, если бы кто-то в самом деле поставил A‹B‹C? Вы заставляете это звучать как неисправимый недостаток во входных данных. Я бы обрабатывал дерево синтаксического анализа (с прослушивателем) и генерировал ошибку всякий раз, когда обнаруживались непосредственно вложенные операции ‹.   -  person Darien    schedule 09.10.2013


Ответы (1)


Как насчет следующего подхода. В основном «результат» a < b имеет тип, несовместимый с другим применением оператора < или >:

expression
    :   boolExpression
    |   nonBoolExpression
    ;

boolExpression
    :   nonBoolExpression '<' nonBoolExpression
    |   nonBoolExpression '>' nonBoolExpression
    |   ...
    ;

nonBoolExpression
    :   expression '*' expression
    |   expression '+' expression
    |   ...
    ;

Хотя лично я бы выбрал Дариен и обнаружить ошибку после синтаксического анализа.

person Onur    schedule 10.04.2014