M = (Q, E, T, q0, F), dónde:
* Q = {Programa,Caracteres, Cadena, InicioComentario, Multilinea, Unilinea, FinComentario};
* E = {caracteres y símbolos ASCII};
* q0 = Programa;
* F = {Programa};
* T = {Programa => ' => Caracteres, Caracteres => ' => Programa, Caracteres => No apóstrofo => Caracteres, Programa => \ => Cadena, Cadena => \ => Programa, Cadena => No comilla => Cadena, Programa => / => InicioComentario, InicioComentario => * => Multilinea, InicioComentario => / => Unilinea, Multilinea => No asterisco => Multilinea, Unilinea => No nueva línea => Unilinea, Multilinea => * => FinComentario, FinComentario => No barra => Multilinea, FinComentario => / => Programa, Programa => {No apostrofo, No comilla, No barra} => Programa, Unilinea => \n => Programa}.
-
Expresión regular
- Cadena: "[^"]*"
- Caracteres: '[^']*'
- Comentario simple (Unilinea): [^"']//[^\/\/]*[\n]+[^"']
- Comentario multilinea: [^"']/*(*(?!/)|[^*])**/[^"']
La implementación A se basa en el autómata descripto, y utiliza etiquetas GOTO para hacer efectivas las transiciones.
Dentro de cada etiqueta (relacionadas con los estados correspondientes) se utilizó la sentencia switch para validar el carácter de la transición, y el estado final correspondiente.
En la implementación, el final de la ejecución está representado por el fin del archivo (EOF).
La implementación B se basa en el autómata descripto, y utiliza recursividad para hacer efectivas las transiciones.
Dentro de cada función (relacionadas con los estados correspondientes) se utilizó la sentencia switch para validar el carácter de la transición, y el estado final correspondiente.
En la implementación, el final de la ejecución está representado por el fin del archivo (EOF).
Implementación / Orden | KB | MB | GB |
---|---|---|---|
A (GOTO) | 0.34 seg | 0.73 seg | 77 seg |
B (Recursividad) | 0.57 seg | ERROR (*) | ERROR (*) |
(*) Se genera un error en la ejecución de la implementación B, tanto para el test en el orden de los MB, como en el orden de los GB. La ejecución del programa finaliza con error luego de comenzada la ejecución. Entendemos que esto se debe a las llamadas recursivas que se incluyeron en la segunda implementación. Esto hace que la implementación A sea la solución más eficaz, pero además, la más eficiente dado que consume considerablemente menos recursos que la B.