Reglas ambiguas y Definiciones de la fuente

 

Reglas Ambiguas

Lex puede manejar especificaciones ambiguas. Cuando más de una expresión puede emparejar la entrada actual, Lex elige como sigue:

1) se prefiere el fósforo más largo.

2) entre las reglas que emparejaron el mismo número de caracteres, la regla dada primero se prefiere.

Así, suponga las reglas

                      acción de la palabra clave del número entero...; 
[ acción del identificador de a-z]+...;

ser dado en esa orden. Si la entrada es números enteros, se toma como identificador, porque [ a-z]+ empareja 8 caracteres mientras que los fósforos solamente 7 del número entero. Si la entrada es número entero, ambas reglas emparejan 7 caracteres, y se selecciona la regla de la palabra clave porque fue dada primero. Cualquier cosa más corto (e.g. interno) no emparejará el número entero de la expresión y así que la interpretación del identificador se utiliza.

El principio de preferir el fósforo más largo hace las reglas que contienen expresiones como * peligroso. Por ejemplo, '. * ' pudo parecerse una buena manera de reconocer una secuencia en apóstrofes. Pero es una invitación para que el programa lea lejos a continuación, buscando un apóstrofe distante. Presentado con la entrada

                ' sentencia primero ' aquí protegida, ' en segundo
lugar ' aquí

la expresión antedicha emparejará

                   ' sentencia primero ' aquí protegida, ' en 
segundo lugar '

cuál no es probablemente qué fue deseada. Una regla mejor está de la forma

                                  ' [ ^'\n ] * '

cuál, en la entrada antedicha, parará después de ' primero '. Las consecuencias de errores como esto son atenuadas por el hecho que. el operador no emparejará newline. Así expresiones como * parada en la línea actual. No intente derrotar esto con expresiones como (.|\n)+ o equivalentes; el programa generado Lex intentará leer el fichero de entrada entero, causando desbordamientos internos del almacenador intermediario.

Observe que Lex está repartiendo normalmente el flujo de entradas, no buscando para todos los fósforos posibles de cada expresión. Esto significa que cada carácter está considerado una vez y solamente una vez. Por ejemplo, suponga que está deseado para contar ocurrencias de la ella y del él en un texto de entrada. Algunas reglas de Lex para hacer esto pudieron ser

                                 ella s++; él h++; \n    |                                   . ;

donde las dos reglas pasadas no hacen caso de todo además él y de ella. Recuerde eso. no incluye newline. Puesto que ella lo incluye, Lex no reconocerá normalmente los casos del él la incluyó adentro, desde entonces una vez que la haya pasado que se van esos caracteres.

El usuario quisiera a veces eliminar esta opción. Los medios del RECHAZO de la acción `` van hacen el '' siguiente del alternativa. Causa cualquier regla era segunda opción después de que la regla actual que se ejecutará. La posición del indicador de la entrada se ajusta por consiguiente. Suponga que el usuario realmente desea contar los casos incluidos del él:

                            ella {s++; RECHAZO;} él {h++; RECHAZO;}
\n    |                              . ;

estas reglas son una forma de cambiar el ejemplo anterior para hacer apenas eso. Después de contar cada expresión, se rechaza; siempre que sea apropiado, la otra expresión entonces sea contada. En este ejemplo, por supuesto, el usuario podría observar que ella lo incluye pero no viceversa, y omite la acción del RECHAZO encendido él; en otros casos, sin embargo, no sería posible a priori decir qué entrar caracteres eran en ambas clases.

Considere las dos reglas

                          a[bc]+ {...; RECHAZO;} a[cd]+ {...; 
RECHAZO;}

Si la entrada es ab, solamente la primera regla empareja, y en anuncio solamente los segundos fósforos. El accb de la secuencia de la entrada empareja la primera regla para cuatro caracteres y entonces la segunda regla para tres caracteres. En contraste, el accd de la entrada conviene con la segunda regla para cuatro caracteres y entonces la primera regla para tres.

