Ejemplo 420

Este ejercicio es un ejemplo de aplicación de reglas de selección en ANTLR.

Enunciado

Hacen una especificación en ANTLR para un lenguaje con las siguientes características:

  • Una entrada tendrá sólo una única sentencia 'print' seguida de una expresión y un punto y coma.
  • Características de las expresiones:
    • Operadores relacionales: '==' y '!='.
    • Operadores lógicos: '||' y '&&' (or y and respectivamente).
    • Operadores aritméticos: '+', '-', '*' y '/'.
    • Agrupación de expresiones entre paréntesis.

Ejemplos de entradas válidas en este lenguaje serían:

print a + 2 == 3 && a / 5 != b;
print a * (4 - 2);

Solución

Lo primero, habría que hacer el léxico del lenguaje.

lexer grammar Lexicon;

NUM : [0-9]+;
IDENT : [a-zA-Z0-9_]+;

WS : [ \t\r\n]+ -> skip;

Y a continuación se haría la gramática.

grammar Grammar;

import Lexicon;

start : 'print' expr ';';

expr:
	NUM
	| IDENT
	| '(' expr ')'
	| expr ('*' | '/') expr
	| expr ('+' | '-') expr
	| expr ('==' | '!=') expr
	| expr '&&' expr
	| expr '||' expr
	;

Nótese cómo el orden de las reglas corresponde con la prioridad de los operadores (los operadores de la misma prioridad, por tanto, deben ir en la misma regla).

Supóngase la siguiente entrada válida.

print a + 2 == 3 && a / 5 != b;

Para dicha entrada, el árbol concreto que correspondería con la interpretación que hará ANTLR de la misma tal y como están ordenadas las reglas sería el siguiente.

Código

💿 Se puede bajar el proyecto Java con todo lo necesario para poder ejecutar la solución de este ejemplo y así poder ver su resultado y probar otras alternativas.