Resumen: Semana del 14 al 21 de marzo
(1/8)
Ejemplo de scanner: Analizador léxico de XML
- XML = eXtreme Markup Language
- Similar a HTML
- Gramática relativamente sencilla
(2/8)
Ejemplo de scanner: Gramática simplificada del XML
La siguiente gramática tiene un formato simplificado.
- all → head docs
- head → "<?" "xml" args "?>" | (vacío)
- docs → cdata doc docs | (vacío)
- doc → '<' ID args nest
- nest → "/>" | '>' docs "</" ID '>'
- args → arg args | (vacío)
- arg → ID ('=' STRING)?
- cdata → STRING | (vacío)
En este caso, ID y STRING cuentan como terminales
(3/8)
Ejemplo de scanner: yylex()
- El trabajo de la semana consiste en implementar yylex(), un analizador léxico.
- El analizador lee un archivo XML, y lo sub-divide en sus respectivos tokens
(4/8)
Ejemplo de scanner: yylex()
int yylex( char const** cursor, char const** yytext, int* yyleng, int* yyline );
- cursor: avanza por el texto hasta llegar al EOF
- yytext: contiene el texto del archivo XML
- yyleng: marca la longitud del token encontrado
- yyline: indica por cuál línea se va en el archivo XML
- El valor de retorno es el número de token
(5/8)
Ejemplo de scanner: lista de tokens
- La familia de <:
- <?
- </
- <?
- <!-- (para comentarios)
- ?>
- />
- --> (para comentarios)
- =
- xml
- ID (variable según contexto)
- STRING (variable según contexto, no necesariamente token)
(5/8)
El siguiente tema: procedimientos para optimización de código en tiempo de compilación
- Las cabeceras de archivo en C/C++ permiten agregar fácilmente código a un programa
- Cada archivo .h añade uno o más archivos .cpp
- Cuando se compila, los archivos .cpp agregados se convierten en código máquina, .obj
- Al final, esos archivos .obj se vinculan mediante un linker y generan un ejecutable
(6/8)
Procedimientos para optimización de código en tiempo de compilación (parte 2)
- Cuando uno agrega una biblioteca, se añade un archivo .h al programa
- Esos archivos agregan archivos .cpp
- Desafortunadamente, los archivos se compilan completos, y no sólo las funciones invocadas
- Un código no eficiente aumenta el tamaño del programa y puede afectar su rendimiento
(7/8)
Solución 1: linker inteligente
- El linker se podría encargar de excluir las funciones no invocadas
- Desafortunadamente eso aumentaría la complejidad del linker por lo que no es común
(8/8)
Solución 2: no agregar cabeceras a menos que sea estrictamente necesario
- Si se requiere absoluta eficiencia, las instrucciones de las librerías pueden programarse a mano en el mismo programa
- C++ ofrece mayor control sobre las secciones de las librerías a importar, mediante la sentencia using