2010-11-12 7 views
12

Estoy tratando de analizar un idioma heredado (que es similar a 'C') usando FLEX y BISON. Todo está funcionando muy bien, excepto por las cadenas coincidentes.¿Cómo escribo una coincidencia no codiciosa en LEX/FLEX?

Este lenguaje legado bastante extraño no soporta citando caracteres en los literales de cadena, por lo que los siguientes son todos los literales de cadena válidos:

"hello" 
"" 
"\" 

estoy usando la siguiente regla para que coincida con los literales de cadena:

\".*\"   { yylval.strval = _strdup(yytext); return LIT_STRING; } 

Desafortunadamente este es un partido codicioso, lo que coincide con el código como el siguiente:

"hello", "world" 

Como una cadena única (hello", "world).

El cuantificador no codicioso habitual .*? no parece funcionar en FLEX. ¿Algunas ideas?

+0

esto podría usted: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html –

Respuesta

11

Solo prohíbe tener una cita entre las comillas.

 
\"[^"]*\" 
+0

Ahhh, lo intenté pero escapé incorrectamente de la comilla doble entre corchetes. ¡Muchas gracias! – stusmith

+0

idea brillante! Estaba pensando si hay un cambio. – xis

4

Backslash escaparon cotizaciones

Lo siguiente también le permite:

\"(\\.|[^\n"\\])*\" { 
     fprintf(yyout, "STRING: %s\n", yytext); 
    } 

y no permite a los saltos de línea dentro de las constantes de cadena.

Ej:

>>> "a\"b""c\d""" 
STRING: "a\"b" 
STRING: "c\d" 
STRING: "" 

y falla en:

>>> "\" 

Cuando la aplicación de tales características como C, asegúrese de buscar implementaciones Lex existentes, por ejemplo: el interés http://www.lysator.liu.se/c/ANSI-C-grammar-l.html

Cuestiones relacionadas