Difference between revisions of "The Flex Lexical Analyzer/Exercise 2 - Printing the number of times access operators are used"

From Wiki**3

< The Flex Lexical Analyzer
(New page: == The Problem (in Portuguese) == Com o objectivo de gerar documentação, crie um analisador lexical (para a ferramenta Flex) que aceite um programa em C++ e que tenha como saída apenas...)
 
Line 1: Line 1:
 
== The Problem (in Portuguese) ==
 
== The Problem (in Portuguese) ==
  
Com o objectivo de gerar documentação, crie um analisador lexical (para a ferramenta Flex) que aceite um programa em C++ e que tenha como saída apenas os comentários existentes no programa, assim como o respectivo número de linha de início. Note que nem todas as ocorrências das sequências "/*" e "//" correspondem a inícios de comentários. Assuma que as sequências iniciadas por "/*" podem ser aninhadas.
+
Em C++, os operadores . e -> são utilizados para aceder a métodos e variáveis de instância. Com o objectivo de analisar o estilo de programação, crie um analisador lexical (para a ferramenta Flex) que aceite um programa em C++ e que tenha como única saída o número de ocorrências de cada um destes operadores. Note que nem todas as ocorrências das sequências . e -> correspondem a operadores.
  
 
== The Solution ==
 
== The Solution ==

Revision as of 21:30, 11 April 2010

The Problem (in Portuguese)

Em C++, os operadores . e -> são utilizados para aceder a métodos e variáveis de instância. Com o objectivo de analisar o estilo de programação, crie um analisador lexical (para a ferramenta Flex) que aceite um programa em C++ e que tenha como única saída o número de ocorrências de cada um destes operadores. Note que nem todas as ocorrências das sequências . e -> correspondem a operadores.

The Solution

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

  1. include <iostream>

int count = 0; inline void yyerror(const char *msg) {

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

} %} %x X_STRING X_COMMENT X_CHAR %%

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

\" yy_push_state(X_STRING); <X_STRING>\\\"  ; <X_STRING>\" yy_pop_state(); <X_STRING>.  ; <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 ;

"//".*$  ;

digit:"."|"."digit:  ;

"."|"->" count++;

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

%% int main() {

 yylex();
 std::cout << count << std::endl;
 return 0;

} </text>