<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php?action=history&amp;feed=atom&amp;title=The_YACC_Parser_Generator%2FExercise_9</id>
	<title>The YACC Parser Generator/Exercise 9 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php?action=history&amp;feed=atom&amp;title=The_YACC_Parser_Generator%2FExercise_9"/>
	<link rel="alternate" type="text/html" href="https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php?title=The_YACC_Parser_Generator/Exercise_9&amp;action=history"/>
	<updated>2026-04-24T02:09:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php?title=The_YACC_Parser_Generator/Exercise_9&amp;diff=15714&amp;oldid=prev</id>
		<title>Root: Created page with &quot;{{TOCright}} == Problema ==  Uma máquina reconhece os símbolos de &#039;&#039;&#039;0&#039;&#039;&#039; a &#039;&#039;&#039;9&#039;&#039;&#039;, &#039;&#039;&#039;%&#039;&#039;&#039;, &#039;&#039;&#039;+&#039;&#039;&#039; e &#039;&#039;&#039;&quot;&#039;&#039;&#039; (aspa). Os símbolos de &#039;&#039;&#039;0&#039;&#039;&#039; a &#039;&#039;&#039;9&#039;&#039;&#039; são organizados em...&quot;</title>
		<link rel="alternate" type="text/html" href="https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php?title=The_YACC_Parser_Generator/Exercise_9&amp;diff=15714&amp;oldid=prev"/>
		<updated>2023-05-18T16:47:29Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{TOCright}} == Problema ==  Uma máquina reconhece os símbolos de &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; a &amp;#039;&amp;#039;&amp;#039;9&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;%&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039; e &amp;#039;&amp;#039;&amp;#039;&amp;quot;&amp;#039;&amp;#039;&amp;#039; (aspa). Os símbolos de &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; a &amp;#039;&amp;#039;&amp;#039;9&amp;#039;&amp;#039;&amp;#039; são organizados em...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Uma máquina reconhece os símbolos de &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; a &amp;#039;&amp;#039;&amp;#039;9&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;%&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039; e &amp;#039;&amp;#039;&amp;#039;&amp;quot;&amp;#039;&amp;#039;&amp;#039; (aspa). Os símbolos de &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; a &amp;#039;&amp;#039;&amp;#039;9&amp;#039;&amp;#039;&amp;#039; são organizados em sequências, possivelmente delimitadas por &amp;#039;&amp;#039;&amp;#039;&amp;quot;&amp;#039;&amp;#039;&amp;#039;. Se a sequência numérica não estiver delimitada, então o seu valor é simplesmente o do seu maior dígito (em base 10). Sequências numéricas delimitadas têm o valor correspondente ao número indicado pelos dígitos em base 10. O símbolo &amp;#039;&amp;#039;&amp;#039;%&amp;#039;&amp;#039;&amp;#039; pode ser usado como prefixo de uma sequência numérica delimitada: nesse caso, o valor da sequência é 1/100 do indicado pela sequência original. O operador &amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039; calcula o valor da soma dos seus argumentos (este operador é associativo à esquerda).&lt;br /&gt;
