Antlr non-LL (*) решение - PullRequest
       5

Antlr non-LL (*) решение

2 голосов
/ 05 ноября 2011

У меня возникли проблемы с созданием части моей грамматики ANTLR для моего языка программирования.

Я получаю сообщение об ошибке, когда происходит вторая часть объявления type:

public type
    :   ID ('.' ID)* ('?')? -> ^(R__Type ID ID* ('?')?)
    |   '(' type (',' type)*  ')' ('?')? -> ^(R__Type type* ('?')?)
    ;

Я пытаюсь найти совпадение:

  • Строка типа System.String (работает нормально)
  • Кортеж, такой как (System.String, System.Int32)

Ошибка возникает немного выше по дереву и гласит:

[fatal] rule statement has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.

Что я делаю не так?

1 Ответ

1 голос
/ 05 ноября 2011

Правильно, мне удалось исправить это немного раньше, отредактировав правило, которое работает с объявлениями переменных:

'my' ID (':' type '=' constant | ':' type | '=' constant) -> ^(R__VarDecl ID type? constant?)

, чтобы оно работало так:

'my' ID
(
   ':' type ('=' constant)?
|   '=' constant
) -> ^(R__VarDecl ID type? constant?)

Я получил идею на примере синтаксических предикатов здесь:

https://wincent.com/wiki/ANTLR_predicates

К счастью, в конце концов мне не понадобился предикат!

...