ALang.g: 21: 1: Следующие определения токенов никогда не могут быть сопоставлены, поскольку предыдущие токены совпадают с одним и тем же входом: PRINT
Да, этого достаточно.Если вы определите PRINT
после ID
, ANTLR выдаст ошибку:
ALang.g:21:1: The following token definitions can never be matched because prior tokens match the same input: PRINT
Извините, я не хотел использовать эту продукцию: ПЕЧАТЬ: «печать»;но производство без запаздывания: PRINT: 'print';Проблема в том, что «print» получен из ID, а не из PRINT
Нет, это не может быть так.
Следующее:
grammar ALang;
@members {
public static void main(String[] args) throws Exception {
ALangLexer lex = new ALangLexer(new ANTLRStringStream("sprint print prints foo"));
CommonTokenStream tokens = new CommonTokenStream(lex);
ALangParser parser = new ALangParser(tokens);
parser.prog();
}
}
prog
: ( ID {System.out.printf("ID :: '\%s'\n", $ID.text);}
| PRINT {System.out.printf("PRINT :: '\%s'\n", $PRINT.text);}
)*
EOF
;
PRINT : 'print';
ID : ('a'..'z' | 'A'..'Z')+;
WS : (' ' | '\t' | '\n' | '\r')+ {skip();};
напечатает:
ID :: 'sprint'
PRINT :: 'print'
ID :: 'prints'
ID :: 'foo'
Как видите, PRINT
правило соответствует совпадению "print"
.