8Fermer10
squalylLe 03/03/2009 à 19:58
Zephyr (./4) :
1 - tu définis une classe "symbole" avec une regexp qui matche tous tes mots-clés, comme "[A-Za-z_][0-9A-Za-z_]*" par exemple 2 - après avoir trouvé un symbole, tu regardes s'il s'agit d'un mot-clé ou bien d'un symbole quelconque


C'est la solution adoptée par tous les compilos dont j'ai vu et compris le source, y compris javacc qui prend la liste des mots clés séparément.

stmt = statement = instruction, et encore une fois attention à ne pas confondre parser (grammaire) et lexer (regex).

le lexer sort des lexèmes, il n'a aucune idée de leur signification, de la notions d'instructions, de blocs, etc.
tout ce qu'il connait c'est en général IDENTIFICATEUR, ENTIER et les signes de ponctuation.

nb: par définition une regex ne pourra jamais parser des trucs à blocs imbriqués, on s'en occupe PAS en analyse lexicale.

dans la regex qui reconnait les identifiants, on va en général appeler un code qui cherche cet identifiant dans une table et retourne le code du mot clé si il est trouvé

en pseudo langage ça donnerait

when([a-zA-Z][a-zA-Z0-9]* as token) => {
if listemotsreserves.contains(token) return mot_reserves.getinstance(token)
else return new identifiant(token)
}

avec une liste qui associerait "for" à TOKEN_FOR, "if" à TOKEN_IF, etc

je suis sans doute très dur à comprendre mais

tl;dr:
les mots clés et les identifiants sont reconnus par la même regex, et on fait la différence après.