Página principal Juegos de ordenador Programación de juegos Relacionado con el autor Acerca de esta web
Infografía Gráficos por ordenador Desarrollo de Software Página no official de Gráficos Avanzados (URL)
-Página principal
-Infografía
-Juegos de ordenador
-Gráficos por ordenador
-Programación de juegos
-Desarrollo de Software
-Todos los lenguajes
-Legislación y software
-Teoría
-ASP
-CFM
-C/C++
-Misc
-Compiladores
-Microsoft Foundation Classes
-Microsoft Visual Studio
-Delphi
-Java
-Javascript
-Lisp
-Lua
-.NET
-PERL
-PHP
-Pythoon
-SQL
-Visual Basic
-VBScript
-Otros lenguajes
-Desarrollo de Webs
-Herramientas de desarrollo
-Relacionado con el autor
-Página no official de Gráficos Avanzados (URL)
-Acerca de esta web
 

How to: Declare a C string in Lex 
Compiladores
Autor M.L. Viñas Livschitz  Última actualización 2002-04-20  Inglés
 

Solution

A most common problem while developing a compiler for c-like languages are the c-strings, because the escape codes.

Instead of declaring them as normal symbols in lex most people decide to make an ad-hoc solution for this kind of symbol. One day, I found a lex-solution for this problem with many other interesting declarations.

The solution may be like this (note that not all possiblitites are considered, but it's useful):

alpha [a-zA-Z_]

alnum [a-zA-Z_0-9]

oct [0-7]

dec [0-9]

hex [0-9a-fA-F]

sign [+-]?

exp ([eE]{sign}{dec}+)

L [lL]

X [xX]

%%

"#".*\n ECHO;

"/*"([^*]|"*"+[^/*])*"*"+"/" printf("C comment\t%s\n", yytext);

"{"[^}]*"}" printf("Pascal comment\t%s\n", yytext);

"(*"([^*]|"*"+[^*)])*"*"+")" printf("Pascal comment\t%s\n", yytext);

"//".*$ printf("Objective C comment\t%s\n", yytext);

\"([^"\\\n]|\\.|\\\n)*\" printf("C string\t%s\n", yytext);

\`([^`\n]|\`\`)+\` printf("Pascal `string`\t%s\n", yytext);

0{oct}+ printf("C int base 8\t%s\n", yytext);

0{oct}+{L} printf("C long base 8\t%s\n", yytext);

0{X}{hex}+ printf("C int base 16\t%s\n", yytext);

0{X}{hex}+{L} printf("C long base 16\t%s\n", yytext);

{dec}+ printf("C int\t\t%s\n", yytext);

{dec}+{L} printf("C long\t\t%s\n", yytext);

{dec}+"."{dec}*{exp}? |

{dec}*"."{dec}+{exp}? |

{dec}+{exp} printf("C double\t%s\n", yytext);

\'[^'\\\n]\' |

\'\\[^0-7\n]\' |

\'\\([0-7]{1,3})\' printf("C char\t\t%s\n", yytext);

{alpha}{alnum}* printf("C name\t\t%s\n", yytext);

. |

\n ;

Todas y cada una de las marcas mostradas aqui pertenecen a sus respectivos propietarios. Por favor, lea nuestros términos, condiciones e información acerca de la privacidad.
Optimizado para una resolución mayor o igual a 1024x768, true-color, usando Microsoft Internet Explorer 5.0 o superior.
Este sitio fue diseñado y desarrollado por Manuel Lucas Viñas Livschitz.
Copyright 2000-2002 M.L.Viñas Livschitz.
To subscribe send a mail without subject to ultralight_magazine-subscribe@eListas.net
Para suscribirte manda un mail sin asunto a: ultralight_magazine-alta@eListas.net
To cancel subscription send a mail without subject to ultralight_magazine-unsubscribe@eListas.net
Para cancelar tu suscripción manda un mail sin asunto a: ultralight_magazine-baja@eListas.net

Contactar con el webmaster