Pregunta

Estoy usando lex en mi programa y me he topado con un problema Necesito un poco de ayuda.

Mi programa acepta su entrada en la forma de [algo "algo]. Esto está funcionando correctamente.

Sin embargo, también necesito para aceptar la forma [algo "algo].

¿Hay una manera que puedo tener algún tipo de primer caso en la lex que todas las entradas se ejecuta a través (como procesamiento previo), y luego tener el mismo, entrada modificada continuar por el resto de mi programa?

Esto es algo de lo que estoy hablando:

%%
.* {
   do preprocessing
   }

something{
   return SOMETHING;
   }

\" {
   return QUOTE;
   }
%%
¿Fue útil?

Solución

Bueno, en realidad se podría escribir un preprocesador de lex y ponerlo en su sistema de construcción, pero eso es probablemente exageración!

Puede utilizar las condiciones de inicio, cambiar entre ellos con el principio ya la que analizar la entrada en primer lugar, a continuación, utilizar unput para empujar caracteres de nuevo en la corriente, entonces una condición de inicio diferente puede analizar el resultado (consulte el Flex manual de ).

Hace poco escribí un programa de análisis de un lenguaje de configuración pitón similar que fue lo que hizo. el analizador tenía dos modos (condiciones de inicio), uno para contar fichas al inicio de una línea para determinar el alcance, y luego a otro a hacer el análisis real.

Estos métodos están bien, pero por lo general hay una mejor forma de hacerlo, sobre todo si su esquema de entrada no es enormemente compleja.

¿Hay una diferencia gramatical entre [algo "algo] y [algo" algo] para su programa? sería una regla de comer espacio en blanco hacer el truco?

Podría describir la lengua y la gramática un poco más ....?

Después de comentario:

Ok, así que básicamente tiene dos fichas, algo y cotización. Si sus fichas están separados por espacios en blanco que puede hacer lo siguiente:

%%
\"     {
       //this will match a single quote
       return QUOTE;
       }

[^" \t\n\r]+   {
               //this will match a run of anything thats not a quote, space, tab or line ending
               return SOMETHING;
               }

[ \t\n\r]      {
               //do nothing: i.e. ignore whitespace
               }

%%

Para su ALGO simbólico que también podría coincidir con algo así como [A-Za-z_][A-Za-z0-9_]* que coincidirá con una letra o un guión bajo seguido por 0 o más letras, guiones y números.

¿Le ayuda?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top