4.7 Procedimiento de Declaración HLA v2.0
HLA v2.0 Analizador Léxico Diseño Documentación El analizador léxico HLA (léxico) se encarga de escanear el archivo de entrada de la fuente y la traducción de secuencias de texto ("lexemas") en objetos pequeños que el compilador puede fácilmente proceso (por ejemplo, números enteros). Estos valores pequeños son a menudo llamados "tokens" (aunque, técnicamente, un token es todos los datos asociados a un lexema, no sólo la codificación de entero pequeño de ese lexema). El analizador léxico es también responsable de la conversión de secuencias de dígitos en su forma numérica, así como el procesamiento de otras constantes literales, para la eliminación de los comentarios y espacios en blanco del archivo de origen, y por cuidar de muchos otros detalles mecánicos. Análisis léxico, o la digitalización, es una de las mayoría de los componentes que consumen mucho tiempo del proceso de compilación. Por lo tanto, se debe tener cuidado al escribir el analizador léxico o el compilador / ensamblador resultante será más lenta de lo que debe ser. Una forma de acelerar los programas, por supuesto, es escribir ese código en lenguaje ensamblador en lugar de un alto nivel (o lenguaje de muy alto nivel). Analizadores léxicos de alto rendimiento, en particular, pueden hacer uso de algoritmos que son más fácilmente escritas en lenguaje ensamblador que en lenguajes de alto nivel. Lexer HLA v1.x 's, por ejemplo, fue escrito usando el lenguaje LEX / FLEX. Analizador léxico HLA v2.x 's fue escrito en lenguaje ensamblador (HLA). Aunque HLA v2.x 'lexer s no está escrito en la forma más optimizada a mano, a menudo es un orden de magnitud (o mejor) más rápido que el HLA v1.x' lexer s. Parte de la razón para la mejora de la velocidad se debe a la utilización de lenguaje ensamblador (y el hecho de que es más fácil y más natural para expresar algoritmos de alto rendimiento en el montaje), la otra parte de la razón es que lexer HLA v2.xy 's utiliza algoritmos mejores.
Las palabras y los identificadores reservados La otra tarea que consume tiempo importante es diferenciar palabras y los identificadores reservados. HLA compatible con tres tipos de identificadores especiales (palabras reservadas): tiempo de compilación instrucciones, funciones de compilación en tiempo y palabras reservadas estándar.
Las declaraciones en tiempo de compilación Declaraciones en tiempo de compilación (y algunas otras directivas) siempre empiezan con un "#" y sólo en tiempo de compilación declaración comienzan con este símbolo, por lo que es muy fácil diferenciar las declaraciones en tiempo de compilación y otros lexemas. Para diferenciar las declaraciones en tiempo de compilación individuales, el analizador léxico HLA utiliza una búsqueda lineal simple. Búsquedas lineales, por supuesto, son lentos, pero esto no afecta al rendimiento del analizador léxico HLA mucho debido a que: (1) Sólo hay una docena de declaraciones com-pila de tiempo, y declaraciones (2) en tiempo de compilación raramente ocurrir en un archivo de origen. Aquí, la simplicidad de las declaraciones en tiempo de compilación de HLA "ing tokeniz-" supera los dudosos beneficios de un algoritmo de alto rendimiento.
Los nombres y los identificadores de función en tiempo de compilación Nombres de las funciones de tiempo de compilación de HLA y pseudo-variables comienzan escapadas con un símbolo "@". Al igual que las declaraciones en tiempo de compilación, es muy fácil diferenciar nombres de las funciones de tiempo de compilación de otros lexemas. Diferenciación de funciones-pila de tiempo com una de la otra, sin embargo, no es tan fácil como la diferenciación de los estados en tiempo de compilación. En lugar de una docena, hay casi 200 diferentes identificadores de función en tiempo de compilación. Aunque estos nombres que no aparecen con frecuencia en un archivo de fuente de HLA, el número de estas funciones impide el uso de una búsqueda lineal simple. El analizador léxico HLA utiliza una combinación hash de algoritmo de búsqueda / binario para diferenciar las funciones de tiempo de compilación iden-cadores (o rechazar un identificador ilegal). En primer lugar, HLA quita el primer carácter del identificador (siempre una "@") y luego se transfiere a uno de los dieciséis secuencias de códigos diferentes en función de la longitud del identificador (nombres de las funciones de tiempo de compilación deben ser de 1 .. 16 caracteres). Estas secuencias de código a continuación, utilizar un algoritmo de búsqueda binaria para comparar la actual al quilar lexema en contra de los nombres de las funciones de tiempo de compilación conocidos. Se necesita, como máximo, cinco comparaciones de cadenas de aceptar o rechazar un nombre de función en tiempo de compilación. La comparación de cadenas del código de reconocimiento de la función de tiempo de compilación utiliza es extremadamente eficiente. Cuando el analizador léxico determina la longitud del nombre de la función en tiempo de compilación supuesto, también carga los caracteres de la cadena en el EAX, EBX, ECX, EDX y registros. Las cadenas de longitud 1 .. 4 se pasan en EAX, cadenas de longitud 5 .. 8 se pasan en EAX y EBX, cadenas de longitud 9 .. 12 se pasan en EAX, EBX, ECX y, y, finalmente, cadenas de longitud 13 .. 16 se pasan en EAX, EBX, ECX, EDX y. Por lo tanto, para comparar cadenas, todas las necesidades de código no se comparan tres y cincuenta y nueve registros en contra de un conjunto de ocho, dieciséis o treinta y dos constantes de bits. La búsqueda binaria se lleva a cabo por los objetivos de las ramas después de estas comparaciones. Una comparación típica cadena tiene el siguiente aspecto: cmpfuncs_6_7: cmp (eax, funcstr ("istype", 0, 4)); jb cmpfuncs_6_8; ja cmpfuncs_6_10; CMP (BX, funcstr ("istype", 4, 2)); jb cmpfuncs_6_8; ja cmpfuncs_6_10; mov (tkn_at_istype, eax); mov (tc_func, ebx); jmp funcsDone; El código anterior compara la cadena de seis caracteres en BX: EAX en contra de la constante de cadena "istype". Esto comprueba la cadena para ver si coincide con la función de tiempo de compilación "@ istype" (recuerde, el analizador léxico se despoja de la "@" porque todos los identificadores de función de tiempo de compilación comienzan con "@"). En este código, "funcstr" es una macro que convierte tres y cincuenta y nueve caracteres de una cadena constante a un valor entero cuyos bytes corresponden a los códigos ASCII para los caracteres de la cadena. Los dos últimos parámetros de la macro "funcstr" son la posición de partida y los valores de longitud de la subcadena extracción. Por ejemplo, funcstr ("abcdefg", 0, 4) extrae la cadena "abcd" y lo traduce al valor de 32 bits $ 6162_6364 (los códigos ASCII para "a", "b", "c" y "d "). Las instrucciones de JA y JB anteriores transferir el control a una secuencia adecuada si el nombre de la función que aparece en BX: EAX es lexicográficamente menor o mayor que "istype". Si el identificador actual es igual a "istype" entonces el control se cae al código que devuelve los valores de los símbolos en las EAX y EBX registros.
|