Retourner aux forums || Retourner au forum general.general
general.general : antlr, et le lexical nondeterminism
Posté par Adrien BUSTANY (Jabber id, page perso, ) le 25 juin 2005Je me suis mis à antlr, et je me casse déjà la nez (ce serait pas drôle sinon). J'ai donc suivi l'exemple "Cut and Paste" de la documentation, que j'ai voulu modifier un peu pour bien comprendre comment ça marche (et vu que je poste ici, c'est que c'est pas encore le cas).
Mon fichier t.g ressemble à ça :
class P extends Parser;
startRule
: a:ACTION
COMMA
n:NAME
{System.out.println(a.getText()+"la"+n.getText());}
;
class L extends Lexer;
// one-or-more letters followed by a newline
NAME: ( 'a'..'z'|'A'..'Z' )+ NEWLINE
;
NEWLINE
: '\r' '\n' // DOS
| '\n' // UNIX
;
ACTION: ( 'a'..'z'|'A'..'Z'|'0'..'9' )+
;
COMMA
: ','
;
Ce que je voudrais, c'est rentrer "couper pomme" et qu'il me sorte "couper la pomme" par exemple.
Toutefois quand je le passe au antlr, il me prévient que
ANTLR Parser Generator Version 2.7.4 1989-2004 jGuru.com
t.g: warning:lexical nondeterminism between rules NAME and ACTION upon
t.g: k==1:'A'..'Z','a'..'z'Je sais pas de quoi il parle, ni comment résoudre ce problème...
> Lire le message (2 commentaires, moyenne: 2).
Ben, il y a ambiguité
Et antlr te le dis: les lexèmes ACTION et NAME peuvent commencer de la même manière, par une lettre. De plus, pour les deux, tu as un "+", donc augmenter le lookahead ne reglera pas le problème. La différence entre les action et les noms dans ton cas pourrait n'intervenir qu'au niveau du parsing, les deux étant le même genre de token. Par exemple, pas mal de systemes utilisent le meme lexème "identiofier" pour les noms de variables, de types et de fonctions. C'est le parseur ensuite qui fait la différence.
-
[^]Re: Ben, il y a ambiguité
Posté par Adrien BUSTANY (Jabber id, page perso, ) le 25/06/2005 à 22:35. (lien). Évalué à 1.Merci pour ta réponse précise. Mais dans mon cas, je chercher à lui dire que c'est deux mots successifs séparés par un espace, dans l'ordre que je lui donne. Comme quand le tappe ls -A dans un shell, je tape pas -A ls. Dans ce cas comment préciser l'ordre, je me doute bien que c'est possible ?
Revenir en haut de page || Retourner aux forums || Retourner au forum general.general



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.