(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...) |
(→The Solution) |
||
Line 4: | Line 4: | ||
== The Solution == | == The Solution == | ||
+ | |||
+ | [EXPLANATION COMING SOON] | ||
<text> | <text> |
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]
<text> %option 8bit noyywrap yylineno stack %{
inline void yyerror(const char *msg) {
std::cerr << "Error at " << yylineno << ": " << msg << std::endl;
} %} %x X_STRING X_COMMENT %%
\" 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();
} </text>