2017-10-09 5 views
1

J'utilise antlr4 python et courir dans quelque chose de bizarre avec ce Gammar simple,erreur Antlr avec un non-terminal vide-possible apparaît deux fois dans une alternative

emptytest : (COMMA | empty empty nonempty) EOF ; 
empty  : SEMICOLON* ; 
nonempty : DOT+ ; 
DOT   : '.' ; 
SEMICOLON : ';' ; 
COMMA  : ',' ; 

En entrée « ... », je suis arrivé erreur ligne 1: 0 entrée non concordante '.' J'attends {';', ','}

Mais si je laisse tomber un 'vide', ou abandonne 'COMMA |' de la règle, pas d'erreur. Je me demande pourquoi l'entrée '...' ne peut pas être interprétée comme vide (= '') vide (= '') nonempty (= '...')?

Merci pour toute idée.

Répondre

0

Votre grammaire est ambiguë - pour l'entrée ;., le point-virgule peut correspondre à la première empty ou à la seconde empty.

Dans une telle situation, ANTLR essaie de résoudre l'ambiguïté en ignorant certaines alternatives. Il semble dans ce cas qu'il a résolu l'ambiguïté en ignorant la possibilité de empty de ne contenir aucune occurrence de SEMICOLON (c'est-à-dire d'être réellement vide). Cela s'applique à toutes les utilisations de la règle empty, donc . n'est pas considérée comme une entrée valide. Le point à retenir est que si votre grammaire est ambiguë, vous ne pouvez pas vous attendre à ce que l'analyseur se comporte bien. ANTLR vous avertira de l'ambiguïté s'il en rencontre un (dans la version 3 il vous avertit lors de la génération de l'analyseur, pas sûr de la v4).

+0

Merci pour l'explication. Cependant, il n'y a pas d'avertissement sur l'ambiguïté. Tout ce que j'ai vu est –

+0

Merci pour l'explication. Cependant, il n'y a pas d'avertissement sur l'ambiguïté, car il n'y a pas d'ambiguïté sur l'entrée '...'. Cependant, même si elle était ambiguë, il semble plus raisonnable pour Antlr de l'analyser le long d'une des possibilités, avec un avertissement, au lieu d'échouer sur une entrée légitime. En fait, l'Antlr4 que j'utilise fait quelque chose comme ça - il a choisi le premier choix sur l'ambiguïté: Sur l'entrée '; ...', cet arbre d'analyse a été généré. (videtest (vide;) vide (non vide ...) ) sans avertissement –