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