Следующие определения токенов никогда не могут быть сопоставлены, поскольку предыдущие токены совпадают с одним и тем же входом: INT, STRING - PullRequest
0 голосов
/ 04 марта 2020

Попытка простой грамматики на antlr. он должен анализировать входные данные, такие как L = [1,2, привет]. Однако antlr выдает эту ошибку: Следующие определения токенов не могут быть сопоставлены, поскольку предыдущие токены совпадают с одним и тем же вводом: INT, STRING .Any Help?

  grammar List;
    decl: ID '=[' Inside1 ']'; // Declaration of a List. Example : L=[1,'hello']
    Inside1: (INT|STRING) Inside2| ; // First element in the List. Could be nothing
    Inside2:',' (INT|STRING) Inside2 | ; //

    ID:('0'..'Z')+;
    INT:('0'..'9')+;
    STRING:('a'..'Z')+;

РЕДАКТИРОВАТЬ: обновлено Грамматика. Ошибка остается только с INT.

grammar List;
decl: STRING '=[' Inside1 ']'; // Declaration of a List. Example : L=[1,'hello']
Inside1: (INT|'"'STRING'"') Inside2| ; // First element in the List. Could be nothing
Inside2:',' (INT|'"'STRING'"') Inside2 | ; //

STRING:('A'..'Z')+;
INT:('0'..'9')+;

1 Ответ

1 голос
/ 04 марта 2020

Ваш шаблон ID соответствует всему, что соответствует INT или STRING, что делает их неактуальными. Я не думаю, что это то, что вы хотите.

ID не должно совпадать с токенами, начинающимися с цифры; 42 не является идентификатором. И ваш комментарий подразумевает, что STRING предназначен для строкового литерала ('hello'), но ваш лексический шаблон не пытается сопоставить '.

...