You are on page 1of 7

Instituto Tecnolgico de Costa Rica

Sede Regional San Carlos


Primera Tarea Programada
Compiladores e Intrpretes

Prof. Oscar Vquez Acua.

Anlisis Sintctico
Compilador MiniC#

Introduccin

Un compilador es una herramienta de trabajo muy importante para cualquier estudiante de
computacin y normalmente dichas herramientas se utilizan sin conocer detalles de su
implementacin que podran ser de ayuda para comprender mejor el funcionamiento de la
herramienta. Se espera que despus de este curso salga con una mejor comprensin de los
compiladores que utiliza.

Debe notarse que la definicin puede contener algunas ambigedades que el alumno debe resolver
como parte propiamente del trabajo.

Cualquier detalle extra que no sea aclarado en esta
documentacin y que surja debido a las dudas de los
grupos, ser aclarado en su momento por el profesor sin
necesidad de elaborar otro enunciado.

Definicin

El proyecto consiste en crear un Analizador Sintctico para el lenguaje MiniC# cuya sintxis se
detalla posteriormente. Este lenguaje es un subconjunto de lenguaje al estilo C# para dotNET. El
objetivo en esta etapa es realizar la fase de anlisis sintctico del compilador para dicho lenguaje
en donde se espera concluir con las subfases de scanning parsing y AST. Para el desarrollo de
esta etapa ser necesario la utilizacin de la herramientas ANTLR4 para C#.

Se dar nfasis en la evaluacin al soporte robusto de la herramienta ANTLR4. Esto quiere decir
que se espera que la mayora del desarrollo sea en funcin a los archivos .g4 y no sobre cdigo
adicional (esto pasa por un buen estudio y manejo de la herramienta).

A continuacin se detallan las caractersticas del lenguaje MiniC#.

Convenciones lxicas

Comentarios y caracteres ignorados
Los comentarios deben permitirse desde que inicie con /* hasta que termine */ y los de luna
lnea que comienzan con //. Deben adems permitir comentarios anidados (unos dentro de otros).
Otros caracteres ignorados incluyen el cambio de lnea, return-carry, tab, y el espacio en blanco.

Tokens

Los smbolos entre comillas de la gramtica son smbolos terminales, cualquier otra secuencia de
caracteres denota el nombre de una clase lxica, p.e id.

Asumiremos entonces las siguientes clases lxicas:

letter [a-z A-Z _]
digit [0-9]
id letter {letter | digit}

Observe que el _ est tratado como una letra por cuestiones propias del formato de los nombres
de identificadores en muchos lenguajes de programacin.

