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

From Wiki**3

< The Flex Lexical Analyzer

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

[EXPLANATION COMING SOON]

%option 8bit noyywrap yylineno stack
%{
#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_pop_state();
<X_COMMENT>.|\n ;

"//".*$         ;

[[:digit:]]"."[[:digit:]]|"."[[:digit:]]   ;

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

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

%%
int main() {
  yylex();
  std::cout << count << std::endl;
  return 0;
}