Newline-sensitive parser


h1 5/16/2006 09:08:00 PM

Pour préserver le côté geek de ce blog il faut que je vous parle d'une petite trouvaille qui me plait bien. Les langages comme Python ou Ruby ont réussi à abolir le point virgule. Pour cela leur syntaxe se doit de tenir compte des retours à la ligne, au moins: il faut différencier les deux bouts de code suivants.

# Exemple 1
objet.methode
(1,2)
# Exemple 2
objet.methode(1,2)


Le parser de Python est compliqué par la prise en compte de l'indentation comme délimiteur de blocs. Celui de Ruby devrait être plus simple, mais je peux pas vous dire j'y pige rien. Toujours est-il que jusqu'à hier j'avais pas de solution acceptable pour Liquidsoap, car je voulais coller à l'architecture classique à base de lex/yacc -- simple et donc compréhensible, pour le codeur comme l'utilisateur. Voici la recette pour alléger votre langage sans introduire d'ingrédient dangereux pour la santé.

Au niveau du lexer, on distingue le token VAR (symbole de variable) de VARPAR qui fusionne une variable avec une parenthèse ouvrante séparée par des espaces. Ce sera le seul endroit où un retour à la ligne est distingué d'un autre espacement. Grâce à ce nouveau token on distingue proprement les deux exemples cités plus haut. Mon premier exemple de code apparait au parser comme VAR PAROPEN EXPR COMMA EXPR PARCLOSE, le second comme VARPAR EXPR COMMA EXPR PARCLOSE.

0 commentaires:

Un commentaire ?

< Accueil