Skip to content

Esqueleto de Antlr

TIP

Este capítulo es sólo de interés para aquellos que estén utilizando VGen. Si no es el caso, puede saltarse este capítulo.

A la hora de completar el fichero /specifications/Grammar.g4, algunas veces abruma la cantidad de cosas que hay que recordar para implementar las acciones en Grammar.g4:

  • Hay que recordar el nombre de todos los nodos creados, para incluir sus new.
  • Hay que recordar qué hijos hay que pasar en el constructor de cada uno y en qué orden.
  • Hay que recordar de qué paquetes hay que hacer import en el @header.

Para facilitar este trabajo, VGen ha inferido y generado una gramática de ejemplo con acciones que crean todos los nodos de la gramática abstracta. Esta gramática ayuda a recordar cuántos new hay que hacer y qué parámetros tiene cada uno. Dicha gramática se genera en /vgen.output/skeleton.antlr/template.g4.

En el caso de la gramática de este tutorial, VGen generó el siguiente esqueleto que se utilizó para completar las soluciones previamente presentadas:

java
grammar Grammar;

@header {
	    import ast.expression.*;
	    import ast.statement.*;
	    import ast.type.*;
	    import ast.*;
}

program returns[Program ast]
    : varDefinitions+=varDefinition* statements+=statement*
         { $ast = new Program($varDefinitions, $statements); }
	;

varDefinition returns[VarDefinition ast]
    : type name=IDENT                 { $ast = new VarDefinition($type.ast, $name); }
	;

type returns[Type ast]
    :                                 { $ast = new IntType(); }
    |                                 { $ast = new FloatType(); }
	;

statement returns[Statement ast]
    : expression                          { $ast = new Print($expression.ast); }
    | left=expression right=expression    { $ast = new Assignment($left.ast, $right.ast); }
	;

expression returns[Expression ast]
    : left=expression operator=IDENT right=expression { $ast = new Arithmetic($left.ast, $operator, $right.ast); }
    | name=IDENT                          { $ast = new Variable($name); }
    | INT_LITERAL                         { $ast = new IntLiteral($INT_LITERAL); }
    | FLOAT_LITERAL                       { $ast = new FloatLiteral($FLOAT_LITERAL); }
	;


// ---------------------------------------------------------------
// Tokens

IDENT: [a-zA-Z_][a-zA-Z0-9_]*;
FLOAT_LITERAL: [0-9]+ '.' [0-9]+;
INT_LITERAL: [0-9]+;

La forma recomendada de uso de este esqueleto es mantenerlo abierto junto con el fichero Grammar.g4 al que se le quieren añadir las acciones. Éstas se irán cortando y pegando desde el esqueleto (adaptando, eso si, los nombres de los símbolos en cada regla). De esta manera se facilita el proceso de controlar qué nodos no se han creado aún y qué argumentos tienen.