(→The Problem (in Portuguese)) |
|||
Line 62: | Line 62: | ||
</text> | </text> | ||
− | [[category: | + | [[category:Compiladores]] |
− | [[category: | + | [[category:Ensino]] |
Contents |
Pretende-se converter texto escrito em português antigo para o novo acordo ortográfico. O programa a desenvolver recebe, na entrada padrão, o conteúdo a processar. Como resultado da execução do programa, produz, na saída padrão, o texto modificado. Para simplificar, consideram-se apenas algumas regras e consideram-se apenas letras minúsculas, mas devem ser suportadas as diferenças ainda existentes entre o português europeu (e PALOPs) e o português do Brasil:
O programa deve suportar comentários aninhados iniciados por << e terminados por >>. O texto comentado deve ser copiado inalterado para o terminal, suprimindo-se apenas as sequências de delimitação. Estes comentários são também utilizados para determinar, ao longo do texto, a variante de português a utilizar: <<pt_PT>> para português europeu e <<pt_BR>> para português do Brasil. O analisador inicia em português europeu. Notar que, nestes casos, os comentários contêm exclusivamente as letras indicadas, sem espaços, e não devem ser copiados para o terminal.
Apresente a especificação de um analisador lexical que possa ser processado pela ferramenta Flex, incluindo todas as rotinas auxiliares.
Download this code: acordo.l.
<text> %option 8bit yylineno noyywrap stack %{
%} %x X_PT_PT X_PT_BR X_IGNORE %%
BEGIN(X_PT_PT); /* initial state */
<*>"<<" yy_push_state(X_IGNORE); <X_IGNORE>">>" yy_pop_state(); <X_IGNORE>.|\n ; /* ignore */
<*>"<<pt_BR>>" BEGIN(X_PT_BR); <*>"<<pt_PT>>" BEGIN(X_PT_PT);
/* exceptions: european portuguese */
<X_PT_PT>{
"facto" ECHO; "sumptuoso" ECHO;
}
/* excepções: brazilian portuguese */
<X_PT_BR>{
"aspecto" ECHO; "recepção" ECHO;
}
/* rewrite rules for all variants */
<*>{
"êe" std::cout << "ee"; "ôo" std::cout << "oo"; [gq]"ü"[eiê] yytext[1] = 'u'; ECHO; [cp][cçt] std::cout << (yytext+1); mp[cçt] yytext[1] = 'n'; std::cout << (yytext+1);
"auto-r" std::cout << "autorr"; "auto-s" std::cout << "autoss";
.|\n ECHO;
}
%% int main() { return yylex(); } </text>