Constantes numricas
El token num es un nmero que no debe comenzar con 0 a menos de que sea el nmero 0
Debe permitir adems el uso de punto flotante para aquellas constantes float (el separador de
decimales de float debe ser el mismo que en C#.

Constantes carcter
Un charconst como una seguida de un carcter ASCII (puede ser ASCII extendido) y
posteriormente otra de cierre. No se permitirn constantes char sin las respectivas comillas de
apertura y de cierre (deben reportar un error en su defecto). Adems las contantes char solamente
deben permitir un solo caracter

Operadores
Operadores relacionales (relops): ==, !=, <, <=, > y >=
Los addops son + o
Los mulops son *, /, %
El lexema para el token assign es = y los operadores lgicos son || y &&

Scanner

El Scanner debe reconocer cada uno de los tokens mencionados anteriormente y devolverlos uno
por uno segn sea su ocurrencia en el archivo fuente, recordando siempre la posicin en el archivo
del siguiente token para retornarlo en la siguiente llamada. Adems el Scanner debe reportar
errores lxicos entre los que tenemos:

- La ocurrencia de un caracter invlido.
- Constantes char sin comillas cerradas (ej. a) o con ms de un caracter

Parsing

La gramtica que se adjunta con este documento se encuentra en formato EBNF podr ser
modificada por el estudiante si lo desea, pero estas modificaciones no deben alterar su
funcionamiento. A partir de esta gramtica se deber escribir el archivo de gramtica .g4 para el
ANTLR

En caso de error el parser debe reportarlo y continuar hasta que encuentre un token vlido para la
gramtica solamente si el error es un error recuperable, si es un error fatal, no debe continuarse
con la ejecucin.

Los errores que se muestren deben ser lo suficientemente significativos y adems deben contar con
informacin de posicionamiento de dicho error (lnea y columna). Se deben identificar los errores
por su tipo, considerando para esto los tipos error fatal (detiene la ejecucin y no contempla ms
errores) y error (permite la recuperacin de errores que no afectan en mucho la ejecucin del
chequeo sintctico posterior al error).

AST

Se debe construir el rbol de Sintaxis Abstracto (AST) utilizando la estructura de datos OO vista
en clase. Dicho AST debe ser eficiente considerando la cantidad de memoria que implica la
creacin del mismo cuando se analiza un cdigo fuente con una extensin de lneas considerable.

Manejo de Errores

Los errores tanto lxicos como sintcticos deben ser mostrados utilizando el manejo de
excepciones de la herramienta ANTLR de manera que aquellos errores que se consideren que no
causan mucho efecto en el funcionamiento del parser puedan mostrarse y seguir su funcionamiento
mientras que aquellos que si causen mucho desequilibrio en el algoritmo de descenso recursivo,
causen una parada en el mismo y el reporte del error correspondiente.

Los mensajes de error deben ser significativos y debe mostrarse la ubicacin de los mismos en el
texto fuente.

Se debe utilizar el lenguaje Espaol para los errores que se muestren.


Gramtica de MiniC#

Caractersticas Generales:

- Un programa en MiniC# consiste de una sola clase con variables globales y mtodos. No
existen otras clases ms, solamente las clases internas las cuales pueden ser utilizadas
solamente como tipos de datos (tipo registro).
- El mtodo principal de un programa en MiniC# se llama siempre Main() y se ejecuta
siempre que se invoque al programa.
- MiniC# tiene:
o Constantes char, int o float pero no string.
o Variables: todas las variables de tipos estructurados referenciadas por punteros. Las
variables de la clase principal son estticas.
o Tipos bsicos: int, char(Unicode 2 bytes), float y bool
o Tipos estructurados: arreglos unidimensionales (indexados desde cero hasta n-1) y
clases internas con campos pero sin mtodos.
o Mtodos estticos en la clase principal.
o Procedimientos predeclarados: ord, chr y len.
- Metasmbolos:
o [] significa opcional o sea 0 o 1 vez
o {} significa 0 o ms veces
o denotan los terminales (tokens)
o | denota opciones de regla


Program = "class" ident { ConstDecl | VarDecl | ClassDecl } "{" { MethodDecl } "}"
ConstDecl = "const" Type ident "=" ( number | charConst ) ";"
VarDecl = Type ident { "," ident } ";"
ClassDecl = "class" ident "{" { VarDecl } "}"
MethodDecl = ( Type | "void" ) ident "(" [ FormPars ] ")" { VarDecl } Block
FormPars = Type ident { "," Type ident }
Type = ident [ "[" "]" ]
Statement = Designator ( "=" Expr | "(" [ ActPars ] ")" | "++" | "--" ) ";"
| "if" "(" Condition ")" Statement [ "else" Statement ]
| for ( Expr ; [Condition] ; [Statement] ) Statement
| "while" "(" Condition ")" Statement
| "break" ";"
| "return" [ Expr ] ";"
| "read" "(" Designator ")" ";"
| "write" "(" Expr [ "," number ] ")" ";"
| Block
| ";"
Block = "{" { Statement } "}"
ActPars = Expr { "," Expr }
Condition = CondTerm { "||" CondTerm }
CondTerm = CondFact { "&&" CondFact }
CondFact = Expr Relop Expr
Expr = [ "-" ] Term { Addop Term }
Term = Factor { Mulop Factor }
Factor = Designator [ "(" [ ActPars ] ")" ]
| number
| charConst
| (true | false)
| "new" ident [ "[" Expr "]" ]
| "(" Expr ")".
Designator = ident { "." ident | "[" Expr "]" }
Relop = "==" | "!=" | ">" | ">=" | "<" | "<="
Addop = "+" | "-"
Mulop = "*" | "/" | "%"
Estructura Lxica
Palabras Reservadas: break, class, const, else, if, new, read, return, void, while, write
Patrones de Token: ident = letter { letter | digit | "_" }
number = digit { digit }
charConst = "'" ( printableChar | "\n" | "\r" ) "'"
Caracteres: letter = a .. z A .. Z
digit = 0 .. 9
printableChar = letter digit ! " # $ % & ' ( ) * + , - . / : ; < = > ? @
Operadores: + - * / % == != > >= < <= && || = ++ -- ; , . ( ) [ ] { }
Comentarios: iniciando en /* y terminando en */, adems de lnea //. Son permitidos
comentarios anidados


Detalles de interfaz de usuario

El editor contar con las opciones que el programador crea convenientes e incorporar una nica
opcin de compilacin llamada compilar. Esta opcin ser nica para el resto del desarrollo del
programa. Adicionalmente se deber agregar una opcin para el despliegue del rbol de sintaxis
(AST) de manera eficiente y clara. Debe contar adems con el despliegue de la fila y la columna
para el cuadro de texto principal, de manera que cuando se despliegue algn error, pueda ser
sencillo ubicarlo en el cuadro de texto principal.

El editor debe contemplar una opcin para abrir ms de un archivo fuente a la vez y que estos
puedan organizarse en pestaas.

As mismo el editor debe ser capaz de identificar la fila y la columna del texto que se tiene abierto.
Esto para brindar facilidades al momento de verificar errores sintcticos o lxicos

Puntos de evaluacin

La evaluacin de todo el proyecto se basa en la deteccin de errores y en la generacin del cdigo
correctamente. Para esta primera tarea, la evaluacin consiste en realizar el proceso de escaneo del
texto fuente (Scanner), la verificacin de los tokens con respecto a la gramtica (Parser) y la
posterior creacin de la estructura intermedia AST.

Los puntos que sern evaluados para este primer proyecto son los siguientes:

Interfaz de Usuario 15
Editor amigable. Opciones de compilacin funcionales.
Identificacin de cdigo por lnea y columna.
10
Manejo de archivos 5
Scanner 25
Tokens vlidos, Comentarios y caracteres especiales 15
Implementacin correcta de archivo lexico 5
Deteccin de errores lxicos (Claridad y Ubicacin) 5
Parser 45
Declaraciones (vars, const, mtodos, clases) 10
Statements (if, while, method calls, etc) 10
Expresiones (simples, complejas) 10
Implementacin correcta de gramtica .g4 5
Deteccin de errores sintcticos (Claridad y Ubicacin) 10
Documentacin 15
Formato y Contenido 7.5
Ortografa y Gramtica 7.5
100


Documentacin

La documentacin deber incluir las siguientes partes y no debe exceder las 7 hojas por un lado sin
incluir la portada:
Portada formal.
Anlisis del lenguaje (anlisis de la gramtica, del cdigo que puedo crear o no puedo crear
con ella)
Soluciones e implementacin. (cuestiones tcnica de la implementacin del proyecto)
Resultados obtenidos. (cuadro explicativo de lo realizado y lo no realizado nfasis en
esto ltimo)
Conclusiones del trabajo.
Bibliografa. (documentos con autor)

Aspectos Administrativos

La tarea se desarrollar en grupos de mximo dos personas.
El lenguaje de programacin ser C# de la plataforma dotNet Framework.
La fecha de entrega ser el Viernes 12 de Setiembre de 2014 hasta las 10:00 pm.
El medio de entrega ser el TEC-DIGITAL solamente.
Cualquier intento de plagio, copias totales o parciales de otras personas o de Internet, sern
castigados con nota de 0.
Programa de Ejemplo

class P

const int size = 10;

class Table {
int pos[];
int neg[];
}

Table val;
{
void Main ()
int x, i;
{
//---------- Initialize val ----------
val = new Table;
val.pos = new int[size]; val.neg = new int[size];
i = 0;
while (i < size) {
val.pos[i] = 0; val.neg[i] = 0;
i++;
}

//---------- Read values ----------
read(x);
while (-size < x && x < size) {
if (0 <= x) val.pos[x]++;
else val.neg[-x]++;
read(x);
}
}
}

You might also like