Ejemplos
Como problema trivial, considere el copiar de un fichero de entrada mientras que agrega 3 a cada número positivo divisible por 7. Aquí está un programa fuente conveniente de Lex
el %% k interna; [ 0-9]+ {k = atoi(yytext);
si (k%7 == 0) printf("%d", k+3); el printf("%d", k);
}
para hacer apenas eso. La regla [ 0-9]+ reconoce cadenas de dígitos; el atoi convierte los dígitos a binario y almacena el resultado en k. Utilizan al operador % (resto) para comprobar si k es divisible por 7; si es, es incrementada por 3 mientras que se pone en escrito. Puede ser opuesto que este programa alterará los artículos tales de la entrada como 49.63 o X7. Además, los incrementos el valor absoluto de toda la negativa numera divisible por 7. Para evitar esto, apenas agregue algunas más reglas después la activa, como aquí:
el %% k interna; -?[0-9]+ {k = atoi(yytext);
¿printf("%d", k%7 == 0? k+3: k); } ECO de
-?[0-9.]+; [ ECO de A-Za-z][A-Za-z0-9]+;
Las secuencias numéricas que contienen un ``.'' o precedidas por una letra serán tomadas por una de las dos reglas pasadas, y no cambiadas. El si-otro ha sido substituido por una expresión condicional de C para ahorrar el espacio; la forma a?b:c significa `` si un b de entonces c otra ' '.
Para un ejemplo de la estadística la acopio, aquí es un programa que los histogramas las longitudes de las palabras, donde una palabra se define como cadena de letras.
lengs[100 interno ]; el %% [ a-z]+ lengs[yyleng]++;
. | \n; yywrap() del %% {i interno; words\n del
printf("Length No."); for(i=0; i<100; i++) si
(lengs[i ] > 0) printf("%5d%10d\n", i, lengs[i ]); return(1);
}
Este programa acumula el histograma, mientras que no produce ninguna salida. En el extremo de la entrada imprime la tabla. La declaración final return(1); indica que Lex debe realizar el wrapup. Si el yywrap vuelve cero (falso) implica que la entrada adicional está disponible y el programa es continuar leyendo y procesando. Para proporcionar un yywrap que nunca vuelve causas verdaderas un bucle infinito.
Como ejemplo más grande, aquí están algunas partes de un programa escrito por N. L. Schryer al FORTRAN de la precisión doble del convertido al FORTRAN de la sola precisión. Porque el FORTRAN no distingue letras superiores y minúsculas, esta rutina comienza definiendo un sistema de clases incluyendo ambos casos de cada letra:
a [ aA ] b [ bB ] c [ C ]... z [ zZ ]
Una clase adicional reconoce el espacio blanco:
W [ \t ] *
La primera regla cambia el `` '' de la precisión doble `` al '' verdadero, o el `` '' de la PRECISIÓN DOBLE `` a VERDADERO ' '.
¿{d}{o}{u}{b}{l}{e}{W}{p}{r}{e}{c}{i}{s}{i}{o}{n}
{printf(yytext[0]=='d '? "verdadero": "VERDADERO");
}
El cuidado se toma a través de este programa para preservar el caso (superior o más bajo) del programa original. Utilizan al operador condicional para seleccionar la forma apropiada de la palabra clave. La regla siguiente copia indicaciones de la tarjeta de continuación de evitar de confundirlas con constantes:
^ "" [ ^ 0 ] ECOS;
En la expresión regular, las cotizaciones rodean los espacios en blanco. Se interpreta como `` principio de la línea, entonces cinco en blanco, entonces todo menos espacio en blanco o cero.'' Observe los dos diversos significados de ^. allí siguen algunas reglas para cambiar constantes de la precisión doble a las constantes flotantes ordinarias.
[ 0-9]+{W}{d}{W}[+-]?{W}[0-9]+ | [ 0-9]+{W}"."{W}{d}{W}[+-]?{W}[0-9]+ | ""{W}[0-9]+{W}{d}{W}[+-]?{W}[0-9]+ {/* */for(p=yytext de
las constantes del convertido; * p! = 0; p++) {si (*
== ' d ' de p || * == ' D ') * p=+ ' e ' - ' d ' de p; ECO;
}
Después de que se reconozca la constante de la coma flotante, es explorada por para que el lazo encuentre la letra d o D. El programa que el ' e'-'d ', que lo convierte a la letra siguiente del alfabeto. La constante modificada, ahora solo-precisio'n, se pone en escrito otra vez. Sigue un serie de nombres que deban ser respelled para quitar su d inicial. Usando el yytext del arsenal la misma acción es suficiente para todos los nombres (solamente una muestra de una lista algo larga se da aquí).
{d}{s}{i}{n} | {d}{c}{o}{s} | {d}{s}{q}{r}{t} | {d}{a}{t}{a}{n} | ... {d}{f}{l}{o}{a}{t} el printf("%s", yytext+1);
Otra lista de nombres debe tener d inicial cambiante para firmar con iniciales a:
{d}{l}{o}{g} | {d}{l}{o}{g}10 | {d}{m}{i}{n}1 | {d}{m}{a}{x}1 {yytext[0 ] = + ' a ' - ' d '; ECO;
}
Y una rutina debe tener d inicial cambiante a r inicial:
{d}1{m}{a}{c}{h} {yytext[0 ] = + ' r ' - ' d ';
Para evitar los nombres tales que el dsinx que es detectado como casos del dsin, algunas reglas finales toma palabras más largas como identificadores y copia algunos caracteres el sobrevivir:
[ A-Za-z][A-Za-z0-9 ] * | [ 0-9]+ | \n | . ECO;
Observe que este programa no es completo; no se ocupa de los problemas del espaciamiento en el FORTRAN o del uso de palabras claves como identificadores