(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...) |
|||
(4 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
== The Solution == | == The Solution == | ||
− | <text> | + | [EXPLANATION COMING SOON] |
+ | |||
+ | <source lang="text"> | ||
%option 8bit noyywrap yylineno stack | %option 8bit noyywrap yylineno stack | ||
%{ | %{ | ||
Line 13: | Line 15: | ||
} | } | ||
%} | %} | ||
− | %x X_STRING X_COMMENT | + | %x X_CHAR X_STRING X_COMMENT |
%% | %% | ||
+ | |||
+ | \' yy_push_state(X_CHAR); | ||
+ | <X_CHAR>\\\' ; | ||
+ | <X_CHAR>\' yy_pop_state(); | ||
+ | <X_CHAR>. ; | ||
+ | <X_CHAR>\n yyerror("newline in character constant"); | ||
\" yy_push_state(X_STRING); | \" yy_push_state(X_STRING); | ||
Line 35: | Line 43: | ||
return yylex(); | return yylex(); | ||
} | } | ||
− | </ | + | </source> |
− | [[category: | + | [[category:Compiladores|Flex Lexical Analyzer]] |
− | [[category: | + | [[category:Ensino]] |
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.
[EXPLANATION COMING SOON]
%option 8bit noyywrap yylineno stack
%{
#include <iostream>
inline void yyerror(const char *msg) {
std::cerr << "Error at " << yylineno << ": " << msg << std::endl;
}
%}
%x X_CHAR X_STRING X_COMMENT
%%
\' yy_push_state(X_CHAR);
<X_CHAR>\\\' ;
<X_CHAR>\' yy_pop_state();
<X_CHAR>. ;
<X_CHAR>\n yyerror("newline in character constant");
\" 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); std::cout << std::endl << yylineno << ": "; ECHO;
<X_COMMENT>"/*" yy_push_state(X_COMMENT);
<X_COMMENT>"*/" yy_pop_state();
<X_COMMENT>.|\n ECHO;
"//".*$ std::cout << yylineno << ": "; ECHO;
.|\n ; /* ignore the rest */
%%
int main() {
return yylex();
}