En general, el RECHAZO es útil siempre que el propósito de Lex no sea repartir el flujo de entradas pero detectar todos los ejemplos de algunos artículos en la entrada, y los casos de estos artículos pueden traslapar o incluirse. Suponga que una tabla del digram de la entrada está deseada; los digrams se traslapan normalmente, ésa es la palabra se considera para contener el th y lo. Si se asume que un arsenal de dos dimensiones nombrado digram que se incrementará, la fuente apropiada es

                el %% [ a-z][a-z ] 
{digram[yytext[0]][yytext[1]]++; RECHAZO; }. ; 
\n;

donde está necesario el RECHAZO tomar un par de la letra que comienza en cada carácter, más bien que en cada otro carácter.

Definiciones

Recuerde el formato de la fuente de Lex:

                               {definiciones} el %% {reglas} el %% {rutinas de usuario}

Hasta ahora solamente se han descrito las reglas. El usuario necesita opciones adicionales, aunque, para definir las variables para el uso en su programa y para el uso de Lex. Éstos pueden entrar en la sección de las definiciones o en la sección de las reglas.

Recuerde que Lex está dando vuelta a las reglas en un programa. Cualquier fuente no interceptada por Lex se copia en el programa generado. Hay tres clases de tales cosas.

1) cualquier línea que no sea parte de una regla o de una acción de Lex que comience con un espacio en blanco o una lengüeta se copia en el programa generado Lex. Tal fuente entrada antes del primer delimitador del %% será externa a cualquier función en el código; si aparece inmediatamente después del primer %%. aparece en un lugar apropiado para los declaraciones en la función escrita por Lex que contenga las acciones. Este material debe parecer fragmentos del programa, y debe preceder la primera regla de Lex. Como efecto secundario del antedicho, las líneas que comienzan con un espacio en blanco o una lengüeta, y que contienen un comentario, se pasan a través al programa generado. Esto se puede utilizar para incluir comentarios en la fuente de Lex o el código generado. Los comentarios deben seguir a la convención de lengua del anfitrión.

2) cualquier cosa incluido entre las líneas que contienen solamente % {y %} se copia hacia fuera como arriba. Se desechan los delimitadores. Este formato permite el incorporar del texto como las instrucciones de preprocesador que deben comenzar en la columna 1, o el copiar de las líneas que no parecen programas.

3) cualquier cosa después del tercer delimitador del %%, sin importar formatos, el etc., se copia hacia fuera después de la salida de Lex.

Las definiciones previstas para Lex se dan antes del primer delimitador del %%. Cualquier línea en esta sección no contenida entre % {y %}, y begining en la columna 1, se asume para definir secuencias de la substitución de Lex. El formato de tales líneas es traducción conocida y causa la secuencia dada como traducción que se asociará al nombre. El nombre y la traducción se deben separar por por lo menos una en blanco o lengüeta, y el nombre debe comenzar con una letra. La traducción se puede entonces decir en voz alta por el sintaxis {conocido} en una regla. El usar {D} para los dígitos y {E} para un campo del exponente, por ejemplo, pudo abreviar reglas para reconocer números:

                   D [ 0-9 ] E [ DEde][-+]?{D}+ el %% {printf("integer de 
D}+"); ¿{D}+"."{d}*({e})?   |                     ¿{D}*"."{d}+({e})?   |                     {D}+{E}

Observe las primeras dos reglas para los números verdaderos; requiera una coma y contenga un campo opcional del exponente, pero el primer requiere por lo menos un dígito antes de la coma y el segundo requiere por lo menos un dígito después de la coma. Manejar correctamente el problema se presentó por una expresión del FORTRAN tal como 35.EQ.I, que no contiene un número verdadero, una regla sensible al contexto por ejemplo

                      [ printf("integer 0-9]+/"."eq");

podía ser utilizado además de la regla normal para los números enteros.

La sección de las definiciones puede también contener otros comandos, incluyendo la selección de una lengua del anfitrión, de una tabla del juego de caracteres, de una lista de las condiciones del comienzo, o de los ajustes al tamaño del defecto de órdenes dentro de Lex sí mismo para programas fuente más grandes. Estas posibilidades se discuten abajo bajo `` resumen del formato de la fuente, sección 12 del ''.

 < atras  siguiente >

Hosted by www.Geocities.ws

1