&lt;br /&gt;
Exemplo: à sequência &amp;#039;&amp;#039;&amp;#039;1234+&amp;quot;26&amp;quot;+%”50”&amp;#039;&amp;#039;&amp;#039; corresponde o valor 4+26+0.50 = 30.50.&lt;br /&gt;
&lt;br /&gt;
Escreva uma especificação YACC para o problema acima. Codifique toda a especificação (incluindo as zonas de declarações e de regras) e todas as funções auxiliares. &amp;#039;&amp;#039;&amp;#039;Não utilizar variáveis globais.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== The Lexical Analyzer (Flex) Specification ==&lt;br /&gt;
&lt;br /&gt;
The lexical analyzer (&amp;#039;&amp;#039;&amp;#039;numseq.l&amp;#039;&amp;#039;&amp;#039;) is very simple and limited to recognizing the indispensable tokens.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
%option noyywrap&lt;br /&gt;
%{&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;quot;numseq.tab.h&amp;quot;&lt;br /&gt;
%}&lt;br /&gt;
%%&lt;br /&gt;
[0-9]                 yylval.d = std::stoi(yytext); return tDIG;&lt;br /&gt;
[%+&amp;quot;]                 return *yytext;&lt;br /&gt;
.|\n                  ; /* ignore the rest */&lt;br /&gt;
%%&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Syntactic Analyzer (YACC) Specification ==&lt;br /&gt;
&lt;br /&gt;
The syntactic analyzer (&amp;#039;&amp;#039;&amp;#039;numseq.y&amp;#039;&amp;#039;&amp;#039;) computes the various segments and combines them.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
%{&lt;br /&gt;
#include &amp;lt;limits&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
extern int yylex();&lt;br /&gt;
inline void yyerror(const char *msg) { std::cerr &amp;lt;&amp;lt; msg &amp;lt;&amp;lt; std::endl; }&lt;br /&gt;
%}&lt;br /&gt;
&lt;br /&gt;
%union { double d; }&lt;br /&gt;
%token &amp;lt;d&amp;gt; tDIG&lt;br /&gt;
%type &amp;lt;d&amp;gt; seqd seqn exprs expr&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
top  : exprs             { std::cout &amp;lt;&amp;lt; $1 &amp;lt;&amp;lt; std::endl; }&lt;br /&gt;
     ;&lt;br /&gt;
&lt;br /&gt;
exprs : expr             { $$ = $1;      }&lt;br /&gt;
      | exprs &amp;#039;+&amp;#039; expr   { $$ = $1 + $3; }&lt;br /&gt;
&lt;br /&gt;
expr :     &amp;#039;&amp;quot;&amp;#039; seqd &amp;#039;&amp;quot;&amp;#039;  { $$ = $2; }&lt;br /&gt;
     | &amp;#039;%&amp;#039; &amp;#039;&amp;quot;&amp;#039; seqd &amp;#039;&amp;quot;&amp;#039;  { $$ = $3 / 100.0; }&lt;br /&gt;
     |         seqn      { $$ = $1; }&lt;br /&gt;
     ;&lt;br /&gt;
&lt;br /&gt;
seqd :      tDIG { $$ = $1; }&lt;br /&gt;
     | seqd tDIG { $$ = $1 * 10 + $2; }&lt;br /&gt;
     ;&lt;br /&gt;
&lt;br /&gt;
seqn :      tDIG { $$ = $1; }&lt;br /&gt;
     | seqn tDIG { $$ = std::max($1, $2); }&lt;br /&gt;
     ;&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
extern int yyparse();&lt;br /&gt;
int main() { return yyparse(); }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How to Compile? ==&lt;br /&gt;
&lt;br /&gt;
The Flex specification is processed as follows (the file &amp;#039;&amp;#039;&amp;#039;lex.yy.c&amp;#039;&amp;#039;&amp;#039; is produced):&lt;br /&gt;
&lt;br /&gt;
  flex numseq.l&lt;br /&gt;
&lt;br /&gt;
The YACC specification is processed as follows (files &amp;#039;&amp;#039;&amp;#039;numseq.tab.h&amp;#039;&amp;#039;&amp;#039;, needed by the Flex-generated code, and &amp;#039;&amp;#039;&amp;#039;numseq.tab.c&amp;#039;&amp;#039;&amp;#039;):&lt;br /&gt;
&lt;br /&gt;
  bison -dtv numseq.y&lt;br /&gt;
&lt;br /&gt;
Compiling the C/C++ code (it is C++ simply because we programmed the extra code in that language):&lt;br /&gt;
&lt;br /&gt;
  g++ -std=c++17 -c lex.yy.c&lt;br /&gt;
  g++ -std=c++17 -c numseq.tab.c&lt;br /&gt;
  g++ -o numseq numseq.tab.o lex.yy.o&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>