(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 | + | 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 == |
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.
<text> %option 8bit noyywrap yylineno stack %{
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 ;
"//".*$ ;
"."|"->" count++;
.|\n ; /* ignore the rest */
%% int main() {
yylex(); std::cout << count << std::endl; return 0;
} </text>