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.
[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;
}