J'ai une grammaire simple pour analyser les fichiers contenant des identifiants et mots-clés entre parenthèses (je l'espère):grammaire simple ne fonctionne pas
grammar Keyword;
// PARSER RULES
//
entry_point : ('['ID']')*;
// LEXER RULES
//
KEYWORD : '[Keyword]';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
WS : (' ' | '\t' | '\r' | '\n' | '\r\n')
{
$channel = HIDDEN;
};
Il fonctionne pour l'entrée:
[Hi]
[Hi]
Il renvoie une erreur de NoViableAltException pour entrée:
[Hi]
[Ki]
Si je commente KEYWORD, alors cela fonctionne très bien. Aussi, si je change ma grammaire à:
grammar Keyword;
// PARSER RULES
//
entry_point : ID*;
// LEXER RULES
//
KEYWORD : '[Keyword]';
ID : '[' ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ']';
WS : (' ' | '\t' | '\r' | '\n' | '\r\n')
{
$channel = HIDDEN;
};
Ensuite, cela fonctionne. Pourriez-vous m'aider s'il vous plaît à comprendre pourquoi?
Cordialement.
Merci! Y a-t-il une raison théorique ou architecturale pour laquelle le lexer ne «revient» pas avant de trouver une correspondance? – Korchkidu
@Korchkidu, pas que je sache. Je crois que la prochaine version d'ANTLR (v4), la lexer deviendra "plus intelligente" et est capable de revenir en arrière de # 1 (pas sûr à 100% si ...) –
merci beaucoup pour votre aide! – Korchkidu