The Flex Lexical Analyzer/Exercise 1 - Printing the strings present in a C/C++ program

From Wiki**3

< The Flex Lexical Analyzer
Revision as of 21:53, 11 April 2010 by Root (talk | contribs)

The Problem (in Portuguese)

A internacionalização de software é uma tarefa que requer a localização de todas as cadeias de caracteres que existem em programas. Para facilitar o processo de tradução das mensagens, crie um analisador lexical (utilizando a ferramenta Flex) que permita localizar e apresentar na saída todas as cadeias de caracteres de programas escritos em C++, assim como a linha em que ocorrem. Note que nem todas as ocorrências do carácter '\"' correspondem a delimitadores de cadeias de caracteres.

[EXPLANATION COMING SOON]

The Solution

<text> %option 8bit noyywrap yylineno stack %{

  1. include <iostream>

inline void yyerror(const char *msg) {

 std::cerr << "Error at " << yylineno << ": " << msg << std::endl;

} %} %x X_STRING X_COMMENT %%

\" yy_push_state(X_STRING); std::cout << std::endl << yylineno << ": "; <X_STRING>\\\" ECHO; <X_STRING>\" yy_pop_state(); <X_STRING>. ECHO; <X_STRING>\n yyerror("newline in string");

"/*" yy_push_state(X_COMMENT); <X_COMMENT>"/*" yy_push_state(X_COMMENT); <X_COMMENT>"*/" yy_pop_state(); <X_COMMENT>.|\n ;

"//".*$  ;

.|\n  ; /* ignore the rest */

%% int main() {

 return yylex();

} </text>