Wednesday, June 15, 2011

ANTLR: construint llenguatges

Al projecte que estem desenvolupant actualment havien d'acceptar expressions de consulta com la següent:

nom:toni AND (data:ENTRE 17-FEB-2010 I 25-MAR-2010 OR ciutat:Barcelona)

(no exactament això, però com a exemple ens serveix)

Aquesta consulta expressada d'aquesta manera calia validar-la i convertir-la, entre altres coses, a una consulta SQL.

Per fer aquesta feina podíem haver fet un codi basat en substrings i molts if, però el resultat seria poc flexible (i poc fiable). El millor és sempre fer servir l'eina adequada per cada problema, i en aquest cas el més adient semblava ANTLR.

ANTLR (ANother Tool for Language Recognition) és una eina que permet construir aplicacions per reconèixer i interpretar llenguatges. S'assembla al lex i el yacc que vam veure a les assignatures de Compiladors, o al Flex i Bison que trobem a GNU/Linux, o al JavaCC.

Amb ANTLR pots construir un lexer i un parser, definint el llenguatge amb notació similar a BNF, igual que fèiem amb yacc, però amb moltes facilitats. Entre altres coses hi ha una eina visual per anar provant la gramàtica a mesura que la vas escrivint. I s'integra perfectament amb Eclipse.

Resulta molt fàcil crear DSL (Domain-Specific Languages) fent servir ANTLR, i això obre un món de possibilitats.

Tot i que no he estat jo el que al final a desenvolupat el parser al projecte, he pogut veure tot el potencial de ANTLR. A la seva plana Web els usuaris han anat pujant gramàtiques per molts llenguatges, entre d'altres el PL/SQL. Això m'ha fet recordar un munt de projectes personals abandonats, com el formatejador de PL/SQL o, molt més interessant, un analitzador estàtic de codi PL/SQL que doni informació com:
  • variables no usades
  • funcions i procediments no usats
  • us adequat de convencions pels noms
  • tipus de dades coherents
Pot ser un projecte molt pràctic per netejar codi existent. A veure si trobo temps finançament...

No comments: