Cuando una expresión escrita como arriba se empareja, Lex ejecuta la acción correspondiente. Esta sección describe algunas características de Lex que ayuden en acciones de la escritura. Observe que hay una acción del defecto, que consiste en el copiar de la entrada a la salida. Esto se realiza en todas las secuencias emparejadas no de otra manera. Así el usuario de Lex que desea absorber la entrada entera, sin producir ninguna salida, debe proporcionar reglas al fósforo todo. Cuando Lex se está utilizando con Yacc, ésta es la situación normal. Uno puede considerar que las acciones son qué se hace en vez de copiar la entrada a la salida; así, en general, una regla que copia simplemente puede ser omitida. También, una combinación del carácter que se omite de las reglas y que aparece pues la entrada es probable ser impresa en la salida, así llamando la atención al boquete en las reglas.
Una de las cosas más simples que pueden ser hechas es no hacer caso de la entrada. Especificar una declaración nula de C,; como una acción causa este resultado. Una regla frecuente es
[ \t\n ];
cuál hace los tres caracteres de espaciamiento (espacio en blanco, lengüeta, y newline) para ser no hecho caso.
Otra manera fácil de evitar acciones de la escritura es el carácter de la acción |, que indica que la acción para esta regla es la acción para la regla siguiente. El ejemplo anterior habría podido también ser escrito
"" "\n" del "\t"
con el mismo resultado, aunque en diverso estilo. Las cotizaciones alrededor del \n y del \t no se requieren.
En acciones más complejas, el usuario deseará a menudo saber el texto real como el cual emparejó una cierta expresión [ a-z]+. Lex deja este texto en una matriz de caracteres externa nombrada yytext. Así, de imprimir el nombre encontrado, una regla tiene gusto
[ a-z]+ printf("%s", yytext);
imprimirá la secuencia en yytext. El printf de la función de C acepta una discusión y datos del formato que se imprimirán; en este caso, el formato es `` '' de la secuencia de la impresión (% que indica la conversión de datos, y s que indica el tipo de la secuencia), y los datos son los caracteres en yytext. Tan esto lugares justos la secuencia emparejada en la salida. Esta acción es tan común que puede ser escrito como ECO:
[ ECO de a-z]+;
está igual que el antedicho. ¿Puesto que la acción del defecto es justa imprimir los caracteres encontrados, uno pudo preguntar porqué elasticidad una regla, como ésta, cuál especifica simplemente la acción del defecto? Tales reglas se requieren a menudo para evitar de emparejar una cierta otra regla que no se desee. Por ejemplo, si hay una regla que los fósforos la leen emparejará los casos de leído contenido en pan o los reajustará normalmente; para evitar esto, una regla de la forma [ a-z]+ es necesario. Esto se explica más lejos abajo.
Es a veces más conveniente saber el final se ha encontrado de qué; por lo tanto Lex también proporciona un yyleng de la cuenta del número de los caracteres emparejados. Para contar el número de palabras y el número de caracteres en palabras en la entrada, el usuario pudo escribir [ a-zA-Z]+ {words++; carbones + = yyleng;} cuál acumula adentro socarra el número de caracteres en las palabras reconocidas. El carácter pasado en la secuencia emparejada se puede alcanzar cerca
yytext[yyleng-1 ]
De vez en cuando, una acción de Lex puede decidir a que una regla no ha reconocido el palmo correcto de caracteres. Dos rutinas se proporcionan a la ayuda de esta situación. Primero, el yymore() se puede llamar para indicar que la expresión siguiente de la entrada reconocida debe ser clavada con tachuelas encendido al extremo de esta entrada. Normalmente, la secuencia siguiente de la entrada sobreescribiría la entrada actual en yytext. En segundo lugar, (n) yyless se puede llamar para indicar que no todos los caracteres emparejados por la expresión actualmente acertada están deseados ahora. La discusión n indica el número de caracteres en el yytext que se conservará. Otros caracteres emparejados previamente se vuelven a la entrada. Esto proporciona la misma clase de lookahead ofrecida por/el operador, pero en una diversa forma.
Ejemplo: Considere una lengua que defina una secuencia como sistema de caracteres entre las marcas de la cita ("), y proporciona eso para incluir" en una secuencia que debe ser precedida por a \. la expresión regular que empareja eso es algo confusa, de modo que puede ser que sea preferible escribir
\"[^"]* {si yymore() del '\\') del ==
(yytext[yyleng-1 ]; ... usuario normal que procesa}
cuál la voluntad, cuando está hecha frente con una secuencia tal como "abc\"def "primero empareja los cinco caracteres" ABC \; entonces la llamada al yymore() hará la parte siguiente de la secuencia, "def, para ser clavada con tachuelas en el extremo. Observe que la cotización final que termina la secuencia se debe tomar en el código etiquetado `` normal que procesa ' '.
El yyless() de la función se pudo utilizar para tratar de nuevo el texto en varias circunstancias. Considere el problema de C de distinguir la ambigüedad del ``=-a ' '. Suponga que está deseado para tratar esto como ``=- un '' sino para imprimir un mensaje. Una regla pudo ser
= - [ a-zA-Z ] ambiguous\n {del printf("Op (=
-)"); yyless(yyleng-1); ... acción para = -...}
qué impresiones un mensaje, las vueltas la letra después del operador al flujo de entradas, y los convites el operador como ``=-''. él se pudieron desear alternativomente para tratar esto como ``= - ' '. Para hacer esto, vuelta justa el signo de menos así como la letra a la entrada:
= - [ a-zA-Z ] ambiguous\n {del printf("Op (= -)");
yyless(yyleng-2); ... acción para =...}
realizará la otra interpretación. Observe que las expresiones para los dos casos pudieron ser escritas más fácilmente
= -/[ A-Za-z ]
en el primer caso y
=/- [ A-Za-z ]
en el segundo; no se requeriría ninguna reserva en la acción de la regla. No es necesario reconocer el identificador entero para observar la ambigüedad. La posibilidad del '' ``=-3, sin embargo, marcas
\t\n de =-/[^ ]
una regla mejor inmóvil.
Además de estas rutinas, Lex también permite el acceso a las rutinas de I/O él las aplicaciones. Son:
1) input() que vuelve el carácter siguiente de la entrada;
2) output(c) que escribe el carácter c en la salida; y
3) el unput(c) empuja el carácter c detrás sobre el flujo de entradas que se leerá más adelante por el input().
Por el defecto estas rutinas son proporcionadas como definiciones macro, pero el usuario puede eliminarlas y proveer versiones privadas. Estas rutinas definen la relación entre los archivos externos y los caracteres internos, y la necesidad toda se conserve o se modifica constantemente. Pueden ser redefinidos, para hacer entrar o salida que se transmitirá a o desde lugares extraños, incluyendo otros programas o memoria interna; pero el juego de caracteres usado debe ser constante en todas las rutinas; un valor de cero volvió por la entrada debe significar el extremo del archivo; y la relación entre el unput y la entrada debe ser conservada o el lookahead de Lex no trabajará. ¿Lex no anticipa en todos si no lo hace tuvo que, solamente cada conclusión de la regla en + *? o $ o el contener/implica el lookahead. Lookahead es también necesario emparejar una expresión que sea un prefijo de otra expresión. Vea abajo para una discusión del juego de caracteres usado por Lex. La biblioteca de Lex del estándar impone un límite de 100 caracteres ante reserva.
Otra rutina de la biblioteca de Lex que el usuario deseará a veces redefinir es el yywrap() se llama que siempre que Lex alcance un end-of-file. Si el yywrap vuelve un 1, Lex continúa con el wrapup normal en el extremo de la entrada. A veces, sin embargo, es conveniente arreglar para que más entrada llegue de una nueva fuente. En este caso, el usuario debe proporcionar un yywrap que arregle para la nueva entrada y vuelva 0. Esto manda a Lex para continuar procesando. El yywrap del defecto vuelve siempre 1.
Esta rutina es también un lugar conveniente para imprimir las tablas, los resúmenes, el etc. en el final de un programa. Observe que no es posible escribir una regla normal que reconozca end-of-file; el único acceso a esta condición está a través de yywrap. En hecho, a menos que una versión privada del input() se provea el contener del archivo anula no puede ser dirigido, puesto que un valor de 0 vuelto por la entrada se toma para ser end-of-file.