ANTLR рекурсивная проблема неоднозначности - PullRequest
1 голос
/ 21 сентября 2009
VARIABLE: ...

UNARYOP: 'not' Expression; // unary operation
BINARYOP: 'or' VARIABLE;

Expression : (NIL | INTEGER | UNARYOP) BINARYOP?;

В приведенном выше сценарии «или» может быть достигнуто через

Expression-> BINARYOP

или

EXPRESSION-> UNARYOP-> Expression-> BINARYOP

Существует ли систематический способ устранения неясностей, таких как приведенные выше?

1 Ответ

1 голос
/ 21 сентября 2009

Я думаю, что устранение неоднозначностей в грамматиках не является автоматически решаемой задачей, потому что выбор правильной альтернативы - «субъективный» выбор.

Как только вы определили проблему, создайте различные альтернативные деревья и добавьте новые производственные правила, чтобы запретить недопустимые деревья разбора.

Боюсь, что нет волшебного решения, как удаление левых рекурсий ... Может быть, я ошибаюсь.

В вашем случае вы можете определить

Expression : NIL
           | INTEGER
           | VARIABLE
           | 'not' Expression
           | Expression 'or' Expression;

Или вы хотите ограничить правую часть 'или' только переменными?

...