Difference between revisions of "The Flex Lexical Analyzer/Exercise 7 - Text processing"

From Wiki**3

< The Flex Lexical Analyzer
(Created page with "{{TOCright}} == The Problem (in Portuguese) == Pretende-se converter texto escrito em português antigo para o novo acordo ortográfico. O programa a desenvolver recebe, na ent...")
 
(The Problem (in Portuguese))
Line 3: Line 3:
  
 
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:
 
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 acento circunflexo desaparece em êe e ôo. Exemplos: vêem e vôo.
+
* O acento circunflexo desaparece em '''êe''' e '''ôo'''. Exemplos: '''vêem''' e '''vôo'''.
* O trema na letra u (ü) desaparece quando precedido das letras g ou q e seguido pelas letras e ou i. Exemplo: seqüência muda para sequência.
+
* O trema na letra '''u''' ('''ü''') desaparece quando precedido das letras '''g''' ou '''q''' e seguido pelas letras '''e''' ou '''i'''. Exemplo: '''seqüência''' muda para '''sequência'''.
* O hífen deixa de ser utilizado em palavras formadas de prefixos (ou falsos prefixos) terminados em vogal e palavras iniciadas por r ou s, sendo que essas devem ser dobradas. Exemplo: auto-sugestão muda para autossugestão.
+
* O hífen deixa de ser utilizado em palavras formadas de prefixos (ou falsos prefixos) terminados em vogal e palavras iniciadas por '''r''' ou '''s''', sendo que essas devem ser dobradas. Exemplo: '''auto-sugestão''' muda para '''autossugestão'''.
* A consoantes mudas c e p, quando precedem t, c ou ç, passam a escrever-se apenas se pronunciadas. Assim, não são alteradas, em português europeu, facto ou sumptuoso nem, em português do Brasil, aspecto ou recepção (mas em português europeu passam a aspeto e receção). Nas sequências mpt, mpc ou mpç, o m passa a ser escrito n quando o p não se escreve. Exemplo: peremptório passa a perentório. Embora existam outras excepções, considere apenas os casos descritos.
+
* A consoantes mudas '''c''' e '''p''', quando precedem '''t''', '''c''' ou '''ç''', passam a escrever-se apenas se pronunciadas. Assim, não são alteradas, em português europeu, '''facto''' ou '''sumptuoso''' nem, em português do Brasil, '''aspecto''' ou '''recepção''' (mas em português europeu passam a '''aspeto''' e '''receção'''). Nas sequências '''mpt''', '''mpc''' ou '''mpç''', o '''m''' passa a ser escrito '''n''' quando o '''p''' não se escreve. Exemplo: '''peremptório''' passa a '''perentório'''. Embora existam outras excepções, considere apenas os casos descritos.
  
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.
+
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.
 
Apresente a especificação de um analisador lexical que possa ser processado pela ferramenta Flex, incluindo todas as rotinas auxiliares.

Revision as of 11:56, 22 June 2011

The Problem (in Portuguese)

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 acento circunflexo desaparece em êe e ôo. Exemplos: vêem e vôo.
  • O trema na letra u (ü) desaparece quando precedido das letras g ou q e seguido pelas letras e ou i. Exemplo: seqüência muda para sequência.
  • O hífen deixa de ser utilizado em palavras formadas de prefixos (ou falsos prefixos) terminados em vogal e palavras iniciadas por r ou s, sendo que essas devem ser dobradas. Exemplo: auto-sugestão muda para autossugestão.
  • A consoantes mudas c e p, quando precedem t, c ou ç, passam a escrever-se apenas se pronunciadas. Assim, não são alteradas, em português europeu, facto ou sumptuoso nem, em português do Brasil, aspecto ou recepção (mas em português europeu passam a aspeto e receção). Nas sequências mpt, mpc ou mpç, o m passa a ser escrito n quando o p não se escreve. Exemplo: peremptório passa a perentório. Embora existam outras excepções, considere apenas os casos descritos.

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.

Solution

Download this code: acordo.l.

<text> %option 8bit yylineno noyywrap stack %{

  1. include <iostream>

%} %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>