(→The Solution) |
(→The Solution) |
||
(One intermediate revision by the same user not shown) | |||
Line 7: | Line 7: | ||
[EXPLANATION COMING SOON] | [EXPLANATION COMING SOON] | ||
− | <text> | + | <source lang="text"> |
%option 8bit noyywrap yylineno stack | %option 8bit noyywrap yylineno stack | ||
%{ | %{ | ||
Line 32: | Line 32: | ||
"/*" yy_push_state(X_COMMENT); | "/*" yy_push_state(X_COMMENT); | ||
− | |||
<X_COMMENT>"*/" yy_pop_state(); | <X_COMMENT>"*/" yy_pop_state(); | ||
<X_COMMENT>.|\n ; | <X_COMMENT>.|\n ; | ||
Line 50: | Line 49: | ||
return 0; | return 0; | ||
} | } | ||
− | </ | + | </source> |
[[category:Compiladores|Flex Lexical Analyzer]] | [[category:Compiladores|Flex Lexical Analyzer]] | ||
[[category:Ensino]] | [[category:Ensino]] |
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;
}