- Curso: k2051.
- Año 2017.
- Grupo 06.
- Integrantes:
- Federico Hazama
- Agustin Pérez
- Camila Mamani
- Luciano Lisachi
- Nicolás Pérez
TP N3 Removedor de Comentarios
El objetivo es diseñar una máquina de estado que remueva comentarios, implementar dos versiones, e informar cual es la más eficiente mediante un benchmark
Implementación A
Estados como Funciones
Transición con llamadas a las funciones, recursivamente.
Implementación B
Estados como Etiquetas
Transición con goto.
Tabla Comparativa
Tamaño de Archivo | Implementación A | Implementación B |
---|---|---|
1KB | 0.061 s | 0.154 s |
1MB | No soporta | 0.164 s |
1GB | No soporta | 108.007 s |
Autómatas
digraph automataLiteralCadenas {
o->a [label= " \"/putchar(\")"];
a->a [label= "x/putchar(x)"];
a->b [label=" '\\' /putchar(\\)"]
b->a [label= "x/putchar(x)"];
a->c [label= " \"/putchar(\")"];
o [label= "codigo"];
a [label= "cadena"];
b [label= "escape cadena"];
c [label= "codigosub2"];
}
digraph automataConstanteCaracteres {
o->a [label= " '/putchar(')"];
a->a [label= "x/putchar(x)"];
a->b [label=" '\\' /putchar(\\)"]
b->a [label= "x/putchar(x)"];
a->c [label= " '/putchar(')"];
o [label= "codigo"];
a [label= "caracter"];
b [label= "escape caracter"];
c [label= "codigosub2"];
}
digraph automataCaracteresSueltos {
o->a[label= " x/putchar(x)"];
o [label= "codigo"];
a [label= "codigosub2"];
}
digraph automataComentarios {
o->a [label= " '\\'/ε"];
a->b [label= " '\\'/ε"];
b->b [label="x/ε"];
a->c [label= "'*'/ε"];
c->c [label="x/ε"];
c->d [label="x/ε"];
d->d [label="x/ε"];
d->d [label="'*'/ε"];
d->e [label= " '\\'/putchar(' ')"];
b->e [label="'\\n'/putchar('\\n')"];
o [label= "codigo"];
a [label= "barra1"];
b [label= "barra2"];
c [label= "asterisco"];
d [label="asteriscos palabras"];
e [label="codigo sin comentarios"];
}
Expresiones regulares para los autómatas
x:cualquier otro caracter
L1={"}U{x^n ^m x^k / n>=0, 0<=m<=1, k>=0}U{"}
L2= {'}U{x^n ^m x^k / 0<=n<=1, 0<=m<=1, k>=0}U{'}
L3= {x}
L4= {/}U{/ x^m '\n' / m>=0}U{* x^m * / m>=0} U {/}
Definiciones formales para los autómatas
automata1=({codigo, cadena, escape cadena, codigosub2}, {'"',x ,'\'}, Tsub1, codigo,{codigosub2} )
automata2=({codigo, caracter, escape caracter, codigosub2},{''',x ,'\' },Tsub2, codigo, {codigosub2})
automata3=({codigo, codigosub2}, {x}, Tsub3, codigo, {codigosub2})
automata4=({codigo,barra1,barra2,asterisco,asteriscos palabras,codigo sin comentarios}, {'\n', '/', x,'*' }, codigo, {codigo sin comentarios} )
Máquina de estados
digraph maquinaDeEstados{
o->a [label= " \"/putchar(\")"];
a->a [label= "x/putchar(x)"];
a->b [label=" '\\' /putchar(\\)"]
b->a [label= "x/putchar(x)"];
a->a [label= " \"/putchar(\")"];
o->c [label= " '/putchar(')"];
c->c [label= "x/putchar(x)"];
c->d [label=" '\\' /putchar(\\)"]
d->c [label= "x/putchar(x)"];
c->o [label= " '/putchar(')"];
o->o[label= " x/putchar(x)"];
o->e [label= " '\\'/ε"];
e->f [label= " '\\'/ε"];
f->f [label="x/ε"];
e->g [label= "'*'/ε"];
g->g [label="x/ε"];
g->h [label="x/ε"];
h->h [label="x/ε"];
h->h [label="'*'/ε"];
h->o [label= " '\\'/putchar(' ')"];
b->o [label="'\\n'/putchar('\\n')"];
o [label= "codigo sin comentarios"];
a [label= "cadena"];
b [label= "escape cadena"];
c [label= "caracter"];
d [label= "escape caracter"];
e [label= "barra1"];
f [label= "barra2"];
g [label= "asterisco"];
h [label="asteriscos palabras"];
}