Difference between revisions of "The Flex Lexical Analyzer/Exercise 1 - Printing the strings present in a C/C++ program"

From Wiki**3

< The Flex Lexical Analyzer
(New page: == 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...)
 
(The Solution)
 
(7 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
 
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.
 
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 ==
 
== The Solution ==
  
<text>
+
<source lang="text">
 
%option 8bit noyywrap yylineno stack
 
%option 8bit noyywrap yylineno stack
 
%{
 
%{
Line 13: Line 15:
 
}
 
}
 
%}
 
%}
%x X_STRING X_COMMENT
+
%x X_CHAR X_STRING X_COMMENT
 
%%
 
%%
 +
 +
\'              yy_push_state(X_CHAR);
 +
<X_CHAR>\\\'  ;
 +
<X_CHAR>\'    yy_pop_state();
 +
<X_CHAR>.  ;
 +
<X_CHAR>\n    yyerror("newline in character constant");
  
 
\"              yy_push_state(X_STRING); std::cout << std::endl << yylineno << ": ";
 
\"              yy_push_state(X_STRING); std::cout << std::endl << yylineno << ": ";
 
<X_STRING>\\\"  ECHO;
 
<X_STRING>\\\"  ECHO;
 +
<X_STRING>\\\\  ECHO;
 
<X_STRING>\"    yy_pop_state();
 
<X_STRING>\"    yy_pop_state();
 
<X_STRING>.    ECHO;
 
<X_STRING>.    ECHO;
Line 23: Line 32:
  
 
"/*"            yy_push_state(X_COMMENT);
 
"/*"            yy_push_state(X_COMMENT);
<X_COMMENT>"/*" yy_push_state(X_COMMENT);
 
 
<X_COMMENT>"*/" yy_pop_state();
 
<X_COMMENT>"*/" yy_pop_state();
 
<X_COMMENT>.|\n ;
 
<X_COMMENT>.|\n ;
Line 35: Line 43:
 
   return yylex();
 
   return yylex();
 
}
 
}
</text>
+
</source>
  
[[category:Compilers]]
+
[[category:Compiladores|Flex Lexical Analyzer]]
[[category:Teaching]]
+
[[category:Ensino]]

Latest revision as of 12:54, 24 March 2021

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

%option 8bit noyywrap yylineno stack
%{
#include <iostream>
inline void yyerror(const char *msg) {
  std::cerr << "Error at " << yylineno << ": " << msg << std::endl;
}
%}
%x X_CHAR X_STRING X_COMMENT
%%

\'              yy_push_state(X_CHAR);
<X_CHAR>\\\'  ;
<X_CHAR>\'     yy_pop_state();
<X_CHAR>.  ;
<X_CHAR>\n    yyerror("newline in character constant");

\"              yy_push_state(X_STRING); std::cout << std::endl << yylineno << ": ";
<X_STRING>\\\"  ECHO;
<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_pop_state();
<X_COMMENT>.|\n ;

"//".*$         ;

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

%%
int main() {
  return yylex();
}