я создал очень простую грамматику, чтобы показать проблему я столкнулся:antlr4 - Parser не работает должным образом при использовании маркеров
grammar Expr;
test: funcDecl;
//-----------------------------------------------------------------------
funcDecl: funcHead ';';
funcHead: type '*'? IDENTIFIER '(' formParList? ')';
formParList: ('void' |
type '*'? IDENTIFIER ('[' ']')?
(',' type '*'? IDENTIFIER ('[' ']')?)*
);
type: 'void' | 'bool' | 'int';
// ----------------------------------------------------------------------
Whitespace: [ \t]+ -> skip;
LineComment: '//' ~[\r\n]* -> skip;
NEWLINE : ('\r' '\n'? | '\n') -> skip;
IDENTIFIER: CHARACTER (CHARACTER | DIGIT)*;
fragment
CHARACTER: [a-zA-Z_];
fragment
DIGIT: [0-9];
Грамматика выше генерирует следующий AST с этим примером кода:
void Sieve(int n); // declaration
Это то, что грамматика выглядит как после изменения type
в знак (изменение type
к TYPE
):
...
funcHead: TYPE '*'? IDENTIFIER '(' formParList? ')';
...
TYPE: 'void' | 'bool' | 'int';
...
После этого, я получаю следующее сообщение об ошибке:
line 1:0 mismatched input 'void' expecting TYPE
Почему? Как только я использую токен для типа, синтаксический анализатор выдает эту ошибку. Но токен IDENTIFIER
работает независимо ...
Как я помню, наибольшее первое правило совпадения выигрывает, а «void» соответствует TYPE и IDENTIFIIER. Итак, определение ТИПА выше IDENTIFIER? – CoronA
Правда, это то, что делает синтаксический анализатор, но 'TYPE' определен до' IDENTIFIER'. 'TYPE' определен в строке 10, а' IDENTIFIER' определен в строке 18. (В основном я просто переименовал 'type' в' TYPE' из моего исходного кода кода) – Johannes
Вы попробовали его ниже IDENTIFIER? – CoronA