<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://robots.hlt.inesc-id.pt/w/pt/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Root</id>
	<title>Wiki**3 - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://robots.hlt.inesc-id.pt/w/pt/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Root"/>
	<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php/Special:Contributions/Root"/>
	<updated>2026-07-13T23:34:18Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Projecto_de_Programa%C3%A7%C3%A3o_com_Objectos/Enunciado_do_Projecto_de_2026-2027_(rascunho)&amp;diff=17865</id>
		<title>Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2026-2027 (rascunho)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Projecto_de_Programa%C3%A7%C3%A3o_com_Objectos/Enunciado_do_Projecto_de_2026-2027_(rascunho)&amp;diff=17865"/>
		<updated>2026-07-04T16:28:50Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJPOAvisosEN20262027}}&lt;br /&gt;
{{PRJPOMandatory20262027}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;EM PREPARAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;ÉPOCA NORMAL&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objectivo do projecto é desenvolver um sistema de gestão de &#039;&#039;&#039;entregas rápidas de produtos&#039;&#039;&#039; (ERP). O sistema deverá permitir, entre outras operações, (i) registar dados de empresas; (ii) registar dados de clientes; (iii) consultar e pesquisar produtos; e (iv) efectuar compras e gerir as entregas correspondentes.&lt;br /&gt;
&lt;br /&gt;
Neste texto, o tipo &#039;&#039;&#039;negrito&#039;&#039;&#039; indica um literal (i.e., é exactamente como apresentado); o símbolo ␣ indica um espaço; e o tipo &#039;&#039;itálico&#039;&#039; indica uma parte variável (i.e., uma descrição).&lt;br /&gt;
&lt;br /&gt;
= Conceitos e Relações do Modelo =&lt;br /&gt;
&lt;br /&gt;
Existem vários conceitos importantes neste contexto: [[#Empresas|empresas]], [[#Produtos|produtos]], [[#Clientes|clientes]], [[#Compras|compras]] e [[#Entregas|entregas]].&lt;br /&gt;
&lt;br /&gt;
Os conceitos listados não são os únicos possíveis no modelo e as suas relações (assim como relações com outros conceitos não mencionados) podem depender das escolhas do projecto.&lt;br /&gt;
&lt;br /&gt;
Os &#039;&#039;&#039;clientes&#039;&#039;&#039; e os &#039;&#039;&#039;produtos&#039;&#039;&#039; são independentes das empresas: existem por si e podem relacionar-se com várias empresas. Cada &#039;&#039;&#039;empresa&#039;&#039;&#039;, no entanto, mantém registo dos clientes com que interage, dos produtos que vende e das entregas que efectua.&lt;br /&gt;
&lt;br /&gt;
== Empresas ==&lt;br /&gt;
&lt;br /&gt;
O sistema mantém um registo das empresas que operam na plataforma. Cada empresa é identificada por um número de empresa. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Cada empresa tem ainda um nome (cadeia de caracteres não vazia).&lt;br /&gt;
&lt;br /&gt;
Cada empresa é responsável por manter actualizada informação sobre:&lt;br /&gt;
* os &#039;&#039;&#039;produtos&#039;&#039;&#039; que vende;&lt;br /&gt;
* os &#039;&#039;&#039;clientes&#039;&#039;&#039; com que já interagiu (i.e., que lhe fizeram compras);&lt;br /&gt;
* as &#039;&#039;&#039;entregas&#039;&#039;&#039; que efectuou.&lt;br /&gt;
&lt;br /&gt;
Note-se que a mesma informação global (produtos e clientes) pode ser partilhada por várias empresas. Deve ser possível adicionar outras propriedades às empresas sem impacto para o código já desenvolvido.&lt;br /&gt;
&lt;br /&gt;
== Produtos ==&lt;br /&gt;
&lt;br /&gt;
O sistema mantém um registo de produtos. Cada produto é identificado por um número de produto. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Todos os produtos têm um nome/descrição (cadeia de caracteres), um preço unitário (número inteiro, por simplicidade), um prazo de entrega (número inteiro de dias) e um número de exemplares em &#039;&#039;stock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Cada produto tem uma categoria, de acordo com a sua natureza. Inicialmente, consideram-se as seguintes categorias: (i) alimentar; (ii) electrónica; e (iii) vestuário. Deve ser possível adicionar novas categorias com impacto mínimo na aplicação já desenvolvida.&lt;br /&gt;
&lt;br /&gt;
Os produtos a considerar inicialmente são de dois tipos. As propriedades específicas de cada um (além das gerais) são as seguintes:&lt;br /&gt;
* Produto fabricado – nome do fabricante (cadeia de caracteres) e um código de fabrico (cadeia de caracteres).&lt;br /&gt;
* Produto importado – país de origem (cadeia de caracteres) e uma taxa alfandegária (número inteiro).&lt;br /&gt;
&lt;br /&gt;
Deve ser possível criar novos tipos de produto. O impacto da introdução dos novos tipos na implementação desenvolvida deve ser mínimo.&lt;br /&gt;
&lt;br /&gt;
== Clientes ==&lt;br /&gt;
&lt;br /&gt;
O sistema mantém um registo de clientes. Cada cliente é identificado por um número de cliente. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Cada cliente tem ainda informação sobre o seu nome e endereço de correio electrónico. Estes campos não podem ser vazios.&lt;br /&gt;
&lt;br /&gt;
Assume-se que &#039;&#039;&#039;os clientes têm sempre dinheiro&#039;&#039;&#039;, i.e., uma compra nunca é recusada por falta de fundos. Deve, no entanto, ser possível discriminar os clientes segundo outros critérios (por exemplo, o volume de compras), com um impacto mínimo na implementação desenvolvida.&lt;br /&gt;
&lt;br /&gt;
== Compras ==&lt;br /&gt;
&lt;br /&gt;
O sistema regista as compras efectuadas pelos clientes. Cada compra é identificada por um número de compra, atribuído automaticamente e incrementalmente. Uma compra é sempre feita por um único &#039;&#039;&#039;cliente&#039;&#039;&#039; a uma única &#039;&#039;&#039;empresa&#039;&#039;&#039; e regista a data em que foi efectuada.&lt;br /&gt;
&lt;br /&gt;
Uma compra é constituída por um conjunto de linhas (um &amp;quot;cabaz&amp;quot;). Cada linha corresponde a:&lt;br /&gt;
* um &#039;&#039;&#039;produto&#039;&#039;&#039;;&lt;br /&gt;
* uma &#039;&#039;&#039;quantidade&#039;&#039;&#039; (número de exemplares adquiridos desse produto);&lt;br /&gt;
* um &#039;&#039;&#039;preço unitário&#039;&#039;&#039; (o preço do produto no momento da compra);&lt;br /&gt;
* um &#039;&#039;&#039;preço total da linha&#039;&#039;&#039; (quantidade × preço unitário).&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;&#039;preço total dos itens&#039;&#039;&#039; de uma compra é a soma dos preços totais das suas linhas. A cada compra está ainda associada uma &#039;&#039;&#039;sobretaxa de entrega&#039;&#039;&#039;, correspondente a &#039;&#039;&#039;10% do preço total dos itens&#039;&#039;&#039; (i.e., 10% por item). O &#039;&#039;&#039;preço total da compra&#039;&#039;&#039; é, assim, o preço total dos itens acrescido da sobretaxa de entrega.&lt;br /&gt;
&lt;br /&gt;
Como se descreve na secção seguinte, uma compra pode dar origem a mais do que uma entrega. A divisão de uma compra em várias entregas &#039;&#039;&#039;não acrescenta qualquer custo&#039;&#039;&#039;: a sobretaxa de entrega é sempre 10% do preço total dos itens, independentemente do número de entregas.&lt;br /&gt;
&lt;br /&gt;
== Entregas ==&lt;br /&gt;
&lt;br /&gt;
A cada compra correspondem uma ou mais &#039;&#039;&#039;entregas&#039;&#039;&#039;. As entregas são determinadas a partir dos prazos de entrega dos produtos que constam da compra.&lt;br /&gt;
&lt;br /&gt;
Calcula-se a &#039;&#039;&#039;média dos prazos de entrega&#039;&#039;&#039; dos produtos das linhas da compra. Então:&lt;br /&gt;
* todas as linhas cujo produto tem prazo &#039;&#039;&#039;menor ou igual à média&#039;&#039;&#039; são agrupadas numa única entrega (a entrega &amp;quot;conjunta&amp;quot;);&lt;br /&gt;
* cada linha cujo produto tem prazo &#039;&#039;&#039;estritamente maior do que a média&#039;&#039;&#039; é enviada &#039;&#039;&#039;separadamente&#039;&#039;&#039;, numa entrega própria (uma entrega &amp;quot;conjunta&amp;quot; pode não existir se todas as linhas forem enviadas separadamente).&lt;br /&gt;
&lt;br /&gt;
Cada entrega tem uma data de chegada, calculada a partir da data da compra e do prazo aplicável: uma entrega separada usa o prazo do respectivo produto; a entrega conjunta usa o maior dos prazos dos seus produtos. Como referido acima, o envio separado é feito &#039;&#039;&#039;sem custo adicional&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, considere-se uma compra com três linhas cujos produtos têm os prazos de entrega 3 (P1), 8 (P2) e 2 (P3). A média dos prazos é (3 + 8 + 2) / 3 ≈ 4,33. Logo, P1 e P3 (prazos ≤ 4,33) seguem juntos numa entrega e P2 (prazo &amp;gt; 4,33) segue numa entrega separada:&lt;br /&gt;
&lt;br /&gt;
 Entrega A: {P1, P3}   (prazo = 3)&lt;br /&gt;
 Entrega B: {P2}       (prazo = 8)   -- enviada separadamente&lt;br /&gt;
&lt;br /&gt;
== Pesquisas ==&lt;br /&gt;
&lt;br /&gt;
Para permitir que o sistema ajude os clientes a determinar a existência de um produto, deverá ser possível efectuar pesquisas. As pesquisas consideram os campos relevantes dos vários produtos (por exemplo, o nome e a categoria). O termo de pesquisa deve ser comparado sem distinção entre letras maiúsculas e minúsculas. Deve ser possível introduzir novos métodos de pesquisa de um produto com um impacto mínimo na implementação desenvolvida.&lt;br /&gt;
&lt;br /&gt;
== Alterações de Inventário de Produtos ==&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;stock&#039;&#039; de um produto pode ser alterado, através da especificação de um valor a somar/subtrair ao número de exemplares: se a quantidade indicada for um valor positivo, aumenta-se o número de exemplares disponíveis; se for um valor negativo, decrementa-se o número de exemplares disponíveis desde que o número de exemplares disponíveis não fique negativo.&lt;br /&gt;
&lt;br /&gt;
Caso o número de exemplares de um produto chegue a 0, então o produto deve ser removido do sistema.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que a remoção de um produto tem impacto na gestão das empresas que o vendiam.}}&lt;br /&gt;
&lt;br /&gt;
== Gestão de Tempo ==&lt;br /&gt;
&lt;br /&gt;
A unidade de tempo do sistema é o dia. A data do sistema começa no dia 1 (um) e faz parte do estado persistente. Sempre que a data é alterada, deve ser verificada a situação das entregas: uma entrega considera-se &#039;&#039;&#039;entregue&#039;&#039;&#039; quando a data actual atinge (ou ultrapassa) a sua data de chegada. Devem ainda ser actualizados outros aspectos que da data dependam.&lt;br /&gt;
&lt;br /&gt;
== Notificações ==&lt;br /&gt;
&lt;br /&gt;
Deve existir um mecanismo de notificações que permita avisar eventuais interessados quando os produtos ficam em determinadas situações:&lt;br /&gt;
* Quando um produto sem qualquer exemplar disponível passa a ter pelo menos um exemplar disponível, quer-se enviar uma notificação a todas as entidades que demonstraram interesse nesta situação.&lt;br /&gt;
&lt;br /&gt;
As notificações de um cliente apenas devem ser apresentadas uma única vez. Após esta visualização, considera-se que o cliente fica sem notificações. As notificações devem ser apresentadas pela mesma ordem em que foram enviadas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
No caso de uma entidade interessada em ser avisada da disponibilidade de um produto, isto significa que, sempre que o produto em causa passar da situação de indisponível (todos os exemplares esgotados) para disponível (pelo menos um exemplar), a entidade deve receber uma notificação. Deve ser possível definir novas entidades interessadas e novos tipos de notificação, com impacto mínimo no código do domínio da aplicação.&lt;br /&gt;
&lt;br /&gt;
= Requisitos de Desenho =&lt;br /&gt;
&lt;br /&gt;
A aplicação a desenvolver deve seguir o princípio de desenho aberto-fechado, por forma a aumentar a extensibilidade do seu código. Por exemplo, deve ser possível adicionar novos tipos de produto com um impacto mínimo no código já existente da aplicação.&lt;br /&gt;
&lt;br /&gt;
Devem ser possíveis extensões ou alterações de funcionalidade com impacto mínimo no código já produzido para a aplicação. O objectivo é aumentar a flexibilidade da aplicação relativamente ao suporte de novas funções. Assim, deve ser possível:&lt;br /&gt;
* Adicionar novos tipos de produto (e.g., produtos digitais ou perecíveis);&lt;br /&gt;
* Adicionar novas categorias de produto;&lt;br /&gt;
* Definir novas entidades que desejem ser notificadas da disponibilidade de produtos;&lt;br /&gt;
* Introduzir novos critérios de discriminação/classificação dos clientes;&lt;br /&gt;
* Introduzir novos métodos de pesquisa de produtos;&lt;br /&gt;
* Alterar a regra de cálculo das entregas e da sobretaxa de entrega com um impacto mínimo no código existente.&lt;br /&gt;
&lt;br /&gt;
= Funcionalidade da aplicação =&lt;br /&gt;
&lt;br /&gt;
A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir empresas, produtos, clientes e compras. Possui ainda a capacidade de preservar o seu estado (não é possível manter várias versões do estado da aplicação em simultâneo).&lt;br /&gt;
&lt;br /&gt;
A aplicação deve estar preparada para que se possa remover qualquer entidade (não apenas produtos).&lt;br /&gt;
&lt;br /&gt;
No [[#Leitura de Dados a Partir de Ficheiros Textuais|início]], a aplicação está vazia, mas pode ser carregada uma base de dados textual com conceitos pré-definidos. Neste caso, a aplicação começará com um estado referente às entidades que foram carregadas no arranque da aplicação.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que não é necessário implementar de raiz a aplicação: já existem classes que representam e definem a interface geral da funcionalidade do &#039;&#039;core&#039;&#039; da aplicação, tal como é visível pelos comandos da aplicação.}}&lt;br /&gt;
{{CVSCode|A interface geral do &#039;&#039;core&#039;&#039; já está parcialmente implementada na classe &#039;&#039;&#039;erp.ErpManager&#039;&#039;&#039; e outras fornecidas (cujos nomes devem ser mantidos), devendo ser adaptadas onde necessário. É ainda necessário criar e implementar as restantes classes que suportam a operação da aplicação.}}&lt;br /&gt;
{{Suggestion|O esqueleto actualmente fornecido no repositório ainda contém nomes herdados do projecto anterior (por exemplo, &#039;&#039;&#039;erp.LibraryManager&#039;&#039;&#039; e as &#039;&#039;packages&#039;&#039; &#039;&#039;&#039;erp.app.{work,user,request}&#039;&#039;&#039;), que devem ser adaptados aos conceitos deste enunciado (&#039;&#039;&#039;erp.app.{company,product,client,purchase}&#039;&#039;&#039;). Os nomes das classes de apoio de uso obrigatório não podem ser alterados.}}&lt;br /&gt;
&lt;br /&gt;
== Serialização ==&lt;br /&gt;
&lt;br /&gt;
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relacionada com o ERP e que foi descrita [[#Conceitos e Relações do Modelo|acima]].&lt;br /&gt;
&lt;br /&gt;
= Interacção com o utilizador =&lt;br /&gt;
&lt;br /&gt;
Descreve-se nesta secção a &#039;&#039;&#039;funcionalidade máxima&#039;&#039;&#039; da interface com o utilizador. Em geral, os comandos pedem toda a informação antes de procederem à sua validação (excepto onde indicado). Todos os menus têm automaticamente a opção &#039;&#039;&#039;Sair&#039;&#039;&#039; (fecha o menu).&lt;br /&gt;
&lt;br /&gt;
As operações de pedido e apresentação de informação ao utilizador &#039;&#039;&#039;devem&#039;&#039;&#039; realizar-se através dos objectos &#039;&#039;form&#039;&#039; e &#039;&#039;display&#039;&#039;, respectivamente, presentes em cada comando. As mensagens são produzidas pelos métodos das [[Programação com Objectos/Projecto de Programação com Objectos/Material de Apoio ao Desenvolvimento|bibliotecas de suporte]] (&#039;&#039;&#039;po-uilib&#039;&#039;&#039; e &#039;&#039;&#039;erp-app&#039;&#039;&#039;). As mensagens não podem ser usadas no núcleo da aplicação (&#039;&#039;&#039;erp-core&#039;&#039;&#039;). Além disso, não podem ser definidas novas. Potenciais omissões devem ser esclarecidas antes de qualquer implementação.&lt;br /&gt;
&lt;br /&gt;
De um modo geral, sempre que no contexto de uma operação com o utilizador aconteça alguma excepção, então a operação não deve ter qualquer efeito no estado da aplicação, excepto em caso de indicação contrária na operação em causa. As excepções estão na package &#039;&#039;&#039;erp.app.exceptions&#039;&#039;&#039;, excepto em caso de indicação contrária.&lt;br /&gt;
&lt;br /&gt;
As excepções usadas na interacção (subclasses de &#039;&#039;&#039;pt.tecnico.uilib.menus.CommandException&#039;&#039;&#039;), excepto em caso de indicação contrária, são lançadas pelos comandos (subclasses de &#039;&#039;&#039;pt.tecnico.uilib.menus.Command&#039;&#039;&#039;) e tratadas pelos menus (instâncias de subclasses de &#039;&#039;&#039;pt.tecnico.uilib.menus.Menu&#039;&#039;&#039;). Outras excepções não devem substituir as fornecidas nos casos descritos.&lt;br /&gt;
&lt;br /&gt;
Nos pedidos e usos dos vários identificadores, podem ocorrer as seguintes excepções, caso o identificador indicado não corresponda a um objecto conhecido (excepto no processo de registo ou em caso de indicação contrária). Note-se que estas excepções não são utilizáveis no núcleo da aplicação.&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Tipo de dados&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Classe&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Pedido a apresentar&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Excepção a lançar se desconhecido&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Empresa&lt;br /&gt;
| &#039;&#039;&#039;Company&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.company.Prompt.companyId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownCompanyKeyException&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Produto&lt;br /&gt;
| &#039;&#039;&#039;Product&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.product.Prompt.productId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownProductKeyException&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cliente&lt;br /&gt;
| &#039;&#039;&#039;Client&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.client.Prompt.clientId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownClientKeyException&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Compra&lt;br /&gt;
| &#039;&#039;&#039;Purchase&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.purchase.Prompt.purchaseId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownPurchaseKeyException&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alguns casos particulares podem usar pedidos específicos não apresentados nesta tabela.&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|Note-se que o programa principal e os comandos e menus, a seguir descritos, já estão parcial ou completamente implementados nas &#039;&#039;packages&#039;&#039; &#039;&#039;&#039;erp.app&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.main&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.company&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.product&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.client&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.purchase&#039;&#039;&#039;. Estas classes são de uso obrigatório e estão disponíveis no [[Programação com Objectos/Projecto de Programação com Objectos/Repositório GIT|GIT]] (módulo &#039;&#039;&#039;erp-app&#039;&#039;&#039;).}}&lt;br /&gt;
&lt;br /&gt;
== Menu Principal ==&lt;br /&gt;
&lt;br /&gt;
As acções deste menu permitem gerir a salvaguarda do estado da aplicação e abrir submenus. A lista completa é a seguinte: [[#Salvaguarda do estado actual da aplicação|Abrir]], [[#Salvaguarda do estado actual da aplicação|Guardar]], [[#Mostrar data actual|Mostrar data actual]], [[#Avançar data actual|Avançar data actual]], [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Empresas]], [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Produtos]], [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Clientes]] e [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Compras]]. Inicialmente, a aplicação apenas tem informação sobre as entidades que foram carregadas no arranque.&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas na classe &#039;&#039;&#039;erp.app.main.Label&#039;&#039;&#039;. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe &#039;&#039;&#039;erp.app.main.Message&#039;&#039;&#039;.}}&lt;br /&gt;
{{CVSCode|Estes comandos já estão implementados nas classes da &#039;&#039;package&#039;&#039; &#039;&#039;&#039;erp.app.main&#039;&#039;&#039;, respectivamente: &#039;&#039;&#039;DoOpenFile&#039;&#039;&#039;, &#039;&#039;&#039;DoSaveFile&#039;&#039;&#039;, &#039;&#039;&#039;DoDisplayDate&#039;&#039;&#039;, &#039;&#039;&#039;DoAdvanceDate&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuCompanies&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuProducts&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuClients&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuPurchases&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Salvaguarda do estado actual da aplicação ===&lt;br /&gt;
&lt;br /&gt;
O conteúdo da aplicação (toda a informação detida pelo ERP actualmente em memória) pode ser guardado para posterior recuperação (via serialização Java: &#039;&#039;&#039;java.io.Serializable&#039;&#039;&#039;). Na leitura e escrita do estado da aplicação, devem ser tratadas as excepções associadas. A funcionalidade é a seguinte:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Abrir&#039;&#039;&#039; -- Carrega os dados de uma sessão anterior a partir de um ficheiro previamente guardado (ficando este ficheiro associado à aplicação, para futuras operações de salvaguarda). Pede-se o nome do ficheiro a abrir (&#039;&#039;&#039;Prompt.openFile()&#039;&#039;&#039;). Caso ocorra um problema na abertura ou processamento do ficheiro, deve ser lançada a excepção &#039;&#039;&#039;FileOpenFailedException&#039;&#039;&#039;. A execução bem-sucedida desta opção substitui toda a informação da aplicação. &amp;lt;br/&amp;gt;Quando se abandona uma aplicação com modificações não guardadas (porque se abre outra e existem alterações não guardadas), deve perguntar-se ao utilizador se quer guardar a informação actual antes de a abandonar, através de &#039;&#039;&#039;Prompt.saveBeforeExit()&#039;&#039;&#039; (a resposta é obtida via &#039;&#039;&#039;Form.confirm()&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Guardar&#039;&#039;&#039; -- Guarda o estado actual da aplicação no ficheiro associado. Se não existir associação, pede-se o nome do ficheiro a utilizar, ficando a ele associado (para operações de salvaguarda subsequentes). Esta interacção realiza-se através do método &#039;&#039;&#039;Prompt.newSaveAs()&#039;&#039;&#039;. Não é executada nenhuma acção se não existirem alterações desde a última salvaguarda.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que a opção &#039;&#039;&#039;Abrir&#039;&#039;&#039; não permite a leitura de ficheiros de texto (estes apenas podem ser utilizados no início da aplicação).}}&lt;br /&gt;
{{Suggestion|A opção &#039;&#039;&#039;Sair&#039;&#039;&#039; nunca implica a salvaguarda do estado da aplicação, mesmo que existam alterações.}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar data actual ===&lt;br /&gt;
&lt;br /&gt;
A data actual do sistema é apresentada através da mensagem &#039;&#039;&#039;Message.currentDate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Avançar data actual ===&lt;br /&gt;
&lt;br /&gt;
O número de dias a avançar é pedido através de &#039;&#039;&#039;Prompt.daysToAdvance()&#039;&#039;&#039;. O valor indicado deve ser positivo. Caso contrário, a operação não tem efeito.&lt;br /&gt;
&lt;br /&gt;
Além da data, o sistema deve actualizar, caso seja necessário, outros aspectos que dela dependam, designadamente, a situação das entregas relativa às suas datas de chegada.&lt;br /&gt;
&lt;br /&gt;
=== Gestão e consulta de dados da aplicação ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Empresas&#039;&#039;&#039; -- Abre o menu de gestão de empresas e operações associadas.&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Produtos&#039;&#039;&#039; -- Abre o menu de gestão de produtos e operações associadas.&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Clientes&#039;&#039;&#039; -- Abre o menu de gestão de clientes e operações associadas.&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Compras&#039;&#039;&#039; -- Abre o menu de gestão de compras e operações associadas.&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Empresas ==&lt;br /&gt;
&lt;br /&gt;
Este menu permite efectuar operações sobre a base de dados de empresas. A lista completa é a seguinte: [[#Registar empresa|Registar empresa]], [[#Mostrar empresa|Mostrar empresa]], [[#Mostrar empresas|Mostrar empresas]], [[#Mostrar produtos de uma empresa|Mostrar produtos de uma empresa]], [[#Mostrar clientes de uma empresa|Mostrar clientes de uma empresa]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.company.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.company.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.company.Message&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Registar empresa ===&lt;br /&gt;
&lt;br /&gt;
Pede o nome (&#039;&#039;&#039;Prompt.companyName()&#039;&#039;&#039;). O registo bem sucedido é assinalado através da mensagem &#039;&#039;&#039;Message.registrationSuccessful()&#039;&#039;&#039;; caso contrário, é lançada a excepção &#039;&#039;&#039;CompanyRegistrationFailedException&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note-se que a atribuição do identificador da empresa é automática.&lt;br /&gt;
&lt;br /&gt;
=== Mostrar empresa ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da empresa, sendo apresentadas as informações sobre essa empresa, de acordo com o seguinte formato:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de uma empresa|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;nome&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar empresas ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todas as empresas, ordenando-as pelos seus identificadores. O formato é o descrito em [[#Mostrar empresa|Mostrar empresa]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar produtos de uma empresa ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da empresa e apresentam-se os produtos que essa empresa vende, ordenados pelos seus identificadores, utilizando o formato descrito em [[#Mostrar produto|Mostrar produto]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar clientes de uma empresa ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da empresa e apresentam-se os clientes que já interagiram com essa empresa, ordenados pelos seus identificadores, utilizando o formato descrito em [[#Mostrar cliente|Mostrar cliente]].&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Produtos ==&lt;br /&gt;
&lt;br /&gt;
Este menu apresenta as operações disponíveis sobre produtos. A lista completa é a seguinte: [[#Mostrar produto|Mostrar produto]], [[#Mostrar produtos|Mostrar produtos]], [[#Alterar inventário de um produto|Alterar inventário de um produto]] e [[#Efectuar pesquisa|Efectuar pesquisa]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.product.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.product.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.product.Message&#039;&#039;&#039;.}}&lt;br /&gt;
{{CVSCode|Estes comandos já estão implementados nas classes da &#039;&#039;package&#039;&#039; &#039;&#039;&#039;erp.app.product&#039;&#039;&#039; (disponível no GIT), respectivamente: &#039;&#039;&#039;DoShowProduct&#039;&#039;&#039;, &#039;&#039;&#039;DoShowProducts&#039;&#039;&#039;, &#039;&#039;&#039;DoChangeProductInventory&#039;&#039;&#039;, &#039;&#039;&#039;DoPerformSearch&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar produto ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador do produto. Se o produto existir, é apresentado de acordo com o seguinte formato. O formato genérico de apresentação de um produto é como se segue:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de produtos|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;stock&#039;&#039; - &#039;&#039;tipo&#039;&#039; - &#039;&#039;nome&#039;&#039; - &#039;&#039;preço&#039;&#039; - &#039;&#039;categoria&#039;&#039; - &#039;&#039;informação adicional&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Para produtos fabricados, a informação adicional corresponde ao nome do fabricante e ao código de fabrico (separados pelo carácter &#039;&#039;&#039;;&#039;&#039;&#039;); para produtos importados, a informação adicional corresponde ao país de origem e à taxa alfandegária.&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de produtos|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
3 - 20 - FABRICADO - Farinha - 15 - ALIMENTAR - Moageira Nacional; F-0091&lt;br /&gt;
4 - 2 - IMPORTADO - Telemóvel - 200 - ELECTRONICA - China - 30&lt;br /&gt;
5 - 0 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar produtos ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todos os produtos, ordenando-os pelos seus identificadores. O formato de apresentação é como descrito em [[#Mostrar produto|Mostrar produto]].&lt;br /&gt;
&lt;br /&gt;
=== Alterar inventário de um produto ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador de um produto e uma quantidade (&#039;&#039;&#039;Prompt.amountToUpdate()&#039;&#039;&#039;) e actualizado o número de exemplares disponíveis do produto indicado somando a quantidade indicada ao número de exemplares disponíveis. No caso de não ser possível actualizar o número de exemplares devido ao facto de a quantidade indicada ser inválida, então a operação não deve ter qualquer efeito e deve ser apresentada a mensagem &#039;&#039;&#039;Message.notEnoughInventory()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Efectuar pesquisa ===&lt;br /&gt;
&lt;br /&gt;
Esta opção realiza uma procura por termo (cadeia de caracteres), pedido através de &#039;&#039;&#039;Prompt.searchTerm()&#039;&#039;&#039;. Como resultado, deve ser apresentada uma lista dos produtos encontrados pela pesquisa, ordenados por ordem crescente do seu identificador, utilizando o formato descrito para [[#Mostrar produto|Mostrar produto]].&lt;br /&gt;
&lt;br /&gt;
O termo de pesquisa deve ser comparado (sem distinção entre letras maiúsculas e minúsculas) com os campos relevantes de cada produto: o nome e a categoria. Só devem ser apresentados produtos que contenham o termo de pesquisa num dos campos relevantes. Caso não sejam encontrados produtos, não deve ser produzido qualquer resultado.&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Clientes ==&lt;br /&gt;
&lt;br /&gt;
Este menu permite efectuar operações sobre a base de dados de clientes. A lista completa é a seguinte: [[#Registar cliente|Registar cliente]], [[#Mostrar cliente|Mostrar cliente]], [[#Mostrar clientes|Mostrar clientes]], [[#Mostrar notificações do cliente|Mostrar notificações do cliente]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.client.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.client.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.client.Message&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Registar cliente ===&lt;br /&gt;
&lt;br /&gt;
Pede o nome (&#039;&#039;&#039;Prompt.clientName()&#039;&#039;&#039;) e o endereço de correio electrónico (&#039;&#039;&#039;Prompt.clientEMail()&#039;&#039;&#039;). O registo bem sucedido é assinalado através da mensagem &#039;&#039;&#039;Message.registrationSuccessful()&#039;&#039;&#039;; caso contrário, é lançada a excepção &#039;&#039;&#039;ClientRegistrationFailedException&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note-se que a atribuição do identificador do cliente é automática e que clientes diferentes são registados em cada operação de registo.&lt;br /&gt;
&lt;br /&gt;
=== Mostrar cliente ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador do cliente, sendo apresentadas as informações sobre esse cliente, de acordo com o seguinte formato. O valor apresentado após o email corresponde ao total gasto pelo cliente em compras (um valor inteiro).&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de um cliente|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;nome&#039;&#039; - &#039;&#039;email&#039;&#039; - &#039;&#039;gasto total&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de clientes|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2 - Alberto Meireles - ameireles@mymail.com - 275&lt;br /&gt;
1 - Fernando Meireles - fmeireles@mymail.com - 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar clientes ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todos os clientes, ordenando-os lexicograficamente pelo nome. Caso existam clientes com o mesmo nome, devem ser ordenados por ordem crescente dos seus identificadores. O formato é o descrito em [[#Mostrar cliente|Mostrar cliente]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar notificações do cliente ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador do cliente, sendo apresentadas as notificações para esse cliente, de acordo com o seguinte formato:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação das notificações de um cliente|&lt;br /&gt;
 DISPONIBILIDADE: &#039;&#039;descrição de produto disponível&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de notificações|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
DISPONIBILIDADE: 5 - 4 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note-se que a descrição é idêntica à que é realizada para mostrar cada produto. No entanto, a solução deve ser suficientemente flexível para permitir outros formatos de apresentação das notificações (sem impacto no código do domínio da aplicação).&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Compras ==&lt;br /&gt;
&lt;br /&gt;
Este menu apresenta as operações relacionadas com compras e entregas. A lista completa é a seguinte: [[#Efectuar compra|Efectuar compra]], [[#Mostrar compra|Mostrar compra]], [[#Mostrar compras|Mostrar compras]], [[#Mostrar entregas de uma compra|Mostrar entregas de uma compra]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.purchase.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.purchase.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.purchase.Message&#039;&#039;&#039;.}}&lt;br /&gt;
{{CVSCode|Estes comandos já estão implementados nas classes da &#039;&#039;package&#039;&#039; &#039;&#039;&#039;erp.app.purchase&#039;&#039;&#039; (disponível no GIT), respectivamente: &#039;&#039;&#039;DoDoPurchase&#039;&#039;&#039;, &#039;&#039;&#039;DoShowPurchase&#039;&#039;&#039;, &#039;&#039;&#039;DoShowPurchases&#039;&#039;&#039;, &#039;&#039;&#039;DoShowPurchaseDeliveries&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Efectuar compra ===&lt;br /&gt;
&lt;br /&gt;
No processo de efectuar uma compra, o sistema pede, primeiro, a identificação do cliente; de seguida, a identificação da empresa a que a compra é feita; e, finalmente, para cada linha, o identificador do produto e a quantidade pretendida (&#039;&#039;&#039;Prompt.productId()&#039;&#039;&#039; e &#039;&#039;&#039;Prompt.amountToBuy()&#039;&#039;&#039;). O processo de adição de linhas termina de acordo com a interacção definida no comando.&lt;br /&gt;
&lt;br /&gt;
Se não houver exemplares suficientes de um produto para satisfazer a quantidade pretendida, deve ser apresentada a mensagem &#039;&#039;&#039;Message.notEnoughInventory()&#039;&#039;&#039; e essa linha não é adicionada. Concluída a compra, o &#039;&#039;stock&#039;&#039; dos produtos é decrementado, a empresa passa a seguir o cliente e são determinadas as entregas correspondentes. A data limite de chegada de cada entrega é comunicada através da mensagem &#039;&#039;&#039;Message.deliveryDate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Mostrar compra ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da compra. Na primeira linha apresenta-se a informação da compra; de seguida, apresentam-se as suas entregas &#039;&#039;&#039;em detalhe&#039;&#039;&#039; — cada entrega (identificador da compra e data de chegada) seguida da descrição completa de cada um dos seus produtos (o mesmo formato de [[#Mostrar produto|Mostrar produto]]). O formato é o seguinte:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de uma compra (com entregas em detalhe)|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;idCliente&#039;&#039; - &#039;&#039;idEmpresa&#039;&#039; - &#039;&#039;data&#039;&#039; - &#039;&#039;preço total dos itens&#039;&#039; - &#039;&#039;sobretaxa de entrega&#039;&#039; - &#039;&#039;preço total&#039;&#039;&lt;br /&gt;
 &#039;&#039;idCompra&#039;&#039; - &#039;&#039;data de chegada&#039;&#039;&lt;br /&gt;
   &#039;&#039;descrição de produto&#039;&#039;&lt;br /&gt;
   ...&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de compras|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
7 - 3 - 1 - 4 - 90 - 9 - 99&lt;br /&gt;
7 - 7&lt;br /&gt;
  1 - 18 - FABRICADO - Farinha - 15 - ALIMENTAR - Moageira Nacional; F-0091&lt;br /&gt;
  3 - 2 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120&lt;br /&gt;
7 - 12&lt;br /&gt;
  2 - 1 - IMPORTADO - Telemovel - 200 - ELECTRONICA - China - 30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar compras ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todas as compras, ordenando-as pelos seus identificadores. O formato é o descrito em [[#Mostrar compra|Mostrar compra]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar entregas de uma compra ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da compra e são apresentadas as entregas correspondentes, ordenadas pela data de chegada e, em caso de empate, pelos identificadores dos produtos. Ao contrário de [[#Mostrar compra|Mostrar compra]] (que apresenta as entregas em detalhe), aqui cada entrega é apresentada &#039;&#039;&#039;de forma resumida&#039;&#039;&#039; (uma linha, apenas com os identificadores dos produtos), de acordo com o seguinte formato:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de uma entrega|&lt;br /&gt;
 &#039;&#039;idCompra&#039;&#039; - &#039;&#039;data de chegada&#039;&#039; - &#039;&#039;lista de identificadores de produtos&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de entregas (compra do exemplo da secção Entregas)|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
7 - 7 - 1, 3&lt;br /&gt;
7 - 12 - 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Leitura de Dados a Partir de Ficheiros Textuais =&lt;br /&gt;
&lt;br /&gt;
Além das opções de manipulação de ficheiros descritas no [[#Menu Principal|menu principal]], é possível iniciar a aplicação com um ficheiro de texto especificado pela propriedade Java &#039;&#039;&#039;[[#Execução do Programa e Testes Automáticos|import]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Cada linha tem uma descrição distinta mas que segue o seguinte formato geral. É possível registar empresas, clientes e produtos, e definir os produtos que cada empresa vende. Assume-se que os campos de texto não podem conter o carácter &#039;&#039;&#039;:&#039;&#039;&#039; e que os preços são números inteiros. Não existem entradas mal-formadas.&lt;br /&gt;
&lt;br /&gt;
Os produtos têm o formato descrito abaixo, respectivamente, para produtos fabricados e importados. O campo &#039;&#039;stock&#039;&#039; indica o número de exemplares disponíveis do produto.&lt;br /&gt;
&lt;br /&gt;
 MANUFACTURED:&#039;&#039;idEmpresa&#039;&#039;:&#039;&#039;nome&#039;&#039;:&#039;&#039;preço&#039;&#039;:&#039;&#039;categoria&#039;&#039;:&#039;&#039;prazo&#039;&#039;:&#039;&#039;stock&#039;&#039;:&#039;&#039;fabricante&#039;&#039;:&#039;&#039;codigo&#039;&#039;&lt;br /&gt;
 IMPORTED:&#039;&#039;idEmpresa&#039;&#039;:&#039;&#039;nome&#039;&#039;:&#039;&#039;preço&#039;&#039;:&#039;&#039;categoria&#039;&#039;:&#039;&#039;prazo&#039;&#039;:&#039;&#039;stock&#039;&#039;:&#039;&#039;paisOrigem&#039;&#039;:&#039;&#039;taxa&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O registo de empresas e de clientes segue os formatos:&lt;br /&gt;
&lt;br /&gt;
 COMPANY:&#039;&#039;nome&#039;&#039;&lt;br /&gt;
 CLIENT:&#039;&#039;nome&#039;&#039;:&#039;&#039;email&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um exemplo de conteúdo do ficheiro inicial é como se segue:&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Exemplo de ficheiro de entrada textual|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
COMPANY:Moageira Nacional&lt;br /&gt;
COMPANY:Importadora Atlantico&lt;br /&gt;
CLIENT:Obi-Wan Kenobi:obiwan@jedi.org&lt;br /&gt;
MANUFACTURED:1:Farinha:15:ALIMENTAR:3:23:Moageira Nacional:F-0091&lt;br /&gt;
IMPORTED:2:Telemovel:200:ELECTRONICA:8:2:China:30&lt;br /&gt;
MANUFACTURED:1:Camisa:45:VESTUARIO:2:4:Confeccoes Sul:C-1120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
A codificação dos ficheiros a ler é garantidamente [[wp:UTF-8|UTF-8]].&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Usar o método &#039;&#039;&#039;String.split()&#039;&#039;&#039; para partir cadeias de caracteres e &#039;&#039;&#039;String.trim()&#039;&#039;&#039; para remover espaços no início e no final.}}&lt;br /&gt;
{{Suggestion|Note-se que o programa nunca produz ficheiros com este formato (é apenas um formato para ficheiros de entrada).}}&lt;br /&gt;
&lt;br /&gt;
= Execução do Programa e Testes Automáticos =&lt;br /&gt;
&lt;br /&gt;
Usando os ficheiros &#039;&#039;&#039;test.import&#039;&#039;&#039;, &#039;&#039;&#039;test.in&#039;&#039;&#039; e &#039;&#039;&#039;test.out&#039;&#039;&#039;, é possível verificar automaticamente o resultado correcto do programa. Note-se que é necessária a definição apropriada da variável &#039;&#039;&#039;CLASSPATH&#039;&#039;&#039; (ou da opção equivalente &#039;&#039;&#039;-cp&#039;&#039;&#039; do comando &#039;&#039;&#039;java&#039;&#039;&#039;), para localizar as classes do programa, incluindo a que contém o método correspondente ao ponto de entrada da aplicação (&#039;&#039;&#039;erp.app.App.main&#039;&#039;&#039;). As propriedades são tratadas automaticamente pelo código de apoio.&lt;br /&gt;
&lt;br /&gt;
        java -Dimport=test.import -Din=test.in -Dout=test.outhyp erp.app.App&lt;br /&gt;
&lt;br /&gt;
Assumindo que aqueles ficheiros estão no directório onde é dado o comando de execução, o programa produz o ficheiro de saída &#039;&#039;&#039;test.outhyp&#039;&#039;&#039;. Em caso de sucesso, os ficheiros das saídas esperada (&#039;&#039;&#039;test.out&#039;&#039;&#039;) e obtida (&#039;&#039;&#039;test.outhyp&#039;&#039;&#039;) devem ser iguais. A comparação pode ser feita com o comando:&lt;br /&gt;
&lt;br /&gt;
         diff -b test.out test.outhyp&lt;br /&gt;
&lt;br /&gt;
Este comando não deve produzir qualquer resultado quando os ficheiros são iguais. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido, apenas verificando alguns aspectos da sua funcionalidade.&lt;br /&gt;
&lt;br /&gt;
= Notas de Implementação =&lt;br /&gt;
&lt;br /&gt;
Tal como indicado acima, algumas classes fornecidas como [[Programação com Objectos/Projecto de Programação com Objectos/Material de Apoio ao Desenvolvimento|material de apoio]], são de uso obrigatório e não podem ser alteradas. Outras dessas classes são de uso obrigatório e têm de ser alteradas.&lt;br /&gt;
&lt;br /&gt;
A serialização Java usa as classes da &#039;&#039;package&#039;&#039; [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/package-summary.html java.io], em particular, a interface [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/Serializable.html java.io.Serializable] e as classes de leitura [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/ObjectInputStream.html java.io.ObjectInputStream] e escrita [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/ObjectOutputStream.html java.io.ObjectOutputStream] (entre outras).&lt;br /&gt;
&lt;br /&gt;
[[category: Ensino]]&lt;br /&gt;
[[category:PO]]&lt;br /&gt;
[[category: Projecto de PO]]&lt;br /&gt;
[[en:Object-Oriented Programming]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Template:PRJPOMandatory20262027&amp;diff=17864</id>
		<title>Template:PRJPOMandatory20262027</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Template:PRJPOMandatory20262027&amp;diff=17864"/>
		<updated>2026-07-03T14:43:32Z</updated>

		<summary type="html">&lt;p&gt;Root: Created page with &amp;quot;{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #ffdb24;&amp;quot; ! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #ffdb24;&amp;quot; | &amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;Material de Uso Obrigatório&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039; |- ! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; bor...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #ffdb24;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #ffdb24;&amp;quot; | &#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;Material de Uso Obrigatório&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 0px; border-color: #bbbbaa; &amp;quot; | As bibliotecas &amp;lt;strong&amp;gt;po-uilib&amp;lt;/strong&amp;gt; e o conteúdo inicial do repositório GIT são de &amp;lt;strong&amp;gt;uso obrigatório&amp;lt;/strong&amp;gt;:&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 0px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
* po-uilib (classes de base)  [[media:po-uilib-202608310000.tar.bz2|po-uilib-202608310000.tar.bz2]] (não pode ser alterada) - [https://www.hlt.inesc-id.pt/~david/ist/docencia/po/2026-2027/javadoc/ javadoc]&lt;br /&gt;
* ewrp-core (classes do &amp;quot;core&amp;quot;) (via GIT) (deve ser completada -- os nomes das classes fornecidas não podem ser alterados)&lt;br /&gt;
* erp-app (classes de interacção) (via GIT) (deve ser completada -- os nomes das classes fornecidas não podem ser alterados)&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 0px; border-color: #bbbbaa; &amp;quot; | A [[Programação com Objectos/Projecto de Programação com Objectos/Máquina Virtual|máquina virtual]], fornecida para desenvolvimento do projecto, já contém todo o material de apoio.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 1px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #ffdb24;&amp;quot; | &#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;Uso Obrigatório: Repositório GIT&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 0px; border-color: #bbbbaa; &amp;quot; | &#039;&#039;&#039;Apenas se consideram para avaliação os projectos existentes no [[Programação com Objectos/Projecto de Programação com Objectos/Repositório GIT|repositório GIT oficial]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Trabalhos não presentes no repositório no final do prazo têm classificação 0 (zero) (não são aceites outras formas de entrega). Não são admitidas justificações para atrasos em sincronizações do repositório. A indisponibilidade temporária do repositório, desde que inferior a 24 horas, não justifica atrasos na submissão de um trabalho.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Template:PRJPOAvisosEN20262027&amp;diff=17863</id>
		<title>Template:PRJPOAvisosEN20262027</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Template:PRJPOAvisosEN20262027&amp;diff=17863"/>
		<updated>2026-07-03T14:41:55Z</updated>

		<summary type="html">&lt;p&gt;Root: Created page with &amp;quot;{{PRJPOAvisos|po26@inesc-id.pt|2026/10/16 12:00|2026/11/20 12:00|2026/12/18 12:00|2026/12/18 (early bird) 2027/01/06 (normal)}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJPOAvisos|po26@inesc-id.pt|2026/10/16 12:00|2026/11/20 12:00|2026/12/18 12:00|2026/12/18 (early bird) 2027/01/06 (normal)}}&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Projecto_de_Programa%C3%A7%C3%A3o_com_Objectos/Enunciado_do_Projecto_de_2026-2027_(rascunho)&amp;diff=17862</id>
		<title>Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2026-2027 (rascunho)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Projecto_de_Programa%C3%A7%C3%A3o_com_Objectos/Enunciado_do_Projecto_de_2026-2027_(rascunho)&amp;diff=17862"/>
		<updated>2026-07-03T14:39:15Z</updated>

		<summary type="html">&lt;p&gt;Root: Created page with &amp;quot;{{PRJPOAvisosEN20262027}} {{PRJPOMandatory20262027}} {{TOCright}}  &amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;EM PREPARAÇÃO&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;  &amp;#039;&amp;#039;&amp;#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;ÉPOCA NORMAL&amp;lt;/font&amp;gt;&amp;#039;&amp;#039;&amp;#039;  O objectivo do projecto é desenvolver um sistema de gestão de &amp;#039;&amp;#039;&amp;#039;entregas rápidas de produtos&amp;#039;&amp;#039;&amp;#039; (ERP). O sistema deverá permitir, entre outras operações, (i) registar dados de empresas; (ii) registar dados de clientes; (iii) consultar e pesquisar produtos; e (iv) efectuar compras e gerir as entregas corres...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJPOAvisosEN20262027}}&lt;br /&gt;
{{PRJPOMandatory20262027}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;EM PREPARAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;ÉPOCA NORMAL&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objectivo do projecto é desenvolver um sistema de gestão de &#039;&#039;&#039;entregas rápidas de produtos&#039;&#039;&#039; (ERP). O sistema deverá permitir, entre outras operações, (i) registar dados de empresas; (ii) registar dados de clientes; (iii) consultar e pesquisar produtos; e (iv) efectuar compras e gerir as entregas correspondentes.&lt;br /&gt;
&lt;br /&gt;
Neste texto, o tipo &#039;&#039;&#039;negrito&#039;&#039;&#039; indica um literal (i.e., é exactamente como apresentado); o símbolo ␣ indica um espaço; e o tipo &#039;&#039;itálico&#039;&#039; indica uma parte variável (i.e., uma descrição).&lt;br /&gt;
&lt;br /&gt;
= Conceitos e Relações do Modelo =&lt;br /&gt;
&lt;br /&gt;
Existem vários conceitos importantes neste contexto: [[#Empresas|empresas]], [[#Produtos|produtos]], [[#Clientes|clientes]], [[#Compras|compras]] e [[#Entregas|entregas]].&lt;br /&gt;
&lt;br /&gt;
Os conceitos listados não são os únicos possíveis no modelo e as suas relações (assim como relações com outros conceitos não mencionados) podem depender das escolhas do projecto.&lt;br /&gt;
&lt;br /&gt;
Os &#039;&#039;&#039;clientes&#039;&#039;&#039; e os &#039;&#039;&#039;produtos&#039;&#039;&#039; são independentes das empresas: existem por si e podem relacionar-se com várias empresas. Cada &#039;&#039;&#039;empresa&#039;&#039;&#039;, no entanto, mantém registo dos clientes com que interage, dos produtos que vende e das entregas que efectua.&lt;br /&gt;
&lt;br /&gt;
== Empresas ==&lt;br /&gt;
&lt;br /&gt;
O sistema mantém um registo das empresas que operam na plataforma. Cada empresa é identificada por um número de empresa. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Cada empresa tem ainda um nome (cadeia de caracteres não vazia).&lt;br /&gt;
&lt;br /&gt;
Cada empresa é responsável por manter actualizada informação sobre:&lt;br /&gt;
* os &#039;&#039;&#039;produtos&#039;&#039;&#039; que vende;&lt;br /&gt;
* os &#039;&#039;&#039;clientes&#039;&#039;&#039; com que já interagiu (i.e., que lhe fizeram compras);&lt;br /&gt;
* as &#039;&#039;&#039;entregas&#039;&#039;&#039; que efectuou.&lt;br /&gt;
&lt;br /&gt;
Note-se que a mesma informação global (produtos e clientes) pode ser partilhada por várias empresas. Deve ser possível adicionar outras propriedades às empresas sem impacto para o código já desenvolvido.&lt;br /&gt;
&lt;br /&gt;
== Produtos ==&lt;br /&gt;
&lt;br /&gt;
O sistema mantém um registo de produtos. Cada produto é identificado por um número de produto. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Todos os produtos têm um nome/descrição (cadeia de caracteres), um preço unitário (número inteiro, por simplicidade), um prazo de entrega (número inteiro de dias) e um número de exemplares em &#039;&#039;stock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Cada produto tem uma categoria, de acordo com a sua natureza. Inicialmente, consideram-se as seguintes categorias: (i) alimentar; (ii) electrónica; e (iii) vestuário. Deve ser possível adicionar novas categorias com impacto mínimo na aplicação já desenvolvida.&lt;br /&gt;
&lt;br /&gt;
Os produtos a considerar inicialmente são de dois tipos. As propriedades específicas de cada um (além das gerais) são as seguintes:&lt;br /&gt;
* Produto fabricado – nome do fabricante (cadeia de caracteres) e um código de fabrico (cadeia de caracteres).&lt;br /&gt;
* Produto importado – país de origem (cadeia de caracteres) e uma taxa alfandegária (número inteiro).&lt;br /&gt;
&lt;br /&gt;
Deve ser possível criar novos tipos de produto. O impacto da introdução dos novos tipos na implementação desenvolvida deve ser mínimo.&lt;br /&gt;
&lt;br /&gt;
== Clientes ==&lt;br /&gt;
&lt;br /&gt;
O sistema mantém um registo de clientes. Cada cliente é identificado por um número de cliente. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Cada cliente tem ainda informação sobre o seu nome e endereço de correio electrónico. Estes campos não podem ser vazios.&lt;br /&gt;
&lt;br /&gt;
Assume-se que &#039;&#039;&#039;os clientes têm sempre dinheiro&#039;&#039;&#039;, i.e., uma compra nunca é recusada por falta de fundos. Deve, no entanto, ser possível discriminar os clientes segundo outros critérios (por exemplo, o volume de compras), com um impacto mínimo na implementação desenvolvida.&lt;br /&gt;
&lt;br /&gt;
== Compras ==&lt;br /&gt;
O sistema regista as compras efectuadas pelos clientes. Cada compra é identificada por um número de compra, atribuído automaticamente e incrementalmente. Uma compra é sempre feita por um único &#039;&#039;&#039;cliente&#039;&#039;&#039; a uma única &#039;&#039;&#039;empresa&#039;&#039;&#039; e regista a data em que foi efectuada.&lt;br /&gt;
&lt;br /&gt;
Uma compra é constituída por um conjunto de linhas (um &amp;quot;cabaz&amp;quot;). Cada linha corresponde a:&lt;br /&gt;
* um &#039;&#039;&#039;produto&#039;&#039;&#039;;&lt;br /&gt;
* uma &#039;&#039;&#039;quantidade&#039;&#039;&#039; (número de exemplares adquiridos desse produto);&lt;br /&gt;
* um &#039;&#039;&#039;preço unitário&#039;&#039;&#039; (o preço do produto no momento da compra);&lt;br /&gt;
* um &#039;&#039;&#039;preço total da linha&#039;&#039;&#039; (quantidade × preço unitário).&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;&#039;preço total dos itens&#039;&#039;&#039; de uma compra é a soma dos preços totais das suas linhas. A cada compra está ainda associada uma &#039;&#039;&#039;sobretaxa de entrega&#039;&#039;&#039;, correspondente a &#039;&#039;&#039;10% do preço total dos itens&#039;&#039;&#039; (i.e., 10% por item). O &#039;&#039;&#039;preço total da compra&#039;&#039;&#039; é, assim, o preço total dos itens acrescido da sobretaxa de entrega.&lt;br /&gt;
&lt;br /&gt;
Como se descreve na secção seguinte, uma compra pode dar origem a mais do que uma entrega. A divisão de uma compra em várias entregas &#039;&#039;&#039;não acrescenta qualquer custo&#039;&#039;&#039;: a sobretaxa de entrega é sempre 10% do preço total dos itens, independentemente do número de entregas.&lt;br /&gt;
&lt;br /&gt;
== Entregas ==&lt;br /&gt;
&lt;br /&gt;
A cada compra correspondem uma ou mais &#039;&#039;&#039;entregas&#039;&#039;&#039;. As entregas são determinadas a partir dos prazos de entrega dos produtos que constam da compra.&lt;br /&gt;
&lt;br /&gt;
Calcula-se a &#039;&#039;&#039;média dos prazos de entrega&#039;&#039;&#039; dos produtos das linhas da compra. Então:&lt;br /&gt;
* todas as linhas cujo produto tem prazo &#039;&#039;&#039;menor ou igual à média&#039;&#039;&#039; são agrupadas numa única entrega (a entrega &amp;quot;conjunta&amp;quot;);&lt;br /&gt;
* cada linha cujo produto tem prazo &#039;&#039;&#039;estritamente maior do que a média&#039;&#039;&#039; é enviada &#039;&#039;&#039;separadamente&#039;&#039;&#039;, numa entrega própria (uma entrega &amp;quot;conjunta&amp;quot; pode não existir se todas as linhas forem enviadas separadamente).&lt;br /&gt;
&lt;br /&gt;
Cada entrega tem uma data de chegada, calculada a partir da data da compra e do prazo aplicável: uma entrega separada usa o prazo do respectivo produto; a entrega conjunta usa o maior dos prazos dos seus produtos. Como referido acima, o envio separado é feito &#039;&#039;&#039;sem custo adicional&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, considere-se uma compra com três linhas cujos produtos têm os prazos de entrega 3 (P1), 8 (P2) e 2 (P3). A média dos prazos é (3 + 8 + 2) / 3 ≈ 4,33. Logo, P1 e P3 (prazos ≤ 4,33) seguem juntos numa entrega e P2 (prazo &amp;gt; 4,33) segue numa entrega separada:&lt;br /&gt;
&lt;br /&gt;
 Entrega A: {P1, P3}   (prazo = 3)&lt;br /&gt;
 Entrega B: {P2}       (prazo = 8)   -- enviada separadamente&lt;br /&gt;
&lt;br /&gt;
== Pesquisas ==&lt;br /&gt;
&lt;br /&gt;
Para permitir que o sistema ajude os clientes a determinar a existência de um produto, deverá ser possível efectuar pesquisas. As pesquisas consideram os campos relevantes dos vários produtos (por exemplo, o nome e a categoria). O termo de pesquisa deve ser comparado sem distinção entre letras maiúsculas e minúsculas. Deve ser possível introduzir novos métodos de pesquisa de um produto com um impacto mínimo na implementação desenvolvida.&lt;br /&gt;
&lt;br /&gt;
== Alterações de Inventário de Produtos ==&lt;br /&gt;
&lt;br /&gt;
O &#039;&#039;stock&#039;&#039; de um produto pode ser alterado, através da especificação de um valor a somar/subtrair ao número de exemplares: se a quantidade indicada for um valor positivo, aumenta-se o número de exemplares disponíveis; se for um valor negativo, decrementa-se o número de exemplares disponíveis desde que o número de exemplares disponíveis não fique negativo.&lt;br /&gt;
&lt;br /&gt;
Caso o número de exemplares de um produto chegue a 0, então o produto deve ser removido do sistema.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que a remoção de um produto tem impacto na gestão das empresas que o vendiam.}}&lt;br /&gt;
&lt;br /&gt;
== Gestão de Tempo ==&lt;br /&gt;
&lt;br /&gt;
A unidade de tempo do sistema é o dia. A data do sistema começa no dia 1 (um) e faz parte do estado persistente. Sempre que a data é alterada, deve ser verificada a situação das entregas: uma entrega considera-se &#039;&#039;&#039;entregue&#039;&#039;&#039; quando a data actual atinge (ou ultrapassa) a sua data de chegada. Devem ainda ser actualizados outros aspectos que da data dependam.&lt;br /&gt;
&lt;br /&gt;
== Notificações ==&lt;br /&gt;
Deve existir um mecanismo de notificações que permita avisar eventuais interessados quando os produtos ficam em determinadas situações:&lt;br /&gt;
* Quando um produto sem qualquer exemplar disponível passa a ter pelo menos um exemplar disponível, quer-se enviar uma notificação a todas as entidades que demonstraram interesse nesta situação.&lt;br /&gt;
&lt;br /&gt;
As notificações de um cliente apenas devem ser apresentadas uma única vez. Após esta visualização, considera-se que o cliente fica sem notificações. As notificações devem ser apresentadas pela mesma ordem em que foram enviadas pelo sistema.&lt;br /&gt;
&lt;br /&gt;
No caso de uma entidade interessada em ser avisada da disponibilidade de um produto, isto significa que, sempre que o produto em causa passar da situação de indisponível (todos os exemplares esgotados) para disponível (pelo menos um exemplar), a entidade deve receber uma notificação. Deve ser possível definir novas entidades interessadas e novos tipos de notificação, com impacto mínimo no código do domínio da aplicação.&lt;br /&gt;
&lt;br /&gt;
= Requisitos de Desenho =&lt;br /&gt;
&lt;br /&gt;
A aplicação a desenvolver deve seguir o princípio de desenho aberto-fechado, por forma a aumentar a extensibilidade do seu código. Por exemplo, deve ser possível adicionar novos tipos de produto com um impacto mínimo no código já existente da aplicação.&lt;br /&gt;
&lt;br /&gt;
Devem ser possíveis extensões ou alterações de funcionalidade com impacto mínimo no código já produzido para a aplicação. O objectivo é aumentar a flexibilidade da aplicação relativamente ao suporte de novas funções. Assim, deve ser possível:&lt;br /&gt;
* Adicionar novos tipos de produto (e.g., produtos digitais ou perecíveis);&lt;br /&gt;
* Adicionar novas categorias de produto;&lt;br /&gt;
* Definir novas entidades que desejem ser notificadas da disponibilidade de produtos;&lt;br /&gt;
* Introduzir novos critérios de discriminação/classificação dos clientes;&lt;br /&gt;
* Introduzir novos métodos de pesquisa de produtos;&lt;br /&gt;
* Alterar a regra de cálculo das entregas e da sobretaxa de entrega com um impacto mínimo no código existente.&lt;br /&gt;
&lt;br /&gt;
= Funcionalidade da aplicação =&lt;br /&gt;
&lt;br /&gt;
A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir empresas, produtos, clientes e compras. Possui ainda a capacidade de preservar o seu estado (não é possível manter várias versões do estado da aplicação em simultâneo).&lt;br /&gt;
&lt;br /&gt;
A aplicação deve estar preparada para que se possa remover qualquer entidade (não apenas produtos).&lt;br /&gt;
&lt;br /&gt;
No [[#Leitura de Dados a Partir de Ficheiros Textuais|início]], a aplicação está vazia, mas pode ser carregada uma base de dados textual com conceitos pré-definidos. Neste caso, a aplicação começará com um estado referente às entidades que foram carregadas no arranque da aplicação.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que não é necessário implementar de raiz a aplicação: já existem classes que representam e definem a interface geral da funcionalidade do &#039;&#039;core&#039;&#039; da aplicação, tal como é visível pelos comandos da aplicação.}}&lt;br /&gt;
{{CVSCode|A interface geral do &#039;&#039;core&#039;&#039; já está parcialmente implementada na classe &#039;&#039;&#039;erp.ErpManager&#039;&#039;&#039; e outras fornecidas (cujos nomes devem ser mantidos), devendo ser adaptadas onde necessário. É ainda necessário criar e implementar as restantes classes que suportam a operação da aplicação.}}&lt;br /&gt;
{{Suggestion|O esqueleto actualmente fornecido no repositório ainda contém nomes herdados do projecto anterior (por exemplo, &#039;&#039;&#039;erp.LibraryManager&#039;&#039;&#039; e as &#039;&#039;packages&#039;&#039; &#039;&#039;&#039;erp.app.{work,user,request}&#039;&#039;&#039;), que devem ser adaptados aos conceitos deste enunciado (&#039;&#039;&#039;erp.app.{company,product,client,purchase}&#039;&#039;&#039;). Os nomes das classes de apoio de uso obrigatório não podem ser alterados.}}&lt;br /&gt;
&lt;br /&gt;
== Serialização ==&lt;br /&gt;
&lt;br /&gt;
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relacionada com o ERP e que foi descrita [[#Conceitos e Relações do Modelo|acima]].&lt;br /&gt;
&lt;br /&gt;
= Interacção com o utilizador =&lt;br /&gt;
&lt;br /&gt;
Descreve-se nesta secção a &#039;&#039;&#039;funcionalidade máxima&#039;&#039;&#039; da interface com o utilizador. Em geral, os comandos pedem toda a informação antes de procederem à sua validação (excepto onde indicado). Todos os menus têm automaticamente a opção &#039;&#039;&#039;Sair&#039;&#039;&#039; (fecha o menu).&lt;br /&gt;
&lt;br /&gt;
As operações de pedido e apresentação de informação ao utilizador &#039;&#039;&#039;devem&#039;&#039;&#039; realizar-se através dos objectos &#039;&#039;form&#039;&#039; e &#039;&#039;display&#039;&#039;, respectivamente, presentes em cada comando. As mensagens são produzidas pelos métodos das [[Programação com Objectos/Projecto de Programação com Objectos/Material de Apoio ao Desenvolvimento|bibliotecas de suporte]] (&#039;&#039;&#039;po-uilib&#039;&#039;&#039; e &#039;&#039;&#039;erp-app&#039;&#039;&#039;). As mensagens não podem ser usadas no núcleo da aplicação (&#039;&#039;&#039;erp-core&#039;&#039;&#039;). Além disso, não podem ser definidas novas. Potenciais omissões devem ser esclarecidas antes de qualquer implementação.&lt;br /&gt;
&lt;br /&gt;
De um modo geral, sempre que no contexto de uma operação com o utilizador aconteça alguma excepção, então a operação não deve ter qualquer efeito no estado da aplicação, excepto em caso de indicação contrária na operação em causa. As excepções estão na package &#039;&#039;&#039;erp.app.exceptions&#039;&#039;&#039;, excepto em caso de indicação contrária.&lt;br /&gt;
&lt;br /&gt;
As excepções usadas na interacção (subclasses de &#039;&#039;&#039;pt.tecnico.uilib.menus.CommandException&#039;&#039;&#039;), excepto em caso de indicação contrária, são lançadas pelos comandos (subclasses de &#039;&#039;&#039;pt.tecnico.uilib.menus.Command&#039;&#039;&#039;) e tratadas pelos menus (instâncias de subclasses de &#039;&#039;&#039;pt.tecnico.uilib.menus.Menu&#039;&#039;&#039;). Outras excepções não devem substituir as fornecidas nos casos descritos.&lt;br /&gt;
&lt;br /&gt;
Nos pedidos e usos dos vários identificadores, podem ocorrer as seguintes excepções, caso o identificador indicado não corresponda a um objecto conhecido (excepto no processo de registo ou em caso de indicação contrária). Note-se que estas excepções não são utilizáveis no núcleo da aplicação.&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Tipo de dados&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Classe&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Pedido a apresentar&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background: #ebebeb;&amp;quot; | &#039;&#039;&#039;Excepção a lançar se desconhecido&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Empresa&lt;br /&gt;
| &#039;&#039;&#039;Company&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.company.Prompt.companyId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownCompanyKeyException&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Produto&lt;br /&gt;
| &#039;&#039;&#039;Product&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.product.Prompt.productId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownProductKeyException&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cliente&lt;br /&gt;
| &#039;&#039;&#039;Client&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.client.Prompt.clientId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownClientKeyException&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Compra&lt;br /&gt;
| &#039;&#039;&#039;Purchase&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.purchase.Prompt.purchaseId()&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;erp.app.exceptions.UnknownPurchaseKeyException&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alguns casos particulares podem usar pedidos específicos não apresentados nesta tabela.&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|Note-se que o programa principal e os comandos e menus, a seguir descritos, já estão parcial ou completamente implementados nas &#039;&#039;packages&#039;&#039; &#039;&#039;&#039;erp.app&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.main&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.company&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.product&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.client&#039;&#039;&#039;, &#039;&#039;&#039;erp.app.purchase&#039;&#039;&#039;. Estas classes são de uso obrigatório e estão disponíveis no [[Programação com Objectos/Projecto de Programação com Objectos/Repositório GIT|GIT]] (módulo &#039;&#039;&#039;erp-app&#039;&#039;&#039;).}}&lt;br /&gt;
&lt;br /&gt;
== Menu Principal ==&lt;br /&gt;
&lt;br /&gt;
As acções deste menu permitem gerir a salvaguarda do estado da aplicação e abrir submenus. A lista completa é a seguinte: [[#Salvaguarda do estado actual da aplicação|Abrir]], [[#Salvaguarda do estado actual da aplicação|Guardar]], [[#Mostrar data actual|Mostrar data actual]], [[#Avançar data actual|Avançar data actual]], [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Empresas]], [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Produtos]], [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Clientes]] e [[#Gestão e consulta de dados da aplicação|Menu de Gestão de Compras]]. Inicialmente, a aplicação apenas tem informação sobre as entidades que foram carregadas no arranque.&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas na classe &#039;&#039;&#039;erp.app.main.Label&#039;&#039;&#039;. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe &#039;&#039;&#039;erp.app.main.Message&#039;&#039;&#039;.}}&lt;br /&gt;
{{CVSCode|Estes comandos já estão implementados nas classes da &#039;&#039;package&#039;&#039; &#039;&#039;&#039;erp.app.main&#039;&#039;&#039;, respectivamente: &#039;&#039;&#039;DoOpenFile&#039;&#039;&#039;, &#039;&#039;&#039;DoSaveFile&#039;&#039;&#039;, &#039;&#039;&#039;DoDisplayDate&#039;&#039;&#039;, &#039;&#039;&#039;DoAdvanceDate&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuCompanies&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuProducts&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuClients&#039;&#039;&#039;, &#039;&#039;&#039;DoOpenMenuPurchases&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Salvaguarda do estado actual da aplicação ===&lt;br /&gt;
O conteúdo da aplicação (toda a informação detida pelo ERP actualmente em memória) pode ser guardado para posterior recuperação (via serialização Java: &#039;&#039;&#039;java.io.Serializable&#039;&#039;&#039;). Na leitura e escrita do estado da aplicação, devem ser tratadas as excepções associadas. A funcionalidade é a seguinte:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Abrir&#039;&#039;&#039; -- Carrega os dados de uma sessão anterior a partir de um ficheiro previamente guardado (ficando este ficheiro associado à aplicação, para futuras operações de salvaguarda). Pede-se o nome do ficheiro a abrir (&#039;&#039;&#039;Prompt.openFile()&#039;&#039;&#039;). Caso ocorra um problema na abertura ou processamento do ficheiro, deve ser lançada a excepção &#039;&#039;&#039;FileOpenFailedException&#039;&#039;&#039;. A execução bem-sucedida desta opção substitui toda a informação da aplicação. &amp;lt;br/&amp;gt;Quando se abandona uma aplicação com modificações não guardadas (porque se abre outra e existem alterações não guardadas), deve perguntar-se ao utilizador se quer guardar a informação actual antes de a abandonar, através de &#039;&#039;&#039;Prompt.saveBeforeExit()&#039;&#039;&#039; (a resposta é obtida via &#039;&#039;&#039;Form.confirm()&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Guardar&#039;&#039;&#039; -- Guarda o estado actual da aplicação no ficheiro associado. Se não existir associação, pede-se o nome do ficheiro a utilizar, ficando a ele associado (para operações de salvaguarda subsequentes). Esta interacção realiza-se através do método &#039;&#039;&#039;Prompt.newSaveAs()&#039;&#039;&#039;. Não é executada nenhuma acção se não existirem alterações desde a última salvaguarda.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que a opção &#039;&#039;&#039;Abrir&#039;&#039;&#039; não permite a leitura de ficheiros de texto (estes apenas podem ser utilizados no início da aplicação).}}&lt;br /&gt;
{{Suggestion|A opção &#039;&#039;&#039;Sair&#039;&#039;&#039; nunca implica a salvaguarda do estado da aplicação, mesmo que existam alterações.}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar data actual ===&lt;br /&gt;
&lt;br /&gt;
A data actual do sistema é apresentada através da mensagem &#039;&#039;&#039;Message.currentDate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Avançar data actual ===&lt;br /&gt;
&lt;br /&gt;
O número de dias a avançar é pedido através de &#039;&#039;&#039;Prompt.daysToAdvance()&#039;&#039;&#039;. O valor indicado deve ser positivo. Caso contrário, a operação não tem efeito.&lt;br /&gt;
&lt;br /&gt;
Além da data, o sistema deve actualizar, caso seja necessário, outros aspectos que dela dependam, designadamente, a situação das entregas relativa às suas datas de chegada.&lt;br /&gt;
&lt;br /&gt;
=== Gestão e consulta de dados da aplicação ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Empresas&#039;&#039;&#039; -- Abre o menu de gestão de empresas e operações associadas.&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Produtos&#039;&#039;&#039; -- Abre o menu de gestão de produtos e operações associadas.&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Clientes&#039;&#039;&#039; -- Abre o menu de gestão de clientes e operações associadas.&lt;br /&gt;
* &#039;&#039;&#039;Menu de Gestão de Compras&#039;&#039;&#039; -- Abre o menu de gestão de compras e operações associadas.&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Empresas ==&lt;br /&gt;
&lt;br /&gt;
Este menu permite efectuar operações sobre a base de dados de empresas. A lista completa é a seguinte: [[#Registar empresa|Registar empresa]], [[#Mostrar empresa|Mostrar empresa]], [[#Mostrar empresas|Mostrar empresas]], [[#Mostrar produtos de uma empresa|Mostrar produtos de uma empresa]], [[#Mostrar clientes de uma empresa|Mostrar clientes de uma empresa]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.company.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.company.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.company.Message&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Registar empresa ===&lt;br /&gt;
&lt;br /&gt;
Pede o nome (&#039;&#039;&#039;Prompt.companyName()&#039;&#039;&#039;). O registo bem sucedido é assinalado através da mensagem &#039;&#039;&#039;Message.registrationSuccessful()&#039;&#039;&#039;; caso contrário, é lançada a excepção &#039;&#039;&#039;CompanyRegistrationFailedException&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note-se que a atribuição do identificador da empresa é automática.&lt;br /&gt;
&lt;br /&gt;
=== Mostrar empresa ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da empresa, sendo apresentadas as informações sobre essa empresa, de acordo com o seguinte formato:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de uma empresa|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;nome&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar empresas ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todas as empresas, ordenando-as pelos seus identificadores. O formato é o descrito em [[#Mostrar empresa|Mostrar empresa]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar produtos de uma empresa ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da empresa e apresentam-se os produtos que essa empresa vende, ordenados pelos seus identificadores, utilizando o formato descrito em [[#Mostrar produto|Mostrar produto]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar clientes de uma empresa ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da empresa e apresentam-se os clientes que já interagiram com essa empresa, ordenados pelos seus identificadores, utilizando o formato descrito em [[#Mostrar cliente|Mostrar cliente]].&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Produtos ==&lt;br /&gt;
&lt;br /&gt;
Este menu apresenta as operações disponíveis sobre produtos. A lista completa é a seguinte: [[#Mostrar produto|Mostrar produto]], [[#Mostrar produtos|Mostrar produtos]], [[#Alterar inventário de um produto|Alterar inventário de um produto]] e [[#Efectuar pesquisa|Efectuar pesquisa]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.product.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.product.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.product.Message&#039;&#039;&#039;.}}&lt;br /&gt;
{{CVSCode|Estes comandos já estão implementados nas classes da &#039;&#039;package&#039;&#039; &#039;&#039;&#039;erp.app.product&#039;&#039;&#039; (disponível no GIT), respectivamente: &#039;&#039;&#039;DoShowProduct&#039;&#039;&#039;, &#039;&#039;&#039;DoShowProducts&#039;&#039;&#039;, &#039;&#039;&#039;DoChangeProductInventory&#039;&#039;&#039;, &#039;&#039;&#039;DoPerformSearch&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar produto ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador do produto. Se o produto existir, é apresentado de acordo com o seguinte formato. O formato genérico de apresentação de um produto é como se segue:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de produtos|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;stock&#039;&#039; - &#039;&#039;tipo&#039;&#039; - &#039;&#039;nome&#039;&#039; - &#039;&#039;preço&#039;&#039; - &#039;&#039;categoria&#039;&#039; - &#039;&#039;informação adicional&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Para produtos fabricados, a informação adicional corresponde ao nome do fabricante e ao código de fabrico (separados pelo carácter &#039;&#039;&#039;;&#039;&#039;&#039;); para produtos importados, a informação adicional corresponde ao país de origem e à taxa alfandegária.&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de produtos|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
3 - 20 - FABRICADO - Farinha - 15 - ALIMENTAR - Moageira Nacional; F-0091&lt;br /&gt;
4 - 2 - IMPORTADO - Telemóvel - 200 - ELECTRONICA - China - 30&lt;br /&gt;
5 - 0 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar produtos ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todos os produtos, ordenando-os pelos seus identificadores. O formato de apresentação é como descrito em [[#Mostrar produto|Mostrar produto]].&lt;br /&gt;
&lt;br /&gt;
=== Alterar inventário de um produto ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador de um produto e uma quantidade (&#039;&#039;&#039;Prompt.amountToUpdate()&#039;&#039;&#039;) e actualizado o número de exemplares disponíveis do produto indicado somando a quantidade indicada ao número de exemplares disponíveis. No caso de não ser possível actualizar o número de exemplares devido ao facto de a quantidade indicada ser inválida, então a operação não deve ter qualquer efeito e deve ser apresentada a mensagem &#039;&#039;&#039;Message.notEnoughInventory()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Efectuar pesquisa ===&lt;br /&gt;
&lt;br /&gt;
Esta opção realiza uma procura por termo (cadeia de caracteres), pedido através de &#039;&#039;&#039;Prompt.searchTerm()&#039;&#039;&#039;. Como resultado, deve ser apresentada uma lista dos produtos encontrados pela pesquisa, ordenados por ordem crescente do seu identificador, utilizando o formato descrito para [[#Mostrar produto|Mostrar produto]].&lt;br /&gt;
&lt;br /&gt;
O termo de pesquisa deve ser comparado (sem distinção entre letras maiúsculas e minúsculas) com os campos relevantes de cada produto: o nome e a categoria. Só devem ser apresentados produtos que contenham o termo de pesquisa num dos campos relevantes. Caso não sejam encontrados produtos, não deve ser produzido qualquer resultado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Clientes ==&lt;br /&gt;
&lt;br /&gt;
Este menu permite efectuar operações sobre a base de dados de clientes. A lista completa é a seguinte: [[#Registar cliente|Registar cliente]], [[#Mostrar cliente|Mostrar cliente]], [[#Mostrar clientes|Mostrar clientes]], [[#Mostrar notificações do cliente|Mostrar notificações do cliente]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.client.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.client.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.client.Message&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Registar cliente ===&lt;br /&gt;
&lt;br /&gt;
Pede o nome (&#039;&#039;&#039;Prompt.clientName()&#039;&#039;&#039;) e o endereço de correio electrónico (&#039;&#039;&#039;Prompt.clientEMail()&#039;&#039;&#039;). O registo bem sucedido é assinalado através da mensagem &#039;&#039;&#039;Message.registrationSuccessful()&#039;&#039;&#039;; caso contrário, é lançada a excepção &#039;&#039;&#039;ClientRegistrationFailedException&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note-se que a atribuição do identificador do cliente é automática e que clientes diferentes são registados em cada operação de registo.&lt;br /&gt;
&lt;br /&gt;
=== Mostrar cliente ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador do cliente, sendo apresentadas as informações sobre esse cliente, de acordo com o seguinte formato. O valor apresentado após o email corresponde ao total gasto pelo cliente em compras (um valor inteiro).&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de um cliente|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;nome&#039;&#039; - &#039;&#039;email&#039;&#039; - &#039;&#039;gasto total&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de clientes|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2 - Alberto Meireles - ameireles@mymail.com - 275&lt;br /&gt;
1 - Fernando Meireles - fmeireles@mymail.com - 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar clientes ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todos os clientes, ordenando-os lexicograficamente pelo nome. Caso existam clientes com o mesmo nome, devem ser ordenados por ordem crescente dos seus identificadores. O formato é o descrito em [[#Mostrar cliente|Mostrar cliente]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar notificações do cliente ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador do cliente, sendo apresentadas as notificações para esse cliente, de acordo com o seguinte formato:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação das notificações de um cliente|&lt;br /&gt;
 DISPONIBILIDADE: &#039;&#039;descrição de produto disponível&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de notificações|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
DISPONIBILIDADE: 5 - 4 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note-se que a descrição é idêntica à que é realizada para mostrar cada produto. No entanto, a solução deve ser suficientemente flexível para permitir outros formatos de apresentação das notificações (sem impacto no código do domínio da aplicação).&lt;br /&gt;
&lt;br /&gt;
== Menu de Gestão de Compras ==&lt;br /&gt;
&lt;br /&gt;
Este menu apresenta as operações relacionadas com compras e entregas. A lista completa é a seguinte: [[#Efectuar compra|Efectuar compra]], [[#Mostrar compra|Mostrar compra]], [[#Mostrar compras|Mostrar compras]], [[#Mostrar entregas de uma compra|Mostrar entregas de uma compra]].&lt;br /&gt;
&lt;br /&gt;
{{CVSCode|As etiquetas das opções deste menu estão definidas em &#039;&#039;&#039;erp.app.purchase.Label&#039;&#039;&#039;. Os métodos correspondentes às mensagens de diálogo para este menu estão definidos em &#039;&#039;&#039;erp.app.purchase.Prompt&#039;&#039;&#039; e &#039;&#039;&#039;erp.app.purchase.Message&#039;&#039;&#039;.}}&lt;br /&gt;
{{CVSCode|Estes comandos já estão implementados nas classes da &#039;&#039;package&#039;&#039; &#039;&#039;&#039;erp.app.purchase&#039;&#039;&#039; (disponível no GIT), respectivamente: &#039;&#039;&#039;DoDoPurchase&#039;&#039;&#039;, &#039;&#039;&#039;DoShowPurchase&#039;&#039;&#039;, &#039;&#039;&#039;DoShowPurchases&#039;&#039;&#039;, &#039;&#039;&#039;DoShowPurchaseDeliveries&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Efectuar compra ===&lt;br /&gt;
&lt;br /&gt;
No processo de efectuar uma compra, o sistema pede, primeiro, a identificação do cliente; de seguida, a identificação da empresa a que a compra é feita; e, finalmente, para cada linha, o identificador do produto e a quantidade pretendida (&#039;&#039;&#039;Prompt.productId()&#039;&#039;&#039; e &#039;&#039;&#039;Prompt.amountToBuy()&#039;&#039;&#039;). O processo de adição de linhas termina de acordo com a interacção definida no comando.&lt;br /&gt;
&lt;br /&gt;
Se não houver exemplares suficientes de um produto para satisfazer a quantidade pretendida, deve ser apresentada a mensagem &#039;&#039;&#039;Message.notEnoughInventory()&#039;&#039;&#039; e essa linha não é adicionada. Concluída a compra, o &#039;&#039;stock&#039;&#039; dos produtos é decrementado, a empresa passa a seguir o cliente e são determinadas as entregas correspondentes. A data limite de chegada de cada entrega é comunicada através da mensagem &#039;&#039;&#039;Message.deliveryDate()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Mostrar compra ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da compra, sendo apresentadas as informações sobre essa compra, de acordo com o seguinte formato:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de uma compra|&lt;br /&gt;
 &#039;&#039;id&#039;&#039; - &#039;&#039;idCliente&#039;&#039; - &#039;&#039;idEmpresa&#039;&#039; - &#039;&#039;data&#039;&#039; - &#039;&#039;preço total dos itens&#039;&#039; - &#039;&#039;sobretaxa de entrega&#039;&#039; - &#039;&#039;preço total&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de compras|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
7 - 3 - 1 - 4 - 90 - 9 - 99&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mostrar compras ===&lt;br /&gt;
&lt;br /&gt;
Apresenta informações sobre todas as compras, ordenando-as pelos seus identificadores. O formato é o descrito em [[#Mostrar compra|Mostrar compra]].&lt;br /&gt;
&lt;br /&gt;
=== Mostrar entregas de uma compra ===&lt;br /&gt;
&lt;br /&gt;
É pedido o identificador da compra e são apresentadas as entregas correspondentes, ordenadas pela data de chegada e, em caso de empate, pelos identificadores dos produtos. Cada entrega é apresentada de acordo com o seguinte formato:&lt;br /&gt;
{{CollapsedCode|Formato de apresentação de uma entrega|&lt;br /&gt;
 &#039;&#039;idCompra&#039;&#039; - &#039;&#039;data de chegada&#039;&#039; - &#039;&#039;lista de identificadores de produtos&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{CollapsedCode|Exemplos de apresentação de entregas (compra do exemplo da secção Entregas)|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
7 - 7 - 1, 3&lt;br /&gt;
7 - 12 - 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Leitura de Dados a Partir de Ficheiros Textuais =&lt;br /&gt;
&lt;br /&gt;
Além das opções de manipulação de ficheiros descritas no [[#Menu Principal|menu principal]], é possível iniciar a aplicação com um ficheiro de texto especificado pela propriedade Java &#039;&#039;&#039;[[#Execução do Programa e Testes Automáticos|import]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Cada linha tem uma descrição distinta mas que segue o seguinte formato geral. É possível registar empresas, clientes e produtos, e definir os produtos que cada empresa vende. Assume-se que os campos de texto não podem conter o carácter &#039;&#039;&#039;:&#039;&#039;&#039; e que os preços são números inteiros. Não existem entradas mal-formadas.&lt;br /&gt;
&lt;br /&gt;
Os produtos têm o formato descrito abaixo, respectivamente, para produtos fabricados e importados. O campo &#039;&#039;stock&#039;&#039; indica o número de exemplares disponíveis do produto.&lt;br /&gt;
&lt;br /&gt;
 MANUFACTURED:&#039;&#039;idEmpresa&#039;&#039;:&#039;&#039;nome&#039;&#039;:&#039;&#039;preço&#039;&#039;:&#039;&#039;categoria&#039;&#039;:&#039;&#039;prazo&#039;&#039;:&#039;&#039;stock&#039;&#039;:&#039;&#039;fabricante&#039;&#039;:&#039;&#039;codigo&#039;&#039;&lt;br /&gt;
 IMPORTED:&#039;&#039;idEmpresa&#039;&#039;:&#039;&#039;nome&#039;&#039;:&#039;&#039;preço&#039;&#039;:&#039;&#039;categoria&#039;&#039;:&#039;&#039;prazo&#039;&#039;:&#039;&#039;stock&#039;&#039;:&#039;&#039;paisOrigem&#039;&#039;:&#039;&#039;taxa&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O registo de empresas e de clientes segue os formatos:&lt;br /&gt;
&lt;br /&gt;
 COMPANY:&#039;&#039;nome&#039;&#039;&lt;br /&gt;
 CLIENT:&#039;&#039;nome&#039;&#039;:&#039;&#039;email&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Um exemplo de conteúdo do ficheiro inicial é como se segue:&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Exemplo de ficheiro de entrada textual|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
COMPANY:Moageira Nacional&lt;br /&gt;
COMPANY:Importadora Atlantico&lt;br /&gt;
CLIENT:Obi-Wan Kenobi:obiwan@jedi.org&lt;br /&gt;
MANUFACTURED:1:Farinha:15:ALIMENTAR:3:23:Moageira Nacional:F-0091&lt;br /&gt;
IMPORTED:2:Telemovel:200:ELECTRONICA:8:2:China:30&lt;br /&gt;
MANUFACTURED:1:Camisa:45:VESTUARIO:2:4:Confeccoes Sul:C-1120&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
A codificação dos ficheiros a ler é garantidamente [[wp:UTF-8|UTF-8]].&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Usar o método &#039;&#039;&#039;String.split()&#039;&#039;&#039; para partir cadeias de caracteres e &#039;&#039;&#039;String.trim()&#039;&#039;&#039; para remover espaços no início e no final.}}&lt;br /&gt;
{{Suggestion|Note-se que o programa nunca produz ficheiros com este formato (é apenas um formato para ficheiros de entrada).}}&lt;br /&gt;
&lt;br /&gt;
= Execução do Programa e Testes Automáticos =&lt;br /&gt;
&lt;br /&gt;
Usando os ficheiros &#039;&#039;&#039;test.import&#039;&#039;&#039;, &#039;&#039;&#039;test.in&#039;&#039;&#039; e &#039;&#039;&#039;test.out&#039;&#039;&#039;, é possível verificar automaticamente o resultado correcto do programa. Note-se que é necessária a definição apropriada da variável &#039;&#039;&#039;CLASSPATH&#039;&#039;&#039; (ou da opção equivalente &#039;&#039;&#039;-cp&#039;&#039;&#039; do comando &#039;&#039;&#039;java&#039;&#039;&#039;), para localizar as classes do programa, incluindo a que contém o método correspondente ao ponto de entrada da aplicação (&#039;&#039;&#039;erp.app.App.main&#039;&#039;&#039;). As propriedades são tratadas automaticamente pelo código de apoio.&lt;br /&gt;
&lt;br /&gt;
        java -Dimport=test.import -Din=test.in -Dout=test.outhyp erp.app.App&lt;br /&gt;
&lt;br /&gt;
Assumindo que aqueles ficheiros estão no directório onde é dado o comando de execução, o programa produz o ficheiro de saída &#039;&#039;&#039;test.outhyp&#039;&#039;&#039;. Em caso de sucesso, os ficheiros das saídas esperada (&#039;&#039;&#039;test.out&#039;&#039;&#039;) e obtida (&#039;&#039;&#039;test.outhyp&#039;&#039;&#039;) devem ser iguais. A comparação pode ser feita com o comando:&lt;br /&gt;
&lt;br /&gt;
         diff -b test.out test.outhyp&lt;br /&gt;
&lt;br /&gt;
Este comando não deve produzir qualquer resultado quando os ficheiros são iguais. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido, apenas verificando alguns aspectos da sua funcionalidade.&lt;br /&gt;
&lt;br /&gt;
= Notas de Implementação =&lt;br /&gt;
&lt;br /&gt;
Tal como indicado acima, algumas classes fornecidas como [[Programação com Objectos/Projecto de Programação com Objectos/Material de Apoio ao Desenvolvimento|material de apoio]], são de uso obrigatório e não podem ser alteradas. Outras dessas classes são de uso obrigatório e têm de ser alteradas.&lt;br /&gt;
&lt;br /&gt;
A serialização Java usa as classes da &#039;&#039;package&#039;&#039; [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/package-summary.html java.io], em particular, a interface [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/Serializable.html java.io.Serializable] e as classes de leitura [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/ObjectInputStream.html java.io.ObjectInputStream] e escrita [https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/io/ObjectOutputStream.html java.io.ObjectOutputStream] (entre outras).&lt;br /&gt;
&lt;br /&gt;
[[category: Ensino]]&lt;br /&gt;
[[category:PO]]&lt;br /&gt;
[[category: Projecto de PO]]&lt;br /&gt;
[[en:Object-Oriented Programming]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_Global_do_Projecto&amp;diff=17861</id>
		<title>Compiladores/Pautas 2025-2026/Pauta Global do Projecto</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_Global_do_Projecto&amp;diff=17861"/>
		<updated>2026-06-12T09:50:31Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Prazo de Revisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO: falta nota do teste prático&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
* Época Normal: &#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039; (ver prazo da entrega em curso ou data do teste prático)&lt;br /&gt;
* Época Especial: &amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt; (teste prático a realizar em Julho de 2026 -- ver Fénix)&lt;br /&gt;
&lt;br /&gt;
== Legenda da Pauta Global do Projecto ==&lt;br /&gt;
&lt;br /&gt;
Períodos de avaliação:&lt;br /&gt;
* EN - época normal&lt;br /&gt;
* EE - época especial&lt;br /&gt;
&lt;br /&gt;
Componentes de avaliação:&lt;br /&gt;
* PRJ - nota final do projecto&lt;br /&gt;
* PRJ EN - nota final do projecto (época normal)&lt;br /&gt;
* PRJ EE - nota final do projecto (época especial)&lt;br /&gt;
* E0 - nota da entrega do diagrama UML&lt;br /&gt;
* EI- nota da entrega intermédia&lt;br /&gt;
* EF- nota da entrega final&lt;br /&gt;
* TP - nota do teste prático (EN ou EE)&lt;br /&gt;
&lt;br /&gt;
A nota do teste prático condiciona a distância ao mínimo entre as notas do teste prático e a do projecto: desde um mínimo de 12.5% de acréscimo à menor das duas (abaixo de 7.5 valores no TP), até um máximo de 25% (para 20 valores no TP). O acréscimo é linear entre 7.5 e 20.&lt;br /&gt;
&lt;br /&gt;
Ou seja:&lt;br /&gt;
&lt;br /&gt;
* PRJ EN = E0 + EI + EF&lt;br /&gt;
* PRJ = min(PRJ EN, TP) + | TP - PRJ EN | * max(12.5, TP+5) / 100&lt;br /&gt;
&lt;br /&gt;
(para EE, PRJ EE é apenas uma entrega e TP é TP EE)&lt;br /&gt;
&lt;br /&gt;
Condições necessárias para aprovação à disciplina (necessárias todas):&lt;br /&gt;
&lt;br /&gt;
* PRJ &amp;gt;= 9.5 (sem arredondamento)&lt;br /&gt;
* PRJ != NA &lt;br /&gt;
* TP &amp;gt; 0&lt;br /&gt;
* TP != NA&lt;br /&gt;
&lt;br /&gt;
Linhas sombreadas correspondem a alunos excluídos da avaliação em Época Normal, por não terem realizado componentes obrigatórias do projecto.  Alunos que tenham realizado todas as componentes podem estar em linhas sombreadas se não for possível a aprovação (critérios mínimos).&lt;br /&gt;
&lt;br /&gt;
Se o projecto não obtiver aprovação em Época Normal, então tem de ser realizado um teste prático sobre projecto a fornecer em Época Especial.&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Final&amp;diff=17860</id>
		<title>Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Final&amp;diff=17860"/>
		<updated>2026-06-12T09:49:50Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Prazo de Revisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO: falta nota do teste prático&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ver anúncio na página da disciplina (Fénix).&lt;br /&gt;
&lt;br /&gt;
== Critérios de Avaliação ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;A entrega final é obrigatória.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
São considerados os das entregas anteriores (adaptados).&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
&lt;br /&gt;
A entrega final vale 12 valores em 20 (7 qualidade; 5 automáticos).&lt;br /&gt;
&lt;br /&gt;
* Qualidade (7 valores): análise lexical (0.75) + análise sintáctica (0.75) + nós (AST) (0.75) + análise semântica e geração de código (0.75) + avaliação global (0.50) + repositório e compilação (0.50). Os pesos são relativos ao total 4 (i.e., o valor final multiplica por 7/4).&lt;br /&gt;
* Testes automáticos (5 valores).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Os alunos são encorajados a compreender/verificar os problemas reportados. Todos os alunos podem proceder a correcções pequenas (contactar responsável) para resolver algum problema. Haverá penalizações por efectuar correcções a código entregue.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Os alunos são encorajados a compreender/verificar os problemas reportados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quaisquer dúvidas ou sugestões, relativas a esta informação, devem ser enviadas ao responsável pela disciplina ou esclarecidas nos horários de dúvidas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recorda-se que a classificação global do projecto não se limita à soma das classificações das várias entregas: a classificação final é ainda influenciada pela classificação do teste prático. Este teste é obrigatório e eliminatório (i.e., a classificação deve ser maior que zero).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Descrição dos problemas assinalados na pauta&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&#039;&#039;&#039;Problemas na análise lexical&#039;&#039;&#039;&lt;br /&gt;
* .* - uso indevido do padrão&lt;br /&gt;
* chars - definição indevida (não existem na linguagem)&lt;br /&gt;
* comments - problemas com comentários (em excesso ou em falta)&lt;br /&gt;
* real - problemas com reais (definições incompletas ou excessivas)&lt;br /&gt;
* ints - problemas com inteiros (definições incompletas ou excessivas)&lt;br /&gt;
* keywords - problemas com palavras chave (a mais ou a menos)&lt;br /&gt;
* strings - problemas na definição de strings (composição, concatenação indevida, etc.)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas na análise sintáctica&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* conflicts - conflitos no analisador LALR(1)&lt;br /&gt;
* exprs - problemas nas expressões (em falta ou com inclusão de casos errados)&lt;br /&gt;
* lvals - problemas na definição de left-values (e.g. ausência de definições ou incompletas)&lt;br /&gt;
* precs - problemas na definição de precedências (tipicamente, em excesso ou sem correspondência com o manual)&lt;br /&gt;
* strings - problemas na definção de cadeias de caracteres&lt;br /&gt;
* syntax - problemas na definição da gramática (relativamente ao manual de referência)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas nos nós&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas na análise semântica e na geração de código&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* symbol - problemas na definição dos símbolos (atributos em excesso ou em falta)&lt;br /&gt;
* stack - problemas na definição do stack das funções&lt;br /&gt;
* types - problemas na verificação de tipos&lt;br /&gt;
* postfix - problemas na geração de código&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outros problemas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* empty methods - métodos vazios nos visitors (não deviam ser vazios)&lt;br /&gt;
* types - problemas com o visitor de verificação de tipos&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17859</id>
		<title>Compiladores/Pautas 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17859"/>
		<updated>2026-06-12T09:49:29Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pautas do Projecto (época normal) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
Além dos resultados de avaliação, as páginas das pautas contêm também os critérios de avaliação e aprovação.&lt;br /&gt;
* {{PautaAberta}} indica avaliação em curso&lt;br /&gt;
* {{PautaFechada}} indica avaliação terminada (classificações definitivas)&lt;br /&gt;
* {{ProvaPorRealizar}} indica avaliação prevista&lt;br /&gt;
&lt;br /&gt;
== Pautas da Disciplina ==&lt;br /&gt;
&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global da Disciplina|Pauta Global da Disciplina]] -- próxima avaliação: (ver Fénix)&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas|Pauta das Aulas Práticas]] (época nornal)&lt;br /&gt;
&lt;br /&gt;
== Pautas do Projecto (época normal) ==&lt;br /&gt;
&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;|Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia|Pauta do Projecto: Entrega Intermédia]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final|Pauta do Projecto: Entrega Final]]&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global do Projecto|Pauta Global do Projecto]]&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17858</id>
		<title>Compiladores/Pautas 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17858"/>
		<updated>2026-06-12T09:49:02Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pautas do Projecto (época normal) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
Além dos resultados de avaliação, as páginas das pautas contêm também os critérios de avaliação e aprovação.&lt;br /&gt;
* {{PautaAberta}} indica avaliação em curso&lt;br /&gt;
* {{PautaFechada}} indica avaliação terminada (classificações definitivas)&lt;br /&gt;
* {{ProvaPorRealizar}} indica avaliação prevista&lt;br /&gt;
&lt;br /&gt;
== Pautas da Disciplina ==&lt;br /&gt;
&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global da Disciplina|Pauta Global da Disciplina]] -- próxima avaliação: (ver Fénix)&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas|Pauta das Aulas Práticas]] (época nornal)&lt;br /&gt;
&lt;br /&gt;
== Pautas do Projecto (época normal) ==&lt;br /&gt;
&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;|Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia|Pauta do Projecto: Entrega Intermédia]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final|Pauta do Projecto: Entrega Final]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta Global do Projecto|Pauta Global do Projecto]]&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17857</id>
		<title>Compiladores/Pautas 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17857"/>
		<updated>2026-06-12T09:48:46Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pautas do Projecto (época normal) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
Além dos resultados de avaliação, as páginas das pautas contêm também os critérios de avaliação e aprovação.&lt;br /&gt;
* {{PautaAberta}} indica avaliação em curso&lt;br /&gt;
* {{PautaFechada}} indica avaliação terminada (classificações definitivas)&lt;br /&gt;
* {{ProvaPorRealizar}} indica avaliação prevista&lt;br /&gt;
&lt;br /&gt;
== Pautas da Disciplina ==&lt;br /&gt;
&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global da Disciplina|Pauta Global da Disciplina]] -- próxima avaliação: (ver Fénix)&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas|Pauta das Aulas Práticas]] (época nornal)&lt;br /&gt;
&lt;br /&gt;
== Pautas do Projecto (época normal) ==&lt;br /&gt;
&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;|Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia|Pauta do Projecto: Entrega Intermédia]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final|Pauta do Projecto: Entrega Final]]&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global do Projecto|Pauta Global do Projecto]]&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_Global_do_Projecto&amp;diff=17856</id>
		<title>Compiladores/Pautas 2025-2026/Pauta Global do Projecto</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_Global_do_Projecto&amp;diff=17856"/>
		<updated>2026-06-11T08:15:27Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pauta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO: falta nota do teste prático&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
* Época Normal: &amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt; (ver prazo da entrega em curso ou data do teste prático)&lt;br /&gt;
* Época Especial: &amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt; (teste prático a realizar em Julho de 2026 -- ver Fénix)&lt;br /&gt;
&lt;br /&gt;
== Legenda da Pauta Global do Projecto ==&lt;br /&gt;
&lt;br /&gt;
Períodos de avaliação:&lt;br /&gt;
* EN - época normal&lt;br /&gt;
* EE - época especial&lt;br /&gt;
&lt;br /&gt;
Componentes de avaliação:&lt;br /&gt;
* PRJ - nota final do projecto&lt;br /&gt;
* PRJ EN - nota final do projecto (época normal)&lt;br /&gt;
* PRJ EE - nota final do projecto (época especial)&lt;br /&gt;
* E0 - nota da entrega do diagrama UML&lt;br /&gt;
* EI- nota da entrega intermédia&lt;br /&gt;
* EF- nota da entrega final&lt;br /&gt;
* TP - nota do teste prático (EN ou EE)&lt;br /&gt;
&lt;br /&gt;
A nota do teste prático condiciona a distância ao mínimo entre as notas do teste prático e a do projecto: desde um mínimo de 12.5% de acréscimo à menor das duas (abaixo de 7.5 valores no TP), até um máximo de 25% (para 20 valores no TP). O acréscimo é linear entre 7.5 e 20.&lt;br /&gt;
&lt;br /&gt;
Ou seja:&lt;br /&gt;
&lt;br /&gt;
* PRJ EN = E0 + EI + EF&lt;br /&gt;
* PRJ = min(PRJ EN, TP) + | TP - PRJ EN | * max(12.5, TP+5) / 100&lt;br /&gt;
&lt;br /&gt;
(para EE, PRJ EE é apenas uma entrega e TP é TP EE)&lt;br /&gt;
&lt;br /&gt;
Condições necessárias para aprovação à disciplina (necessárias todas):&lt;br /&gt;
&lt;br /&gt;
* PRJ &amp;gt;= 9.5 (sem arredondamento)&lt;br /&gt;
* PRJ != NA &lt;br /&gt;
* TP &amp;gt; 0&lt;br /&gt;
* TP != NA&lt;br /&gt;
&lt;br /&gt;
Linhas sombreadas correspondem a alunos excluídos da avaliação em Época Normal, por não terem realizado componentes obrigatórias do projecto.  Alunos que tenham realizado todas as componentes podem estar em linhas sombreadas se não for possível a aprovação (critérios mínimos).&lt;br /&gt;
&lt;br /&gt;
Se o projecto não obtiver aprovação em Época Normal, então tem de ser realizado um teste prático sobre projecto a fornecer em Época Especial.&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Final&amp;diff=17855</id>
		<title>Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Final&amp;diff=17855"/>
		<updated>2026-06-11T08:15:00Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pauta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO: falta nota do teste prático&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ver anúncio na página da disciplina (Fénix).&lt;br /&gt;
&lt;br /&gt;
== Critérios de Avaliação ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;A entrega final é obrigatória.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
São considerados os das entregas anteriores (adaptados).&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
&lt;br /&gt;
A entrega final vale 12 valores em 20 (7 qualidade; 5 automáticos).&lt;br /&gt;
&lt;br /&gt;
* Qualidade (7 valores): análise lexical (0.75) + análise sintáctica (0.75) + nós (AST) (0.75) + análise semântica e geração de código (0.75) + avaliação global (0.50) + repositório e compilação (0.50). Os pesos são relativos ao total 4 (i.e., o valor final multiplica por 7/4).&lt;br /&gt;
* Testes automáticos (5 valores).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Os alunos são encorajados a compreender/verificar os problemas reportados. Todos os alunos podem proceder a correcções pequenas (contactar responsável) para resolver algum problema. Haverá penalizações por efectuar correcções a código entregue.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Os alunos são encorajados a compreender/verificar os problemas reportados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quaisquer dúvidas ou sugestões, relativas a esta informação, devem ser enviadas ao responsável pela disciplina ou esclarecidas nos horários de dúvidas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recorda-se que a classificação global do projecto não se limita à soma das classificações das várias entregas: a classificação final é ainda influenciada pela classificação do teste prático. Este teste é obrigatório e eliminatório (i.e., a classificação deve ser maior que zero).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Descrição dos problemas assinalados na pauta&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&#039;&#039;&#039;Problemas na análise lexical&#039;&#039;&#039;&lt;br /&gt;
* .* - uso indevido do padrão&lt;br /&gt;
* chars - definição indevida (não existem na linguagem)&lt;br /&gt;
* comments - problemas com comentários (em excesso ou em falta)&lt;br /&gt;
* real - problemas com reais (definições incompletas ou excessivas)&lt;br /&gt;
* ints - problemas com inteiros (definições incompletas ou excessivas)&lt;br /&gt;
* keywords - problemas com palavras chave (a mais ou a menos)&lt;br /&gt;
* strings - problemas na definição de strings (composição, concatenação indevida, etc.)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas na análise sintáctica&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* conflicts - conflitos no analisador LALR(1)&lt;br /&gt;
* exprs - problemas nas expressões (em falta ou com inclusão de casos errados)&lt;br /&gt;
* lvals - problemas na definição de left-values (e.g. ausência de definições ou incompletas)&lt;br /&gt;
* precs - problemas na definição de precedências (tipicamente, em excesso ou sem correspondência com o manual)&lt;br /&gt;
* strings - problemas na definção de cadeias de caracteres&lt;br /&gt;
* syntax - problemas na definição da gramática (relativamente ao manual de referência)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas nos nós&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas na análise semântica e na geração de código&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* symbol - problemas na definição dos símbolos (atributos em excesso ou em falta)&lt;br /&gt;
* stack - problemas na definição do stack das funções&lt;br /&gt;
* types - problemas na verificação de tipos&lt;br /&gt;
* postfix - problemas na geração de código&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outros problemas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* empty methods - métodos vazios nos visitors (não deviam ser vazios)&lt;br /&gt;
* types - problemas com o visitor de verificação de tipos&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_Global_da_Disciplina&amp;diff=17854</id>
		<title>Compiladores/Pautas 2025-2026/Pauta Global da Disciplina</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_Global_da_Disciplina&amp;diff=17854"/>
		<updated>2026-06-11T08:14:37Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pauta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA PROVISÓRIA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ver prazos de revisão nas páginas correspondentes às provas em curso.&lt;br /&gt;
&lt;br /&gt;
* Época Normal: &amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt; (ver prazos nas pautas de cada prova)&lt;br /&gt;
* Época Especial: &amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt; &amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt; (provas a realizar em Julho de 2026 -- ver Fénix)&lt;br /&gt;
&lt;br /&gt;
Note-se que a coluna FINAL apenas tem significado no final da avaliação.&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
&lt;br /&gt;
Não há arredondamentos (excepto na coluna &#039;&#039;&#039;FINAL&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Condições de aprovação: &#039;&#039;&#039;NOTA&#039;&#039;&#039;, &#039;&#039;&#039;EXR&#039;&#039;&#039;. &#039;&#039;&#039;PRJ&#039;&#039;&#039;, &#039;&#039;&#039;EE&#039;&#039;&#039; têm de ser iguais ou superiores a 9.5.&lt;br /&gt;
&lt;br /&gt;
Legenda:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;FINAL&#039;&#039;&#039; - resultado da avaliação (será lançado na secretaria)&lt;br /&gt;
* &#039;&#039;&#039;NOTA&#039;&#039;&#039; - resultado numérico da avaliação (quando aplicável) &lt;br /&gt;
* &#039;&#039;&#039;EXR&#039;&#039;&#039; - nota final dos exercícios de programação (deve ser superior a 9.5)&lt;br /&gt;
* &#039;&#039;&#039;PRJ&#039;&#039;&#039; - nota final do projecto (inclui nota do teste prático) (deve ser superior a 9.5)&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039; - época especial (exercícios) (deve ser superior a 9.5)&lt;br /&gt;
&lt;br /&gt;
As notações especiais têm o seguinte significado:&lt;br /&gt;
* &#039;&#039;&#039;NA&#039;&#039;&#039; - &amp;quot;não avaliado&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;RE&#039;&#039;&#039; - &amp;quot;reprovado&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Category:Compiladores_2025-2026&amp;diff=17853</id>
		<title>Category:Compiladores 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Category:Compiladores_2025-2026&amp;diff=17853"/>
		<updated>2026-06-11T08:13:35Z</updated>

		<summary type="html">&lt;p&gt;Root: Created blank page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17852</id>
		<title>Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17852"/>
		<updated>2026-06-11T08:13:19Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pauta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A avaliação nestas aulas é obrigatória e não é repetível fora da semana em que cada exercício é realizado.&amp;lt;br/&amp;gt;&lt;br /&gt;
Não se avaliam alunos fora do turno de inscrição.&lt;br /&gt;
&lt;br /&gt;
Alunos que compareçam atrasados a estas aulas não são avaliados.&amp;lt;br/&amp;gt;&lt;br /&gt;
É admitido um limite máximo de 20 minutos para entrada, após a hora definida para a aula (i.e., já contabilizando os 10 minutos do início).&lt;br /&gt;
&lt;br /&gt;
Não são considerados casos especiais na avaliação das aulas práticas. Alunos que considerem ter direito a tratamento especial e que não consigam comparecer com aproveitamento nestas aulas poderão requerer avaliação em época especial.&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazos de revisão ==&lt;br /&gt;
Ver anúncio correspondente no Fénix. &lt;br /&gt;
&lt;br /&gt;
As revisões decorrem exclusivamente via Classroom (ver Fénix).&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
Na pauta:&lt;br /&gt;
* &#039;&#039;Nota&#039;&#039; indica a nota final (são contabilizados os 9 melhores exercícios)&lt;br /&gt;
* &#039;&#039;Média&#039;&#039; indica a média dos exercícios apresentados (são contabilizados todos os exercícios)&lt;br /&gt;
&lt;br /&gt;
As classificações possíveis para cada exercício são:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.00&amp;lt;/font&amp;gt; - ignorância (quase) completa da matéria em avaliação ou não inscrito no turno&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt; - erros graves ou solução muito incompleta ou inadequada&lt;br /&gt;
* 0.50 - erros importantes ou solução incompleta&lt;br /&gt;
* 0.75 - erros pouco graves ou solução quase completa&lt;br /&gt;
* &amp;lt;font color=&amp;quot;forestgreen&amp;quot;&amp;gt;1.00&amp;lt;/font&amp;gt; - solução completa&lt;br /&gt;
&lt;br /&gt;
=== IMPORTANTE ===&lt;br /&gt;
&lt;br /&gt;
Obter classificações abaixo de 0.75 deve constituir motivo de preocupação, especialmente nos casos 0 e 0.25, sendo os alunos fortemente encorajados a contactar o responsável pela disciplina para compreensão dos problemas em causa.&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_%22zero%22&amp;diff=17851</id>
		<title>Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega &quot;zero&quot;</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_%22zero%22&amp;diff=17851"/>
		<updated>2026-06-11T08:13:02Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pauta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os resultados da entrega inicial podem ser revistos, nos horários de dúvidas, até à data da entrega intermédia.&lt;br /&gt;
&lt;br /&gt;
== Critérios de Avaliação ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;A entrega inicial é obrigatória.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LER COM ATENÇÃO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A avaliação é realizada sobre a versão existente no repositório no final do prazo para a entrega inicial. Projectos que não apresentem alterações relativamente ao conteúdo inicial do repositório não serão considerados.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Considerando que é um passo crucial na concepção do projecto, a não realização desta entrega conduz automaticamente a uma classificação de 0 (zero) na componente de avaliação relativa ao Projecto e consequente exclusão da avaliação da disciplina no ano lectivo actual.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ver também: [[Compiladores/Projecto de Compiladores/Avaliação do Projecto (Época Normal)]].&lt;br /&gt;
&lt;br /&gt;
Advertem-se os alunos sobre a consulta de colegas de anos anteriores. Estas consultas podem ser positivas, mas comportam algum risco, pois o processo e critérios de avaliação podem ter mudado. Além disso, a proficiência do colega pode majorar negativamente o resultado da avaliação em curso. Não são admitidas quaisquer justificações com base na história da disciplina.&lt;br /&gt;
&lt;br /&gt;
Estas condições são aplicáveis à data da entrega inicial.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Em caso de dúvidas suscitadas por qualquer elemento neste texto, no projecto, ou na disciplina em geral, os alunos são fortemente encorajados a consultar o corpo docente.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #BDDD8D;&amp;quot; | &amp;lt;font color=&amp;quot;forestgreen&amp;quot;&amp;gt;&#039;&#039;&#039;VALORAÇÕES&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Existem &#039;&#039;&#039;2 valores&#039;&#039;&#039; (dos 20 disponíveis para o projecto) associados a esta entrega:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gestão do projecto: 0.5 valores&#039;&#039;&#039;&lt;br /&gt;
** projecto com a estrutura correcta no repositório GIT: 0.25 valores (i.e., código que não apresente a estrutura canónica de um compilador desenvolvido com a CDK é considerado sem a estrutura correcta -- consultar estas páginas sobre o desenvolvimento do projecto com base no repositório GIT)&lt;br /&gt;
** projecto compila e produz compilador &amp;quot;p6&amp;quot; (&amp;quot;p6&amp;quot;, com letras minúsculas: variações correspondem a &amp;quot;não compilação&amp;quot;): 0.25 valores&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Se o projecto compilar&#039;&#039;&#039;, poderão ser atribuídos mais &#039;&#039;&#039;1.5 valores&#039;&#039;&#039; (desenvolvimento do compilador), distribuídos como se segue:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Classes dos nós do compilador (completo): 1.0 valores&#039;&#039;&#039;&lt;br /&gt;
** Reutilização dos nós da CDK (simples ajuste do Simple)&lt;br /&gt;
** Definição ou extensão de elementos existentes (simples ajuste do Simple)&lt;br /&gt;
** Definição de novas declarações/definições (variáveis/funções) (completo)&lt;br /&gt;
** Definição de novas instruções (completo)&lt;br /&gt;
** Definição de novas expressões (completo)&lt;br /&gt;
** Definição de outros elementos (completo)&lt;br /&gt;
** Sugere-se (por simplicidade de gestão do código) a separação das várias classes de nós em namespaces coerentes (à la Simple)&lt;br /&gt;
** Não é necessário criar as regras na especificação Bison para criar os nós (se for feito, é conveniente para o progresso do projecto, mas não é avaliado nesta entrega)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Métodos dos &amp;quot;visitors&amp;quot; (completo): 0.5 valores&#039;&#039;&#039;&lt;br /&gt;
** Reutilização de métodos já definidos (simples ajuste do Simple)&lt;br /&gt;
** Definição de todos os métodos do_X (correspondentes ao nó da class X) em todos os visitors (simples extensão do Simple)&lt;br /&gt;
** Métodos novos podem estar vazios, mas devem existir&lt;br /&gt;
** Métodos correspondentes a acções semelhantes às existentes devem ser modelados nos existentes (mesmo que não modificados numa primeira instância)&lt;br /&gt;
** A presença de implementações de semântica no postfix_writer (tabela de símbolos, validação de tipos, etc.) não é penalizada, mas não será avaliada nesta entrega&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa; background: #FFCC99;&amp;quot; | &amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;PENALIZAÇÕES&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Existem penalizações relativas à (deficiente) execução do projecto. &lt;br /&gt;
&lt;br /&gt;
São considerados os seguintes aspectos preliminares:&lt;br /&gt;
&lt;br /&gt;
# A linguagem do projecto contém a linguagem Simple, pelo que não há razão para não utilizar completamente o compilador Simple, eventualmente com pequenas alterações (incluindo a passagem de binário para ternário).&lt;br /&gt;
# A semântica da linguagem do projecto contém a da linguagem Simple, pelo que a implementação de alguns aspectos da linguagem do projecto não requer qualquer reimplementação relativamente ao Simple.&lt;br /&gt;
# O compilador Simple foi fornecido completamente funcional, assim como a versão inicial do compilador do projecto no respositório GIT (igual ao Simple e apenas alterado, para ter um nome apropriado).&lt;br /&gt;
# A criação de novos nós não apresenta quaisquer dificuldades (são classes muito simples).&lt;br /&gt;
# Os métodos (na sua maioria, vazios) dos &amp;quot;visitors&amp;quot; são simples paralelos com as classes dos nós e os que não estão vazios são quase 100% reutilizáveis na nova linguagem.&lt;br /&gt;
# O compilador é obrigatoriamente desenvolvido em C++, fazendo-se uso do material de apoio.&lt;br /&gt;
&lt;br /&gt;
Considerando os aspectos 1. a 6., são aplicadas as seguintes penalizações:&lt;br /&gt;
&lt;br /&gt;
* Destruição de funcionalidade do compilador Simple sem substituição por funcionalidade equivalente do compilador do projecto: &#039;&#039;&#039;2 valores&#039;&#039;&#039;&lt;br /&gt;
* Utilização de funções e estruturas C, quando existem alternativas directas C++ (malloc em lugar de new, por exemplo; strcmp, etc. em lugar da classe std::string; e outras): &#039;&#039;&#039;penalização máxima de 1 valor&#039;&#039;&#039;&lt;br /&gt;
* Não utilização de qualquer material obrigatório ou não satisfação dos critérios mínimos: &#039;&#039;&#039;2 valores e considera-se entrega não realizada (implica exclusão da avaliação)&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA PROVISÓRIA -- EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Os alunos são encorajados a compreender/verificar/corrigir os problemas reportados, especialmente nos casos em que exista anotação explícita na pauta.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa; background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Anotações da tabela&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
* dups: cópia de código que já está disponível na CDK (não devem existir estas cópias: devem ser usadas as classes da CDK)&lt;br /&gt;
* pointer: este nó não deve existir&lt;br /&gt;
* loop/while: problemas vários com o nó de iteração&lt;br /&gt;
* lvals: más utilizações de left-values (um left-value é a designação de um endereço de escrita)&lt;br /&gt;
* index: problemas com os nós de indexação (e.g. não são lvalues, faltam expressões)&lt;br /&gt;
* decls: faltam nós correspondentes a declarações ou têm problemas (e.g. confundidas com expressões, problemas com tipos, etc.)&lt;br /&gt;
* func decls: problemas com declarações de funções&lt;br /&gt;
* function/func defs: faltam nós correspondentes a definições de funções ou têm problemas: e.g. faltam tipos, têm relações com lvalues (não devem existir)&lt;br /&gt;
* vars: faltam nós correspondentes a declarações/definições de variáveis ou têm problemas: e.g. faltam tipos, têm relações com lvalues (não devem existir)&lt;br /&gt;
* exprs: faltam expressões (tipicamente, faltam operadores, chamadas a funções)&lt;br /&gt;
* file/public/use/qualifier: nós que não devem existir&lt;br /&gt;
* print/write: problemas com o nó de escrita&lt;br /&gt;
* read/input: o nó de leitura deve ser uma expressão e não uma instrução; ao contário do que acontece no Simple, não tem um left-value associado&lt;br /&gt;
* call: este nó tem de ser uma expressão que tem como atributos um nome de função e uma sequência de argumentos&lt;br /&gt;
* alloc/objects: este nó tem de ser uma expressão&lt;br /&gt;
* address: este nó é uma expressão aplicável a um left-value&lt;br /&gt;
* types: não foram os usados os tipos da CDK (basic_type e subclasses) para representar os tipos de dados da linguagem&lt;br /&gt;
* [outras anotações específicas]: contactar o professor responsável&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Interm%C3%A9dia&amp;diff=17850</id>
		<title>Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Interm%C3%A9dia&amp;diff=17850"/>
		<updated>2026-06-11T08:12:47Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pauta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Ver Fénix.&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A entrega intermédia pode ser revista até à data da entrega final do projecto.&lt;br /&gt;
&lt;br /&gt;
== Critérios de Avaliação ==&lt;br /&gt;
&#039;&#039;&#039;LER COM ATENÇÃO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;A entrega intermédia é obrigatória.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A entrega intermédia vale 6 valores em 20.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A avaliação é realizada sobre a versão existente no repositório no final do prazo para a entrega intermédia. Projectos que não apresentem alterações relevantes relativamente ao conteúdo inicial do repositório ou relativamente à entrega inicial não serão considerados.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A avaliação da entrega intermédia considera a execução de intervenções em várias regiões do código do compilador em desenvolvimento, assim como a gestão do projecto correspondente.&lt;br /&gt;
&lt;br /&gt;
Advertem-se os alunos sobre a consulta de colegas de anos anteriores. Estas consultas podem ser positivas, mas comportam algum risco, pois o processo e critérios de avaliação podem ter mudado. Além disso, a proficiência do colega pode majorar negativamente o resultado da avaliação em curso. Não são admitidas quaisquer justificações com base na história da disciplina. De forma semelhante, a reciclagem de código de compiladores exemplo deve ser feita criteriosamente, por forma a evitar inclusão de código errado ou inútil.&lt;br /&gt;
&lt;br /&gt;
Estas condições são aplicáveis à data da entrega intermédia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Em caso de dúvidas suscitadas por qualquer elemento neste texto, no projecto, ou na disciplina em geral, os alunos são fortemente encorajados a consultar o corpo docente.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #BDDD8D;&amp;quot; | &amp;lt;font color=&amp;quot;forestgreen&amp;quot;&amp;gt;&#039;&#039;&#039;VALORAÇÕES&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Existem &#039;&#039;&#039;6 valores&#039;&#039;&#039; (dos 20 disponíveis para o projecto) associados a esta entrega:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gestão do projecto: 1 valor&#039;&#039;&#039;&lt;br /&gt;
** projecto com a estrutura correcta no repositório: &#039;&#039;&#039;0.5 valores&#039;&#039;&#039; (i.e., código que não apresente a estrutura canónica de um compilador desenvolvido com a CDK é considerado sem a estrutura correcta -- consultar estas páginas sobre o desenvolvimento do projecto com base no repositório)&lt;br /&gt;
** projecto compila e produz compilador &amp;quot;p6&amp;quot; (&amp;quot;p6&amp;quot;, com letras minúsculas: variações correspondem a &amp;quot;não compilação&amp;quot;): &#039;&#039;&#039;0.5 valores&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Se o projecto compilar&#039;&#039;&#039;, poderão ser atribuídos mais 5 valores (desenvolvimento do compilador), distribuídos como se segue:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Flex (completo): 1.5 valores&#039;&#039;&#039;&lt;br /&gt;
** Tokens correspondentes aos símbolos e palavras-chave (simples ajuste do Simple/Tritak)&lt;br /&gt;
** Identificadores (simples ajuste do Simple/Tritak)&lt;br /&gt;
** Inteiros (a base 10 já está implementada no Simple/Tritak)&lt;br /&gt;
** Reais (extensão dos inteiros)&lt;br /&gt;
** Strings (extensão do Simple/Tritak)&lt;br /&gt;
** O Flex deve retornar os tokens ao byacc (sobre DEBUG, ver abaixo) -- o não retorno de tokens penaliza fortemente toda a componente Flex (ver penalizações)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bison (completo): 1 valor&#039;&#039;&#039;&lt;br /&gt;
** Regras correspondentes a literais de reais e strings (simples extensão do Simple/Tritak)&lt;br /&gt;
** Regras correspondentes a ciclos, etc. (simples extensão e adaptação do Simple/Tritak)&lt;br /&gt;
** Regras correspondentes a declarações de variáveis&lt;br /&gt;
** Regras correspondentes a declarações/definições de funções&lt;br /&gt;
** As acções correspondentes às regras definidas no Bison devem estar implementadas (simples criação de nós) -- a não implementação corresponde a penalizações (var abaixo)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Nós (nodes) (completo): 1 valor&#039;&#039;&#039;&lt;br /&gt;
** Todos os nós necessários para a linguagem (utilizados na especificação Bison e em passos subsequentes) devem ser criados&lt;br /&gt;
** A não criação de nós motivada pela ausência de definição de acções no Bison é penalizada (ver abaixo)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Semântica (visitors) (&#039;&#039;&#039;xml_writer&#039;&#039;&#039; completo; &#039;&#039;&#039;postfix_writer&#039;&#039;&#039; ver a seguir): 1.5 valores&#039;&#039;&#039;&lt;br /&gt;
** O &amp;quot;visitor&amp;quot; &#039;&#039;&#039;xml_writer&#039;&#039;&#039; deve estar completamente implementado (ver também DEBUG abaixo)&lt;br /&gt;
** O &amp;quot;visitor&amp;quot; &#039;&#039;&#039;type_checker&#039;&#039;&#039; deve ter todos os métodos (correspondentes aos nós, tal como o &#039;&#039;&#039;xml_writer&#039;&#039;&#039;), embora alguns possam estar ainda vazios (i.e., podem não executar qualquer acção)&lt;br /&gt;
** O &amp;quot;visitor&amp;quot; &#039;&#039;&#039;postfix_writer&#039;&#039;&#039; deve ter todos os métodos (correspondentes aos nós, tal como o &#039;&#039;&#039;xml_writer&#039;&#039;&#039;), embora alguns possam estar ainda vazios (i.e., podem não executar qualquer acção)&lt;br /&gt;
** Métodos correspondentes a acções semelhantes às existentes devem ser modelados nos existentes (mesmo que não modificados numa primeira instância)&lt;br /&gt;
** A presença de implementações de semântica no &#039;&#039;&#039;postfix_writer&#039;&#039;&#039; (tabela de símbolos, validação de tipos, etc.) não é penalizada, mas não será avaliada nesta entrega&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #FFCC99;&amp;quot; | &amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;PENALIZAÇÕES&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Existem penalizações relativas à (deficiente) execução do projecto. &lt;br /&gt;
&lt;br /&gt;
São considerados os seguintes aspectos preliminares:&lt;br /&gt;
&lt;br /&gt;
# A linguagem do projecto contém a linguagem Simple, pelo que não há razão para não utilizar completamente o compilador Simple, eventualmente com pequenas alterações (including a passagem de binário para ternário).&lt;br /&gt;
# A semântica da linguagem do projecto contém a da linguagem Simple, pelo que a implementação de alguns aspectos da linguagem do projecto não requer qualquer reimplementação relativamente ao Simple.&lt;br /&gt;
# O compilador Simple foi fornecido completamente funcional, assim como a versão inicial do compilador do projecto no respositório (igual ao Simple e apenas alterado para ter o nome apropriado).&lt;br /&gt;
# A criação de novos nós não apresenta quaisquer dificuldades (são classes muito simples)&lt;br /&gt;
# O código dos métodos do visitor &#039;&#039;&#039;xml_writer&#039;&#039;&#039; corresponde a uma simples impressão dos atributos dos nós, através de uma travessia da árvore que formam e que os contém.&lt;br /&gt;
# O compilador é obrigatoriamente desenvolvido em C++.&lt;br /&gt;
&lt;br /&gt;
Considerando os aspectos 1. a 6., são aplicadas as seguintes penalizações:&lt;br /&gt;
&lt;br /&gt;
* Destruição de funcionalidade do compilador Simple sem substituição por funcionalidade equivalente do compilador do projecto: &#039;&#039;&#039;4 valores&#039;&#039;&#039;&lt;br /&gt;
Não definição dos nós para regras Bison em avaliação (ver acima) ou não utilização de nós definidos para a escrita dessas acções: &#039;&#039;&#039;2 valores&#039;&#039;&#039;&lt;br /&gt;
* A utilização de funções e estruturas C, quando existem alternativas directas C++ (malloc em lugar de new, por exemplo; strcmp, etc. em lugar da classe std::string; e outras) terá uma &#039;&#039;&#039;penalização máxima de 1 valor&#039;&#039;&#039;&lt;br /&gt;
* Não utilização de qualquer material obrigatório: &#039;&#039;&#039;6 valores (e considera-se projecto não realizado)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DEBUG ===&lt;br /&gt;
&lt;br /&gt;
O despiste de problemas em especificações Flex pode ser realizado de forma simples utilizando os métodos descritos em [[The Flex Lexical Analyzer#How to Debug a Flex Specification|How to Debug a Flex Specification]].&lt;br /&gt;
&lt;br /&gt;
O visitor &#039;&#039;&#039;xml_writer&#039;&#039;&#039; foi concebido para produzir uma representação textual hierárquica (árvore XML) correspondente ao programa em compilação. &lt;br /&gt;
É muito útil para inspeccionar a construção da árvore de nós por parte do Bison, permitindo, inclusivamente, a apresentação gráfica.&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
As questões relativas às colunas &amp;quot;Problemas&amp;quot; devem ser resolvidas quanto antes (nos horários de dúvidas ou, sendo possível, por correio electrónico).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Problemas na análise lexical&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
* .* - uso indevido do padrão&lt;br /&gt;
* chars - definição indevida (não existem na linguagem)&lt;br /&gt;
* comments - problemas com comentários (em excesso ou em falta)&lt;br /&gt;
* doubles - problemas com vírgula flutuante (definições incompletas)&lt;br /&gt;
&amp;lt;!--* indents - problems com indentação--&amp;gt;&lt;br /&gt;
* ids - problems com identificadores &lt;br /&gt;
* int - problemas com inteiros (definições incompletas ou excessivas)&lt;br /&gt;
* keywords - problemas com palavras-chave (a mais ou a menos)&lt;br /&gt;
&amp;lt;!--* ops - problemas com operadores e afins--&amp;gt;&lt;br /&gt;
* (bad) patterns - problemas genéricos com escrita de padrões lexicais&lt;br /&gt;
* string - problemas na definição de strings (composição, concatenação indevida, etc.)&lt;br /&gt;
* [outros] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Problemas na análise sintáctica&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
* conflicts - conflitos no analisador LALR(1) (não avaliado nesta entrega)&lt;br /&gt;
* decls - problemas nas declarações (e.g. mistura com expressões ou com instruções)&lt;br /&gt;
* empty rules - regras sem semântica associada &lt;br /&gt;
* exprs - problemas nas expressões (em falta ou com inclusão de casos errados)&lt;br /&gt;
* calls - problemas nas chamadas a funções (e.g. não estão definidos como expressões)&lt;br /&gt;
* funcs - problemas (vários) nas &amp;lt;!--declarações/--&amp;gt;definições de funções&lt;br /&gt;
* lvals - problemas na definição de left-values (e.g. ausência de definições ou incompletas)&lt;br /&gt;
* precs - problemas na definição de precedências (tipicamente, em excesso, deficientes, ou sem correspondência com o manual)&lt;br /&gt;
* precs* - problemas graves na definição de precedências (tipicamente, em excesso, deficientes, ou sem correspondência com o manual)&lt;br /&gt;
* tokens - problemas na definição de tokens (tipicamente, em excesso ou sem correspondência com o manual)&lt;br /&gt;
* read - problemas na definição da expressão de leitura (verificar manual de referência)&lt;br /&gt;
* semantics - problemas na definição de acções semânticas&lt;br /&gt;
* (simple) - contém apenas a definição original (linguagem Simple)&lt;br /&gt;
* strings - problemas na definção de cadeias de caracteres&lt;br /&gt;
* syntax - problemas na definição da gramática ou na semântica (nó) correspondente (verificar manual de referência)&lt;br /&gt;
* start - problemas na definição da raiz da árvore sintáctica (compiler-&amp;gt;ast(...))&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Problemas na análise semântica e na geração de código (nós e XML)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Nos nós:&lt;br /&gt;
&amp;lt;!--* lvals - problemas na definição ou uso de left-values&lt;br /&gt;
* decls - problemas na definição de declarações/definições de funções/variáveis&lt;br /&gt;
* read_node - uso de left-value no read_node (não é uma atribuição, pelo que não tem left-values); ou derivação de basic_node (mas deve ser uma expressão); ou derivação de unary_expression (mas não tem argumentos); ou remoção do nó--&amp;gt;&lt;br /&gt;
* [outros nós] - nós com problemas (nós excedentários ou em falta ou com problemas na definição)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
No visitor &#039;&#039;&#039;xml_writer&#039;&#039;&#039;:&lt;br /&gt;
* ast - o método &amp;quot;ast&amp;quot; do compilador não foi chamado no parser (.y), pelo que a AST está indefinida&lt;br /&gt;
* empty - métodos vazios ou funcionalmente vazios&lt;br /&gt;
* (incomp) - código incompleto&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Interm%C3%A9dia&amp;diff=17849</id>
		<title>Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Interm%C3%A9dia&amp;diff=17849"/>
		<updated>2026-06-11T08:12:35Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Aqui: https://bit.ly/co26-pautas (ver Fénix)&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A entrega intermédia pode ser revista até à data da entrega final do projecto.&lt;br /&gt;
&lt;br /&gt;
== Critérios de Avaliação ==&lt;br /&gt;
&#039;&#039;&#039;LER COM ATENÇÃO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;A entrega intermédia é obrigatória.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A entrega intermédia vale 6 valores em 20.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A avaliação é realizada sobre a versão existente no repositório no final do prazo para a entrega intermédia. Projectos que não apresentem alterações relevantes relativamente ao conteúdo inicial do repositório ou relativamente à entrega inicial não serão considerados.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A avaliação da entrega intermédia considera a execução de intervenções em várias regiões do código do compilador em desenvolvimento, assim como a gestão do projecto correspondente.&lt;br /&gt;
&lt;br /&gt;
Advertem-se os alunos sobre a consulta de colegas de anos anteriores. Estas consultas podem ser positivas, mas comportam algum risco, pois o processo e critérios de avaliação podem ter mudado. Além disso, a proficiência do colega pode majorar negativamente o resultado da avaliação em curso. Não são admitidas quaisquer justificações com base na história da disciplina. De forma semelhante, a reciclagem de código de compiladores exemplo deve ser feita criteriosamente, por forma a evitar inclusão de código errado ou inútil.&lt;br /&gt;
&lt;br /&gt;
Estas condições são aplicáveis à data da entrega intermédia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Em caso de dúvidas suscitadas por qualquer elemento neste texto, no projecto, ou na disciplina em geral, os alunos são fortemente encorajados a consultar o corpo docente.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #BDDD8D;&amp;quot; | &amp;lt;font color=&amp;quot;forestgreen&amp;quot;&amp;gt;&#039;&#039;&#039;VALORAÇÕES&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Existem &#039;&#039;&#039;6 valores&#039;&#039;&#039; (dos 20 disponíveis para o projecto) associados a esta entrega:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gestão do projecto: 1 valor&#039;&#039;&#039;&lt;br /&gt;
** projecto com a estrutura correcta no repositório: &#039;&#039;&#039;0.5 valores&#039;&#039;&#039; (i.e., código que não apresente a estrutura canónica de um compilador desenvolvido com a CDK é considerado sem a estrutura correcta -- consultar estas páginas sobre o desenvolvimento do projecto com base no repositório)&lt;br /&gt;
** projecto compila e produz compilador &amp;quot;p6&amp;quot; (&amp;quot;p6&amp;quot;, com letras minúsculas: variações correspondem a &amp;quot;não compilação&amp;quot;): &#039;&#039;&#039;0.5 valores&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Se o projecto compilar&#039;&#039;&#039;, poderão ser atribuídos mais 5 valores (desenvolvimento do compilador), distribuídos como se segue:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Flex (completo): 1.5 valores&#039;&#039;&#039;&lt;br /&gt;
** Tokens correspondentes aos símbolos e palavras-chave (simples ajuste do Simple/Tritak)&lt;br /&gt;
** Identificadores (simples ajuste do Simple/Tritak)&lt;br /&gt;
** Inteiros (a base 10 já está implementada no Simple/Tritak)&lt;br /&gt;
** Reais (extensão dos inteiros)&lt;br /&gt;
** Strings (extensão do Simple/Tritak)&lt;br /&gt;
** O Flex deve retornar os tokens ao byacc (sobre DEBUG, ver abaixo) -- o não retorno de tokens penaliza fortemente toda a componente Flex (ver penalizações)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bison (completo): 1 valor&#039;&#039;&#039;&lt;br /&gt;
** Regras correspondentes a literais de reais e strings (simples extensão do Simple/Tritak)&lt;br /&gt;
** Regras correspondentes a ciclos, etc. (simples extensão e adaptação do Simple/Tritak)&lt;br /&gt;
** Regras correspondentes a declarações de variáveis&lt;br /&gt;
** Regras correspondentes a declarações/definições de funções&lt;br /&gt;
** As acções correspondentes às regras definidas no Bison devem estar implementadas (simples criação de nós) -- a não implementação corresponde a penalizações (var abaixo)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Nós (nodes) (completo): 1 valor&#039;&#039;&#039;&lt;br /&gt;
** Todos os nós necessários para a linguagem (utilizados na especificação Bison e em passos subsequentes) devem ser criados&lt;br /&gt;
** A não criação de nós motivada pela ausência de definição de acções no Bison é penalizada (ver abaixo)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Semântica (visitors) (&#039;&#039;&#039;xml_writer&#039;&#039;&#039; completo; &#039;&#039;&#039;postfix_writer&#039;&#039;&#039; ver a seguir): 1.5 valores&#039;&#039;&#039;&lt;br /&gt;
** O &amp;quot;visitor&amp;quot; &#039;&#039;&#039;xml_writer&#039;&#039;&#039; deve estar completamente implementado (ver também DEBUG abaixo)&lt;br /&gt;
** O &amp;quot;visitor&amp;quot; &#039;&#039;&#039;type_checker&#039;&#039;&#039; deve ter todos os métodos (correspondentes aos nós, tal como o &#039;&#039;&#039;xml_writer&#039;&#039;&#039;), embora alguns possam estar ainda vazios (i.e., podem não executar qualquer acção)&lt;br /&gt;
** O &amp;quot;visitor&amp;quot; &#039;&#039;&#039;postfix_writer&#039;&#039;&#039; deve ter todos os métodos (correspondentes aos nós, tal como o &#039;&#039;&#039;xml_writer&#039;&#039;&#039;), embora alguns possam estar ainda vazios (i.e., podem não executar qualquer acção)&lt;br /&gt;
** Métodos correspondentes a acções semelhantes às existentes devem ser modelados nos existentes (mesmo que não modificados numa primeira instância)&lt;br /&gt;
** A presença de implementações de semântica no &#039;&#039;&#039;postfix_writer&#039;&#039;&#039; (tabela de símbolos, validação de tipos, etc.) não é penalizada, mas não será avaliada nesta entrega&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #FFCC99;&amp;quot; | &amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;PENALIZAÇÕES&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Existem penalizações relativas à (deficiente) execução do projecto. &lt;br /&gt;
&lt;br /&gt;
São considerados os seguintes aspectos preliminares:&lt;br /&gt;
&lt;br /&gt;
# A linguagem do projecto contém a linguagem Simple, pelo que não há razão para não utilizar completamente o compilador Simple, eventualmente com pequenas alterações (including a passagem de binário para ternário).&lt;br /&gt;
# A semântica da linguagem do projecto contém a da linguagem Simple, pelo que a implementação de alguns aspectos da linguagem do projecto não requer qualquer reimplementação relativamente ao Simple.&lt;br /&gt;
# O compilador Simple foi fornecido completamente funcional, assim como a versão inicial do compilador do projecto no respositório (igual ao Simple e apenas alterado para ter o nome apropriado).&lt;br /&gt;
# A criação de novos nós não apresenta quaisquer dificuldades (são classes muito simples)&lt;br /&gt;
# O código dos métodos do visitor &#039;&#039;&#039;xml_writer&#039;&#039;&#039; corresponde a uma simples impressão dos atributos dos nós, através de uma travessia da árvore que formam e que os contém.&lt;br /&gt;
# O compilador é obrigatoriamente desenvolvido em C++.&lt;br /&gt;
&lt;br /&gt;
Considerando os aspectos 1. a 6., são aplicadas as seguintes penalizações:&lt;br /&gt;
&lt;br /&gt;
* Destruição de funcionalidade do compilador Simple sem substituição por funcionalidade equivalente do compilador do projecto: &#039;&#039;&#039;4 valores&#039;&#039;&#039;&lt;br /&gt;
Não definição dos nós para regras Bison em avaliação (ver acima) ou não utilização de nós definidos para a escrita dessas acções: &#039;&#039;&#039;2 valores&#039;&#039;&#039;&lt;br /&gt;
* A utilização de funções e estruturas C, quando existem alternativas directas C++ (malloc em lugar de new, por exemplo; strcmp, etc. em lugar da classe std::string; e outras) terá uma &#039;&#039;&#039;penalização máxima de 1 valor&#039;&#039;&#039;&lt;br /&gt;
* Não utilização de qualquer material obrigatório: &#039;&#039;&#039;6 valores (e considera-se projecto não realizado)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DEBUG ===&lt;br /&gt;
&lt;br /&gt;
O despiste de problemas em especificações Flex pode ser realizado de forma simples utilizando os métodos descritos em [[The Flex Lexical Analyzer#How to Debug a Flex Specification|How to Debug a Flex Specification]].&lt;br /&gt;
&lt;br /&gt;
O visitor &#039;&#039;&#039;xml_writer&#039;&#039;&#039; foi concebido para produzir uma representação textual hierárquica (árvore XML) correspondente ao programa em compilação. &lt;br /&gt;
É muito útil para inspeccionar a construção da árvore de nós por parte do Bison, permitindo, inclusivamente, a apresentação gráfica.&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
As questões relativas às colunas &amp;quot;Problemas&amp;quot; devem ser resolvidas quanto antes (nos horários de dúvidas ou, sendo possível, por correio electrónico).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Problemas na análise lexical&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
* .* - uso indevido do padrão&lt;br /&gt;
* chars - definição indevida (não existem na linguagem)&lt;br /&gt;
* comments - problemas com comentários (em excesso ou em falta)&lt;br /&gt;
* doubles - problemas com vírgula flutuante (definições incompletas)&lt;br /&gt;
&amp;lt;!--* indents - problems com indentação--&amp;gt;&lt;br /&gt;
* ids - problems com identificadores &lt;br /&gt;
* int - problemas com inteiros (definições incompletas ou excessivas)&lt;br /&gt;
* keywords - problemas com palavras-chave (a mais ou a menos)&lt;br /&gt;
&amp;lt;!--* ops - problemas com operadores e afins--&amp;gt;&lt;br /&gt;
* (bad) patterns - problemas genéricos com escrita de padrões lexicais&lt;br /&gt;
* string - problemas na definição de strings (composição, concatenação indevida, etc.)&lt;br /&gt;
* [outros] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Problemas na análise sintáctica&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
* conflicts - conflitos no analisador LALR(1) (não avaliado nesta entrega)&lt;br /&gt;
* decls - problemas nas declarações (e.g. mistura com expressões ou com instruções)&lt;br /&gt;
* empty rules - regras sem semântica associada &lt;br /&gt;
* exprs - problemas nas expressões (em falta ou com inclusão de casos errados)&lt;br /&gt;
* calls - problemas nas chamadas a funções (e.g. não estão definidos como expressões)&lt;br /&gt;
* funcs - problemas (vários) nas &amp;lt;!--declarações/--&amp;gt;definições de funções&lt;br /&gt;
* lvals - problemas na definição de left-values (e.g. ausência de definições ou incompletas)&lt;br /&gt;
* precs - problemas na definição de precedências (tipicamente, em excesso, deficientes, ou sem correspondência com o manual)&lt;br /&gt;
* precs* - problemas graves na definição de precedências (tipicamente, em excesso, deficientes, ou sem correspondência com o manual)&lt;br /&gt;
* tokens - problemas na definição de tokens (tipicamente, em excesso ou sem correspondência com o manual)&lt;br /&gt;
* read - problemas na definição da expressão de leitura (verificar manual de referência)&lt;br /&gt;
* semantics - problemas na definição de acções semânticas&lt;br /&gt;
* (simple) - contém apenas a definição original (linguagem Simple)&lt;br /&gt;
* strings - problemas na definção de cadeias de caracteres&lt;br /&gt;
* syntax - problemas na definição da gramática ou na semântica (nó) correspondente (verificar manual de referência)&lt;br /&gt;
* start - problemas na definição da raiz da árvore sintáctica (compiler-&amp;gt;ast(...))&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Problemas na análise semântica e na geração de código (nós e XML)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Nos nós:&lt;br /&gt;
&amp;lt;!--* lvals - problemas na definição ou uso de left-values&lt;br /&gt;
* decls - problemas na definição de declarações/definições de funções/variáveis&lt;br /&gt;
* read_node - uso de left-value no read_node (não é uma atribuição, pelo que não tem left-values); ou derivação de basic_node (mas deve ser uma expressão); ou derivação de unary_expression (mas não tem argumentos); ou remoção do nó--&amp;gt;&lt;br /&gt;
* [outros nós] - nós com problemas (nós excedentários ou em falta ou com problemas na definição)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
No visitor &#039;&#039;&#039;xml_writer&#039;&#039;&#039;:&lt;br /&gt;
* ast - o método &amp;quot;ast&amp;quot; do compilador não foi chamado no parser (.y), pelo que a AST está indefinida&lt;br /&gt;
* empty - métodos vazios ou funcionalmente vazios&lt;br /&gt;
* (incomp) - código incompleto&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17848</id>
		<title>Compiladores/Pautas 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17848"/>
		<updated>2026-06-11T08:12:21Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pautas do Projecto (época normal) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
Além dos resultados de avaliação, as páginas das pautas contêm também os critérios de avaliação e aprovação.&lt;br /&gt;
* {{PautaAberta}} indica avaliação em curso&lt;br /&gt;
* {{PautaFechada}} indica avaliação terminada (classificações definitivas)&lt;br /&gt;
* {{ProvaPorRealizar}} indica avaliação prevista&lt;br /&gt;
&lt;br /&gt;
== Pautas da Disciplina ==&lt;br /&gt;
&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global da Disciplina|Pauta Global da Disciplina]] -- próxima avaliação: (ver Fénix)&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas|Pauta das Aulas Práticas]] (época nornal)&lt;br /&gt;
&lt;br /&gt;
== Pautas do Projecto (época normal) ==&lt;br /&gt;
&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;|Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;]]&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia|Pauta do Projecto: Entrega Intermédia]]&lt;br /&gt;
* {{PautaAberta}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final|Pauta do Projecto: Entrega Final]]&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global do Projecto|Pauta Global do Projecto]]&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17847</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17847"/>
		<updated>2026-06-08T10:50:59Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Condições */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia. Alunos que não tenham activado estes serviços estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
(prova concluída)&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	&amp;lt;s&amp;gt;110421&amp;lt;/s&amp;gt; 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	&amp;lt;s&amp;gt;111198&amp;lt;/s&amp;gt;	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17846</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17846"/>
		<updated>2026-06-08T10:47:42Z</updated>

		<summary type="html">&lt;p&gt;Root: /* 2ª feira, 2026/06/08, 11:00 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
(prova concluída)&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	&amp;lt;s&amp;gt;110421&amp;lt;/s&amp;gt; 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	&amp;lt;s&amp;gt;111198&amp;lt;/s&amp;gt;	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17845</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17845"/>
		<updated>2026-06-08T10:17:43Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Realizados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
(prova concluída)&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17844</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17844"/>
		<updated>2026-06-08T10:17:25Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Calendário */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
(prova concluída)&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17843</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17843"/>
		<updated>2026-06-08T09:44:04Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Realizados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17842</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17842"/>
		<updated>2026-06-08T09:43:48Z</updated>

		<summary type="html">&lt;p&gt;Root: /* 2ª feira, 2026/06/08, 10:00 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17841</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17841"/>
		<updated>2026-06-08T08:26:46Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Realizados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17840</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17840"/>
		<updated>2026-06-08T08:26:35Z</updated>

		<summary type="html">&lt;p&gt;Root: /* 2ª feira, 2026/06/08, 09:00 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17839</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17839"/>
		<updated>2026-06-05T23:41:06Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Realizados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17838</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17838"/>
		<updated>2026-06-05T23:40:57Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Calendário */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
(a realizar)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17837</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17837"/>
		<updated>2026-06-05T23:27:14Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Calendário */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	&amp;lt;s&amp;gt;52327&amp;lt;/s&amp;gt; 109797	106647	110274	&amp;lt;s&amp;gt;110600&amp;lt;/s&amp;gt;	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
(a realizar)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17836</id>
		<title>Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17836"/>
		<updated>2026-06-05T11:35:29Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Legenda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A avaliação nestas aulas é obrigatória e não é repetível fora da semana em que cada exercício é realizado.&amp;lt;br/&amp;gt;&lt;br /&gt;
Não se avaliam alunos fora do turno de inscrição.&lt;br /&gt;
&lt;br /&gt;
Alunos que compareçam atrasados a estas aulas não são avaliados.&amp;lt;br/&amp;gt;&lt;br /&gt;
É admitido um limite máximo de 20 minutos para entrada, após a hora definida para a aula (i.e., já contabilizando os 10 minutos do início).&lt;br /&gt;
&lt;br /&gt;
Não são considerados casos especiais na avaliação das aulas práticas. Alunos que considerem ter direito a tratamento especial e que não consigam comparecer com aproveitamento nestas aulas poderão requerer avaliação em época especial.&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Aqui: https://bit.ly/co26-pautas (ver Fénix)&lt;br /&gt;
&lt;br /&gt;
== Prazos de revisão ==&lt;br /&gt;
Ver anúncio correspondente no Fénix. &lt;br /&gt;
&lt;br /&gt;
As revisões decorrem exclusivamente via Classroom (ver Fénix).&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
Na pauta:&lt;br /&gt;
* &#039;&#039;Nota&#039;&#039; indica a nota final (são contabilizados os 9 melhores exercícios)&lt;br /&gt;
* &#039;&#039;Média&#039;&#039; indica a média dos exercícios apresentados (são contabilizados todos os exercícios)&lt;br /&gt;
&lt;br /&gt;
As classificações possíveis para cada exercício são:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.00&amp;lt;/font&amp;gt; - ignorância (quase) completa da matéria em avaliação ou não inscrito no turno&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt; - erros graves ou solução muito incompleta ou inadequada&lt;br /&gt;
* 0.50 - erros importantes ou solução incompleta&lt;br /&gt;
* 0.75 - erros pouco graves ou solução quase completa&lt;br /&gt;
* &amp;lt;font color=&amp;quot;forestgreen&amp;quot;&amp;gt;1.00&amp;lt;/font&amp;gt; - solução completa&lt;br /&gt;
&lt;br /&gt;
=== IMPORTANTE ===&lt;br /&gt;
&lt;br /&gt;
Obter classificações abaixo de 0.75 deve constituir motivo de preocupação, especialmente nos casos 0 e 0.25, sendo os alunos fortemente encorajados a contactar o responsável pela disciplina para compreensão dos problemas em causa.&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17835</id>
		<title>Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17835"/>
		<updated>2026-06-05T11:34:59Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Legenda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A avaliação nestas aulas é obrigatória e não é repetível fora da semana em que cada exercício é realizado.&amp;lt;br/&amp;gt;&lt;br /&gt;
Não se avaliam alunos fora do turno de inscrição.&lt;br /&gt;
&lt;br /&gt;
Alunos que compareçam atrasados a estas aulas não são avaliados.&amp;lt;br/&amp;gt;&lt;br /&gt;
É admitido um limite máximo de 20 minutos para entrada, após a hora definida para a aula (i.e., já contabilizando os 10 minutos do início).&lt;br /&gt;
&lt;br /&gt;
Não são considerados casos especiais na avaliação das aulas práticas. Alunos que considerem ter direito a tratamento especial e que não consigam comparecer com aproveitamento nestas aulas poderão requerer avaliação em época especial.&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Aqui: https://bit.ly/co26-pautas (ver Fénix)&lt;br /&gt;
&lt;br /&gt;
== Prazos de revisão ==&lt;br /&gt;
Ver anúncio correspondente no Fénix. &lt;br /&gt;
&lt;br /&gt;
As revisões decorrem exclusivamente via Classroom (ver Fénix).&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
* &#039;&#039;Nota&#039;&#039; indica a nota final (são contabilizados os 9 melhores exercícios)&lt;br /&gt;
* &#039;&#039;Média&#039;&#039; indica a média dos exercícios apresentados (são contabilizados todos os exercícios)&lt;br /&gt;
&lt;br /&gt;
As classificações possíveis para cada exercício são:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.00&amp;lt;/font&amp;gt; - ignorância (quase) completa da matéria em avaliação ou não inscrito no turno&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt; - erros graves ou solução muito incompleta ou inadequada&lt;br /&gt;
* 0.50 - erros importantes ou solução incompleta&lt;br /&gt;
* 0.75 - erros pouco graves ou solução quase completa&lt;br /&gt;
* &amp;lt;font color=&amp;quot;forestgreen&amp;quot;&amp;gt;1.00&amp;lt;/font&amp;gt; - solução completa&lt;br /&gt;
&lt;br /&gt;
=== IMPORTANTE ===&lt;br /&gt;
&lt;br /&gt;
Obter classificações abaixo de 0.75 deve constituir motivo de preocupação, especialmente nos casos 0 e 0.25, sendo os alunos fortemente encorajados a contactar o responsável pela disciplina para compreensão dos problemas em causa.&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17834</id>
		<title>Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_das_Aulas_Pr%C3%A1ticas&amp;diff=17834"/>
		<updated>2026-06-05T11:34:18Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A avaliação nestas aulas é obrigatória e não é repetível fora da semana em que cada exercício é realizado.&amp;lt;br/&amp;gt;&lt;br /&gt;
Não se avaliam alunos fora do turno de inscrição.&lt;br /&gt;
&lt;br /&gt;
Alunos que compareçam atrasados a estas aulas não são avaliados.&amp;lt;br/&amp;gt;&lt;br /&gt;
É admitido um limite máximo de 20 minutos para entrada, após a hora definida para a aula (i.e., já contabilizando os 10 minutos do início).&lt;br /&gt;
&lt;br /&gt;
Não são considerados casos especiais na avaliação das aulas práticas. Alunos que considerem ter direito a tratamento especial e que não consigam comparecer com aproveitamento nestas aulas poderão requerer avaliação em época especial.&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Aqui: https://bit.ly/co26-pautas (ver Fénix)&lt;br /&gt;
&lt;br /&gt;
== Prazos de revisão ==&lt;br /&gt;
Ver anúncio correspondente no Fénix. &lt;br /&gt;
&lt;br /&gt;
As revisões decorrem exclusivamente via Classroom (ver Fénix).&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
* &#039;&#039;Nota&#039;&#039; indica a nota final (são contabilizados os 9 melhores exercícios)&lt;br /&gt;
* &#039;&#039;Média&#039;&#039; indica a média dos exercícios apresentados (são contabilizados todos os exercícios)&lt;br /&gt;
&lt;br /&gt;
As classificações possíveis para cada exercício são:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.00&amp;lt;/font&amp;gt; - ignorância (quase) completa da matéria em avaliação ou não inscrito no turno&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt; - erros graves ou solução muito incompleta ou inadequada&lt;br /&gt;
* 0.50 - erros importantes ou solução incompleta&lt;br /&gt;
* 0.75 - erros pouco graves ou solução quase completa&lt;br /&gt;
* &amp;lt;font color=&amp;quot;forestgreen&amp;quot;&amp;gt;1.00&amp;lt;/font&amp;gt; - solução completa&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANTE&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Obter classificações abaixo de 0.75 deve constituir motivo de preocupação, especialmente nos casos 0 e 0.25, sendo os alunos fortemente encorajados a contactar o responsável pela disciplina para compreensão dos problemas em causa.&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17833</id>
		<title>Compiladores/Pautas 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17833"/>
		<updated>2026-06-05T11:33:59Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pautas da Disciplina */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
Além dos resultados de avaliação, as páginas das pautas contêm também os critérios de avaliação e aprovação.&lt;br /&gt;
* {{PautaAberta}} indica avaliação em curso&lt;br /&gt;
* {{PautaFechada}} indica avaliação terminada (classificações definitivas)&lt;br /&gt;
* {{ProvaPorRealizar}} indica avaliação prevista&lt;br /&gt;
&lt;br /&gt;
== Pautas da Disciplina ==&lt;br /&gt;
&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global da Disciplina|Pauta Global da Disciplina]] -- próxima avaliação: (ver Fénix)&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas|Pauta das Aulas Práticas]] (época nornal)&lt;br /&gt;
&lt;br /&gt;
== Pautas do Projecto (época normal) ==&lt;br /&gt;
&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;|Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;]]&lt;br /&gt;
* {{PautaAberta}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia|Pauta do Projecto: Entrega Intermédia]]&lt;br /&gt;
* {{PautaAberta}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final|Pauta do Projecto: Entrega Final]]&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global do Projecto|Pauta Global do Projecto]]&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Final&amp;diff=17832</id>
		<title>Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026/Pauta_do_Projecto:_Entrega_Final&amp;diff=17832"/>
		<updated>2026-06-05T11:32:12Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Legenda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== Pauta ==&lt;br /&gt;
Aqui: https://bit.ly/co26-pautas (ver Fénix)&lt;br /&gt;
&lt;br /&gt;
== Prazo de Revisão ==&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO: falta nota do teste prático&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;PAUTA EM ACTUALIZAÇÃO&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&amp;lt;!--&#039;&#039;&#039;&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;PAUTA FECHADA&amp;lt;/font&amp;gt;&#039;&#039;&#039;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ver anúncio na página da disciplina (Fénix).&lt;br /&gt;
&lt;br /&gt;
== Critérios de Avaliação ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;A entrega final é obrigatória.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
São considerados os das entregas anteriores (adaptados).&lt;br /&gt;
&lt;br /&gt;
== Legenda ==&lt;br /&gt;
&lt;br /&gt;
A entrega final vale 12 valores em 20 (7 qualidade; 5 automáticos).&lt;br /&gt;
&lt;br /&gt;
* Qualidade (7 valores): análise lexical (0.75) + análise sintáctica (0.75) + nós (AST) (0.75) + análise semântica e geração de código (0.75) + avaliação global (0.50) + repositório e compilação (0.50). Os pesos são relativos ao total 4 (i.e., o valor final multiplica por 7/4).&lt;br /&gt;
* Testes automáticos (5 valores).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Os alunos são encorajados a compreender/verificar os problemas reportados. Todos os alunos podem proceder a correcções pequenas (contactar responsável) para resolver algum problema. Haverá penalizações por efectuar correcções a código entregue.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;Os alunos são encorajados a compreender/verificar os problemas reportados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quaisquer dúvidas ou sugestões, relativas a esta informação, devem ser enviadas ao responsável pela disciplina ou esclarecidas nos horários de dúvidas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recorda-se que a classificação global do projecto não se limita à soma das classificações das várias entregas: a classificação final é ainda influenciada pela classificação do teste prático. Este teste é obrigatório e eliminatório (i.e., a classificação deve ser maior que zero).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;border-style: solid; border-width: 1px; border-color: #bbbbaa; background: #f7f8ff;&amp;quot;&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; border-style: solid; border-width: 0px; border-bottom-width: 0px; border-color: #bbbbaa;  background: #d7d8ed;&amp;quot; | &#039;&#039;&#039;Descrição dos problemas assinalados na pauta&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;padding-left:10px; padding-right:10px; font-weight: normal; border-style: solid; border-width: 1px; border-color: #bbbbaa; &amp;quot; | &lt;br /&gt;
&#039;&#039;&#039;Problemas na análise lexical&#039;&#039;&#039;&lt;br /&gt;
* .* - uso indevido do padrão&lt;br /&gt;
* chars - definição indevida (não existem na linguagem)&lt;br /&gt;
* comments - problemas com comentários (em excesso ou em falta)&lt;br /&gt;
* real - problemas com reais (definições incompletas ou excessivas)&lt;br /&gt;
* ints - problemas com inteiros (definições incompletas ou excessivas)&lt;br /&gt;
* keywords - problemas com palavras chave (a mais ou a menos)&lt;br /&gt;
* strings - problemas na definição de strings (composição, concatenação indevida, etc.)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas na análise sintáctica&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* conflicts - conflitos no analisador LALR(1)&lt;br /&gt;
* exprs - problemas nas expressões (em falta ou com inclusão de casos errados)&lt;br /&gt;
* lvals - problemas na definição de left-values (e.g. ausência de definições ou incompletas)&lt;br /&gt;
* precs - problemas na definição de precedências (tipicamente, em excesso ou sem correspondência com o manual)&lt;br /&gt;
* strings - problemas na definção de cadeias de caracteres&lt;br /&gt;
* syntax - problemas na definição da gramática (relativamente ao manual de referência)&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas nos nós&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problemas na análise semântica e na geração de código&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* symbol - problemas na definição dos símbolos (atributos em excesso ou em falta)&lt;br /&gt;
* stack - problemas na definição do stack das funções&lt;br /&gt;
* types - problemas na verificação de tipos&lt;br /&gt;
* postfix - problemas na geração de código&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outros problemas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* empty methods - métodos vazios nos visitors (não deviam ser vazios)&lt;br /&gt;
* types - problemas com o visitor de verificação de tipos&lt;br /&gt;
* [outras anotações] - casos específicos (contactar professor responsável)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17831</id>
		<title>Compiladores/Pautas 2025-2026</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Pautas_2025-2026&amp;diff=17831"/>
		<updated>2026-06-05T11:31:00Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Pautas do Projecto (época normal) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
Além dos resultados de avaliação, as páginas das pautas contêm também os critérios de avaliação e aprovação.&lt;br /&gt;
* {{PautaAberta}} indica avaliação em curso&lt;br /&gt;
* {{PautaFechada}} indica avaliação terminada (classificações definitivas)&lt;br /&gt;
* {{ProvaPorRealizar}} indica avaliação prevista&lt;br /&gt;
&lt;br /&gt;
== Pautas da Disciplina ==&lt;br /&gt;
&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global da Disciplina|Pauta Global da Disciplina]] -- próxima avaliação: (ver Fénix)&lt;br /&gt;
* {{PautaAberta}} [[Compiladores/Pautas 2025-2026/Pauta das Aulas Práticas|Pauta das Aulas Práticas]] (época nornal)&lt;br /&gt;
&lt;br /&gt;
== Pautas do Projecto (época normal) ==&lt;br /&gt;
&lt;br /&gt;
* {{PautaFechada}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;|Pauta do Projecto: Entrega &amp;quot;zero&amp;quot;]]&lt;br /&gt;
* {{PautaAberta}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Intermédia|Pauta do Projecto: Entrega Intermédia]]&lt;br /&gt;
* {{PautaAberta}} [[Compiladores/Pautas 2025-2026/Pauta do Projecto: Entrega Final|Pauta do Projecto: Entrega Final]]&lt;br /&gt;
* [[Compiladores/Pautas 2025-2026/Pauta Global do Projecto|Pauta Global do Projecto]]&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores 2025-2026]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17830</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17830"/>
		<updated>2026-06-03T13:26:35Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Calendário */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; (sem inscrições)&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	52327 109797	106647	110274	110600	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
(a realizar)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17829</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17829"/>
		<updated>2026-06-03T13:11:51Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Condições */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita prévia aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	52327 109797	106647	110274	110600	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
(a realizar)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17828</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17828"/>
		<updated>2026-06-03T13:11:11Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Condições */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal (recomenda-se fortemente uma visita aos labs para testar a capacidade de login -- é da responsabilidade do aluno ser capaz de fazer login), pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	52327 109797	106647	110274	110600	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
(a realizar)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17827</id>
		<title>Compiladores/Projecto de Compiladores/Teste Prático (Época Normal)</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Teste_Pr%C3%A1tico_(%C3%89poca_Normal)&amp;diff=17827"/>
		<updated>2026-06-03T13:09:04Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Calendário */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20222023}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Condições ==&lt;br /&gt;
Os períodos de realização do teste prático são como indicado abaixo. O teste prático tem a duração de 45 minutos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;brown&amp;quot;&amp;gt;&#039;&#039;&#039;A não realização do teste prático corresponde a uma classificação de 0 (zero) na componente de projecto e consequente reprovação à disciplina de Compiladores no ano lectivo em curso (época normal).&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos [https://selfservice.dsi.tecnico.ulisboa.pt/ activar os serviços de Shell e AFS], para a realização do teste prático. A activação não é instantânea e não funciona no próprio dia: alunos nestas condições estão necessariamente excluídos da avaliação, pois não conseguirão realizar o teste prático&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;É necessário e da responsabilidade dos alunos activar os serviços de Shell e AFS, para a realização do teste prático, tal como para a realização do projecto.&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;Alunos que não consigam fazer login nas máquinas dos labs da RNL estão automaticamente excluídos da avaliação da disciplina em época normal, pois isso significa que também não participaram na realização do projecto (o acesso ao Gitlab usa as mesmas credenciais). Não são admitidas participações &amp;quot;passivas&amp;quot; ou em modo &amp;quot;espectador&amp;quot;, em que um elemento &amp;quot;acompanha&amp;quot; o desenvolvimento do código pelo colega. Além disso, alunos que não demonstrem competência activa serão reprovados.&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;!--== Calendário e Acesso ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;O teste prático realiza-se remotamente numa única sessão: 4ª feira, 2020/05/27, 09:30 [notar bem a hora]. Relembra-se que o teste prático é estritamente individual e obrigatório.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tal como para os exercícios práticos, será necessária ligação Zoom (a da aula teórica de 4ª feira, 09:30 -- link no Classroom).&lt;br /&gt;
O vídeo dos participantes tem de estar ligado e o microfone também.&lt;br /&gt;
O anfitrião (professor) controla o microfone: estará fechado, excepto durante situações de monitorização pontual.&lt;br /&gt;
&lt;br /&gt;
O teste prático realiza-se sobre repositório CVS individual (derivado do repositório de cada grupo): O enunciado está no CVS, na directoria de topo do projecto: &#039;&#039;&#039;ENUNCIADO.txt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ISTID@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/#####&#039;&#039;&#039; (&#039;&#039;&#039;#####&#039;&#039;&#039; é o número de aluno)&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;export CVSROOT=:ext:ist123456@sigma.ist.utl.pt:/afs/ist.utl.pt/groups/leic-co/co20/tp/23456&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;cvs co og&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calendário ==&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 18:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 0:&#039;&#039;&#039; 109560	109724	109643	107413 110754	110647	114963	&lt;br /&gt;
&lt;br /&gt;
=== 6ª feira, 2026/06/05, 19:00, Early Bird ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109864 110409&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 09:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 106823	109247	109803	109939	110210 109493	109913	110020	110130	110462&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110200	102707	106516	106507	107332 110597	110008	110144	109324	109685 109245	103151	109368	106495	109339 109886	109606	109762	109872	109404&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 52370	109485	109972	110005	109554 109662	110052	109593	109912	90634&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 110093	109389	110633	109947	102373 110246	110688	110720	110206	110488 109500	109293	110350	106095	106636 110124	110285	111141	107083	72984&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 10:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 110080	109439	109733	109642	104016 110458	110263	111113	109974	109434&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 110208	109852	95776	109878	109371 110562	110375	110233	109901	110223 110245	109905	109601	57175	109634 110439	110186	109680	116424	109775&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109635	106396	109257	109989	106426 109839	110199	109378	110355	106883&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 104013	110446	110483	97226	109483 109163	110729	110760	107316	110136 109481	109675	110148	107357	110054 109482	109955	110308	111111	110089&lt;br /&gt;
&lt;br /&gt;
=== 2ª feira, 2026/06/08, 11:00 ===&lt;br /&gt;
* &#039;&#039;&#039;LAB 1:&#039;&#039;&#039; 109822	103316	92409	109236	52327 109797	106647	110274	110600	88077&lt;br /&gt;
* &#039;&#039;&#039;LAB 2:&#039;&#039;&#039; 109704	110213	109625	109333	109416 109851	110352	109695	110034	110421 106474	109585	109267	109260	110318 106674	109617	109358	109264	110580&lt;br /&gt;
* &#039;&#039;&#039;LAB 3:&#039;&#039;&#039; 109441	109834	102471	109512	110135 103623	109844	110442	83897	86465&lt;br /&gt;
* &#039;&#039;&#039;LAB 5:&#039;&#039;&#039; 109623	109746	109544	111198	109551 109981	110490	110703	111199	110628 109616	109308	110467	109490	109555 110468	110094	111056	110713	110386&lt;br /&gt;
&lt;br /&gt;
== Realizados ==&lt;br /&gt;
(a realizar)&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Projecto_2025-2026/Manual_de_Refer%C3%AAncia_da_Linguagem_P6&amp;diff=17826</id>
		<title>Compiladores/Projecto de Compiladores/Projecto 2025-2026/Manual de Referência da Linguagem P6</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Compiladores/Projecto_de_Compiladores/Projecto_2025-2026/Manual_de_Refer%C3%AAncia_da_Linguagem_P6&amp;diff=17826"/>
		<updated>2026-06-02T17:16:51Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Expressões */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PRJCompiladoreAvisosEN20252026}}&lt;br /&gt;
&amp;lt;!--{{PRJCompiladoreAvisosEE20252026}}--&amp;gt;&lt;br /&gt;
{{PRJCOMandatory20252026}}&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&amp;lt;!--&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;RASCUNHO&#039;&#039;&#039;&amp;lt;/font&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;ÉPOCA NORMAL&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;P6&#039;&#039;&#039; é uma linguagem imperativa. Este manual apresenta de forma intuitiva as características da linguagem: [[#Tipos de Dados|tipos de dados]]; [[#Manipulação de Nomes|manipulação de nomes]]; [[#Convenções Lexicais|convenções lexicais]]; [[#Gramática|estrutura/sintaxe]]; [[#Funções|especificação das funções]]; [[#Instruções|semântica das instruções]]; [[#Expressões|semântica das expressões]]; e, finalmente, [[#Exemplos|alguns exemplos]].&lt;br /&gt;
&lt;br /&gt;
= Tipos de Dados =&lt;br /&gt;
&lt;br /&gt;
A linguagem é fracamente tipificada (são efectuadas algumas conversões implícitas). Existem 4 tipos de dados básicos, apenas alguns dos quais são compatíveis com a [https://en.wikipedia.org/wiki/C_(programming_language) linguagem C]. O alinhamento em memória binária é sempre a 32 bits. Note-se que alguns dos tipos de dados são ternários e devem ser manipulados com as funções das ALUs disponibilizadas.&lt;br /&gt;
&lt;br /&gt;
* Tipos numéricos: os inteiros são [https://en.wikipedia.org/wiki/Balanced_ternary ternários equilibrados], ocupam 40 trits (empacotados em 64 bits); os reais são ternários e estão representados no formato [https://arxiv.org/abs/2404.18603 Takum] (note-se que a definição neste artigo é para uma representação binária e não é exactamente a que é implementada pelas ALUs ternárias em uso no projecto), ocupam 80 trits (empacotados em 128 bits).&lt;br /&gt;
* As cadeias de caracteres são vectores de caracteres binários terminados por [https://en.wikipedia.org/wiki/ASCII ASCII] NUL (carácter com o valor zero). Variáveis e literais deste tipo só podem ser utilizados em atribuições, impressões, ou como argumentos/retornos de funções. Os caracteres são valores de 8 bits não directamente manipuláveis.&lt;br /&gt;
* Os ponteiros representam endereços de objectos (de qualquer tipo) e ocupam 32 bits. Podem ser objecto de operações aritméticas (deslocamentos) e permitem aceder ao valor apontado. Note-se que não é possível usar inteiros ternários directamente em aritmética de ponteiros (têm de ser convertidos para isso).&lt;br /&gt;
&lt;br /&gt;
Os tipos suportados por cada operador e a operação a realizar são indicados na [[#Expressões|definição das expressões]].&lt;br /&gt;
&lt;br /&gt;
Existem ainda tipos associado a valores funcionais, i.e., tipos que descrevem a interface de funções (ver abaixo). Os valores em memória associados a estes tipos são efectivamente ponteiros, mas para funções e não para dados, podendo ser usados para invocar as funções correspondentes. Estes identificadores não podem ser usados como variáveis (e.g., passados como argumentos de outras funções, etc.).&amp;lt;!--Estes ponteiros não aceitam operações de aritmética de ponteiros ou de indexação (embora ponteiros para estes ponteiros as aceitem).--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Manipulação de Nomes =&lt;br /&gt;
&lt;br /&gt;
Os nomes (identificadores) correspondem a variáveis e funções. Nos pontos que se seguem, usa-se o termo entidade para as designar indiscriminadamente, explicitando-se quando a descrição for válida apenas para um dos casos. Existem ainda nomes para funções externas à linguagem P6. Tanto em P6, como em C, os nomes das funções referem directamente a posição do código dessas funções (à la C; ver &#039;&#039;&#039;extern&#039;&#039;&#039; abaixo).&lt;br /&gt;
&lt;br /&gt;
== Espaço de nomes e visibilidade dos identificadores ==&lt;br /&gt;
&lt;br /&gt;
O espaço de nomes global é único, pelo que um nome utilizado para designar uma entidade num dado contexto não pode ser utilizado para designar outras (ainda que de natureza diferente).&lt;br /&gt;
&lt;br /&gt;
Os identificadores são visíveis desde a declaração até ao fim do alcance: ficheiro (globais) ou bloco (locais). A reutilização de identificadores em contextos inferiores encobre declarações em contextos superiores: redeclarações locais podem encobrir as globais até ao fim de um bloco. É possível utilizar símbolos globais nos contextos dos blocos das funções, mas não é possível declará-los (ver [[#Símbolos globais|símbolos globais]]).&lt;br /&gt;
&lt;br /&gt;
== Validade das variáveis ==&lt;br /&gt;
&lt;br /&gt;
As entidades globais (declaradas fora de qualquer função), existem durante toda a execução do programa. As variáveis locais a uma função existem apenas durante a sua execução. Os argumentos formais são válidos enquanto a função está activa.&lt;br /&gt;
&lt;br /&gt;
= Convenções Lexicais =&lt;br /&gt;
&lt;br /&gt;
Para cada grupo de elementos lexicais (tokens), considera-se a maior sequência de caracteres constituindo um elemento válido. Assim, por exemplo, a designação &#039;&#039;&#039;&amp;gt;=&#039;&#039;&#039; é sempre um único elemento lexical (por oposição à situação ilegal de se terem dois símbolos: &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039; seguido de &#039;&#039;&#039;=&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Caracteres brancos ==&lt;br /&gt;
&lt;br /&gt;
São considerados separadores e não representam nenhum elemento lexical: &#039;&#039;&#039;mudança de linha&#039;&#039;&#039; ASCII LF (&#039;&#039;&#039;0x0A&#039;&#039;&#039;, &#039;&#039;&#039;\n&#039;&#039;&#039;), &#039;&#039;&#039;recuo do carreto&#039;&#039;&#039; ASCII CR (&#039;&#039;&#039;0x0D&#039;&#039;&#039;, &#039;&#039;&#039;\r&#039;&#039;&#039;), &#039;&#039;&#039;espaço&#039;&#039;&#039; ASCII SP (&#039;&#039;&#039;0x20&#039;&#039;&#039;, ⌴) e &#039;&#039;&#039;tabulação horizontal&#039;&#039;&#039; ASCII HT (&#039;&#039;&#039;0x09&#039;&#039;&#039;, &#039;&#039;&#039;\t&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Comentários ==&lt;br /&gt;
&lt;br /&gt;
Existem dois tipos de comentários, que também funcionam como elementos separadores:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;explicativos&#039;&#039;&#039; -- começam com &#039;&#039;&#039;//&#039;&#039;&#039; e acabam no fim da linha; e&lt;br /&gt;
* &#039;&#039;&#039;operacionais&#039;&#039;&#039; -- começam com &#039;&#039;&#039;/*&#039;&#039;&#039; e terminam com &#039;&#039;&#039;*/&#039;&#039;&#039;, podendo estar aninhados.&lt;br /&gt;
&lt;br /&gt;
Se as sequências de início fizerem parte de uma cadeia de caracteres, não iniciam um comentário (ver [[#Cadeias de caracteres|definição das cadeias de caracteres]]).&lt;br /&gt;
&lt;br /&gt;
== Palavras-chave ==&lt;br /&gt;
&lt;br /&gt;
As seguintes palavras-chave são reservadas, não constituindo identificadores (devem ser escritas exactamente como indicado):&lt;br /&gt;
&lt;br /&gt;
* tipos: &#039;&#039;&#039;int real string void&#039;&#039;&#039;&lt;br /&gt;
* declarações: &#039;&#039;&#039;extern forward public auto&#039;&#039;&#039;&lt;br /&gt;
* instruções: &#039;&#039;&#039;if elif else while stop next return&#039;&#039;&#039;&lt;br /&gt;
* expressões: &#039;&#039;&#039;input null sizeof&#039;&#039;&#039;&lt;br /&gt;
* outras: &#039;&#039;&#039;begin end&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Tipos ==&lt;br /&gt;
&lt;br /&gt;
Os seguintes elementos lexicais designam tipos em declarações (ver gramática): &#039;&#039;&#039;int&#039;&#039;&#039; (inteiro), &#039;&#039;&#039;real&#039;&#039;&#039; (real), &#039;&#039;&#039;string&#039;&#039;&#039; (cadeia de caracteres). &lt;br /&gt;
&lt;br /&gt;
Os tipos correspondentes a ponteiros são outros tipos delimitados por &#039;&#039;&#039;[&#039;&#039;&#039; e &#039;&#039;&#039;]&#039;&#039;&#039;, designando uma indirecção e não o objecto directo (ver gramática).&lt;br /&gt;
&lt;br /&gt;
Note-se que, quando se tem uma declaração &#039;&#039;&#039;extern&#039;&#039;&#039;, os tipos correspondem aos compatíveis com a linguagem C na mesma arquitectura ix86 de 32 bits, i.e., &#039;&#039;&#039;int&#039;&#039;&#039; corresponde a  um número binário inteiro em [https://en.wikipedia.org/wiki/Two%27s_complement complemento para 2] (32 bits), &#039;&#039;&#039;real&#039;&#039;&#039; coresponde a uma representação segundo a norma [https://en.wikipedia.org/wiki/IEEE_754 IEEE 754] de dupla precisão (64 bits), devendo ser convertidos de e para os tipos nativos da linguage P6 sempre que necessário (ver RTS).&lt;br /&gt;
&lt;br /&gt;
== Operadores de expressões ==&lt;br /&gt;
&lt;br /&gt;
São considerados operadores os elementos lexicais apresentados na definição das expressões.&lt;br /&gt;
&lt;br /&gt;
== Delimitadores e terminadores ==&lt;br /&gt;
&lt;br /&gt;
Os seguintes elementos lexicais são delimitadores/terminadores: &lt;br /&gt;
* &#039;&#039;&#039;,&#039;&#039;&#039; (vírgula)&lt;br /&gt;
* &#039;&#039;&#039;;&#039;&#039;&#039; (ponto e vírgula)&lt;br /&gt;
* &#039;&#039;&#039;!&#039;&#039;&#039; e &#039;&#039;&#039;!!&#039;&#039;&#039; (operações de impressão)&lt;br /&gt;
* &#039;&#039;&#039;(&#039;&#039;&#039; e &#039;&#039;&#039;)&#039;&#039;&#039; (delimitadores de expressões)&lt;br /&gt;
* &#039;&#039;&#039;{&#039;&#039;&#039; e &#039;&#039;&#039;}&#039;&#039;&#039; (delimitadores de blocos)&lt;br /&gt;
&lt;br /&gt;
== Identificadores (nomes) ==&lt;br /&gt;
&lt;br /&gt;
São iniciados por uma letra, seguindo-se 0 (zero) ou mais letras ou dígitos. O comprimento do nome é ilimitado e dois nomes são distintos se houver alteração de maiúscula para minúscula, ou vice-versa, de pelo menos um carácter.&lt;br /&gt;
&lt;br /&gt;
== Literais ==&lt;br /&gt;
&lt;br /&gt;
São notações para valores constantes de alguns tipos da linguagem (não confundir com constantes, i.e., identificadores que, em algumas linguagens, designam elementos cujo valor não pode ser alterado durante a execução do programa).&lt;br /&gt;
&lt;br /&gt;
=== Inteiros ===&lt;br /&gt;
&lt;br /&gt;
Um literal inteiro é um número não negativo (mas ver a seguir). Números negativos podem ser construídos pela aplicação do operador de negação unária (&#039;&#039;&#039;-&#039;&#039;&#039;) a um literal (sempre positivo).&lt;br /&gt;
&lt;br /&gt;
Literais inteiros decimais são constituídos por sequências de 1 (um) ou mais dígitos de &#039;&#039;&#039;0&#039;&#039;&#039; a &#039;&#039;&#039;9&#039;&#039;&#039;, em que o primeiro digito não é 0 (zero), excepto no caso do número 0 (zero). Neste caso, é composto apenas pelo dígito 0 (zero) (em qualquer base).&lt;br /&gt;
&lt;br /&gt;
Literais inteiros em base 9 começam sempre pelo dígito 0 (zero), sendo seguidos de um ou mais dígitos de &#039;&#039;&#039;0&#039;&#039;&#039; a &#039;&#039;&#039;8&#039;&#039;&#039; (note-se que &#039;&#039;&#039;09&#039;&#039;&#039; é um literal inválido em base 9). Exemplo: &#039;&#039;&#039;086 = 78&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Literais inteiros em base 3 (equilibrada) começam sempre com a sequência &#039;&#039;&#039;0t&#039;&#039;&#039;, seguida de um ou mais símbolos dessa base: &#039;&#039;&#039;-&#039;&#039;&#039; (valor &#039;&#039;&#039;-1&#039;&#039;&#039;), &#039;&#039;&#039;0&#039;&#039;&#039; (valor &#039;&#039;&#039;0&#039;&#039;&#039;) e &#039;&#039;&#039;+&#039;&#039;&#039; (valor &#039;&#039;&#039;1&#039;&#039;&#039;). Estes literais podem ser intrinsecamente negativos. Exemplos: &#039;&#039;&#039;0t+0-0 = 24&#039;&#039;&#039;; &#039;&#039;&#039;0t-0+0 = -24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se não for possível representar um literal na máquina, devido a overflow, deverá ser gerado um erro lexical.&lt;br /&gt;
&lt;br /&gt;
=== Reais em formato Takum3 ===&lt;br /&gt;
&lt;br /&gt;
Os literais reais (sempre positivos) são expressos tal como em C (exclusivamente em base 10). &lt;br /&gt;
&lt;br /&gt;
Não existem literais negativos (números negativos resultam da operação unária &#039;&#039;&#039;-&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Note-se que um literal sem &#039;&#039;&#039;.&#039;&#039;&#039; (ponto decimal) nem parte exponencial é do tipo inteiro.&lt;br /&gt;
&lt;br /&gt;
Note-se que, apesar de C normalmente usar uma representação interna em binário no formato IEEE 754, a linguagem P6 usa um formato, representado em ternário, completamente diferente (embora a forma de escrita dos literais seja a mesma).&lt;br /&gt;
&lt;br /&gt;
Exemplos: &#039;&#039;&#039;3.14&#039;&#039;&#039;, &#039;&#039;&#039;1E3&#039;&#039;&#039; = 1000 (número inteiro representado como real). &#039;&#039;&#039;12.34e-24&#039;&#039;&#039; = 12.34 x 10&amp;lt;sup&amp;gt;-24&amp;lt;/sup&amp;gt; (notação cientifica).&lt;br /&gt;
&amp;lt;!--Se não for possível representar um literal real na máquina, devido a overflow, deverá ser gerado um erro lexical.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cadeias de caracteres ===&lt;br /&gt;
&lt;br /&gt;
As cadeias de caracteres são delimitadas por aspas (&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;) e podem conter quaisquer caracteres, excepto ASCII NUL (0x00) e ASCII LF (0x0A). Nas cadeias, os delimitadores de comentários não têm significado especial. Se for escrito um literal que contenha &#039;&#039;&#039;\0&#039;&#039;&#039;, então a cadeia termina nessa posição. Exemplo: &#039;&#039;&#039;ab\0xy&#039;&#039;&#039; tem o mesmo significado que &#039;&#039;&#039;ab&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
É possível designar caracteres por sequências especiais (iniciadas por &#039;&#039;&#039;\&#039;&#039;&#039;), especialmente úteis quando não existe representação gráfica directa. As sequências especiais correspondem aos caracteres ASCII HT, LF e CR (&#039;&#039;&#039;\t&#039;&#039;&#039;, &#039;&#039;&#039;\n&#039;&#039;&#039; e &#039;&#039;&#039;\r&#039;&#039;&#039;, respectivamente), aspa (&#039;&#039;&#039;\&amp;quot;&#039;&#039;&#039;). &#039;&#039;backslash&#039;&#039; (&#039;&#039;&#039;\\&#039;&#039;&#039;), ou a quaisquer outros especificados através de 1 a 3 dígitos em base 8, designando valores de 8 bits (e.g., &#039;&#039;&#039;\012&#039;&#039;&#039; ou apenas &#039;&#039;&#039;\12&#039;&#039;&#039; se o carácter seguinte não representar um dígito em base 8). Exemplo: &#039;&#039;&#039;xy\012z&#039;&#039;&#039; tem o mesmo significado que &#039;&#039;&#039;xy\12z&#039;&#039;&#039; e que &#039;&#039;&#039;xy\nz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Elementos lexicais distintos que representem duas ou mais cadeias consecutivas são representadas na linguagem como uma única cadeia que resulta da concatenação. Exemplo: &#039;&#039;&#039;&amp;quot;ab&amp;quot;&#039;&#039;&#039; &#039;&#039;&#039;&amp;quot;cd&amp;quot;&#039;&#039;&#039; é o mesmo que &#039;&#039;&#039;&amp;quot;abcd&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Ponteiros ===&lt;br /&gt;
&lt;br /&gt;
O único literal admissível para ponteiros corresponde ao ponteiro nulo e é indicado pela palavra-chave &#039;&#039;&#039;null&#039;&#039;&#039;. Este literal é compatível com todos os tipos de ponteiro. Os inteiros não são convertíveis em ponteiros, pelo que o valor &#039;&#039;&#039;0&#039;&#039;&#039; (zero) não é um valor inicial admissível para ponteiros.&lt;br /&gt;
&lt;br /&gt;
Note-se que a aritmética de ponteiros é possível apenas com inteiros binários, mas não com inteiros ternários (estes devem ser convertidos para binário, caso seja necessário).&lt;br /&gt;
&lt;br /&gt;
= Gramática =&lt;br /&gt;
&lt;br /&gt;
A gramática da linguagem está resumida abaixo. Considerou-se que os elementos em tipo fixo são literais, que os parênteses curvos agrupam elementos, que elementos alternativos são separados por uma barra vertical, que elementos opcionais estão entre parênteses rectos, que os elementos que se repetem zero ou mais vezes estão entre &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt;. Alguns elementos usados na gramática também são elementos da linguagem descrita se representados em tipo fixo (e.g., parênteses).&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;width: 140px; font-weight: normal;&amp;quot; | &#039;&#039;ficheiro&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;declaração&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt; [ &#039;&#039;programa-principal&#039;&#039; ]&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 150px; font-weight: normal;&amp;quot; | &#039;&#039;declaração&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| [ &#039;&#039;qualificador&#039;&#039; ] &#039;&#039;tipo&#039;&#039; &#039;&#039;identificador&#039;&#039; [ &#039;&#039;&#039;=&#039;&#039;&#039; &#039;&#039;expressão&#039;&#039; ] &#039;&#039;&#039;;&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| [ &#039;&#039;qualificador&#039;&#039; ] [ &#039;&#039;&#039;auto&#039;&#039;&#039; ] &#039;&#039;identificador&#039;&#039; &#039;&#039;&#039;=&#039;&#039;&#039; &#039;&#039;expressão&#039;&#039; &#039;&#039;&#039;;&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;função&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 150px; font-weight: normal;&amp;quot; | &#039;&#039;programa-principal&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;begin&#039;&#039;&#039; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;declaração&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;instrução&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt; &#039;&#039;&#039;end&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;função&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
|  [ &#039;&#039;qualificador&#039;&#039; ] &#039;&#039;identificador&#039;&#039; &#039;&#039;&#039;(&#039;&#039;&#039; &#039;&#039;&#039;)&#039;&#039;&#039; &#039;&#039;&#039;-&amp;gt;&#039;&#039;&#039; &#039;&#039;tipo&#039;&#039; &#039;&#039;bloco&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
|  [ &#039;&#039;qualificador&#039;&#039; ] &#039;&#039;identificador&#039;&#039; &#039;&#039;&#039;(&#039;&#039;&#039; &#039;&#039;variáveis&#039;&#039; &#039;&#039;&#039;)&#039;&#039;&#039; &#039;&#039;&#039;-&amp;gt;&#039;&#039;&#039; &#039;&#039;tipo&#039;&#039; &#039;&#039;bloco&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;variáveis&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;variável&#039;&#039; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;&#039;,&#039;&#039;&#039; &#039;&#039;variável&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;tipo&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;int&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;&#039;real&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;&#039;string&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;&#039;void&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;&#039;[&#039;&#039;&#039; &#039;&#039;tipo&#039;&#039; &#039;&#039;&#039;]&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;tipo-de-função&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;tipo-de-função&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;tipo&#039;&#039; &#039;&#039;&#039;&amp;lt;&#039;&#039;&#039; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;tipo&#039;&#039; &#039;&#039;&#039;&amp;lt;&#039;&#039;&#039; &#039;&#039;tipos&#039;&#039; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;tipos&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;tipo&#039;&#039; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;&#039;,&#039;&#039;&#039; &#039;&#039;tipo&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;bloco&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;{&#039;&#039;&#039; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;declaração&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;instrução&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt; &#039;&#039;&#039;}&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;instrução&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;expressão&#039;&#039; &#039;&#039;&#039;;&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;expressões&#039;&#039; &#039;&#039;&#039;!&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;expressões&#039;&#039; &#039;&#039;&#039;!!&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; [ &#039;&#039;literal-inteiro&#039;&#039; ] &#039;&#039;&#039;;&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;&#039;next&#039;&#039;&#039; [ &#039;&#039;literal-inteiro&#039;&#039; ] &#039;&#039;&#039;;&#039;&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;&#039;return&#039;&#039;&#039; [ &#039;&#039;expressão&#039;&#039; ] &#039;&#039;&#039;;&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;instrução-condicional&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;instrução-de-iteração&#039;&#039; &amp;lt;math&amp;gt;|&amp;lt;/math&amp;gt; &#039;&#039;bloco&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;instrução-condicional&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;if&#039;&#039;&#039; &#039;&#039;&#039;(&#039;&#039;&#039; &#039;&#039;expressão&#039;&#039; &#039;&#039;&#039;)&#039;&#039;&#039; &#039;&#039;instrução&#039;&#039; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt;  &#039;&#039;&#039;elif&#039;&#039;&#039; &#039;&#039;&#039;(&#039;&#039;&#039; &#039;&#039;expressão&#039;&#039; &#039;&#039;&#039;)&#039;&#039;&#039; &#039;&#039;instrução&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt; [ &#039;&#039;&#039;else&#039;&#039;&#039; &#039;&#039;instrução&#039;&#039; ]&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;instrução-de-iteração&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;while&#039;&#039;&#039; &#039;&#039;&#039;(&#039;&#039;&#039; &#039;&#039;expressão&#039;&#039; &#039;&#039;&#039;)&#039;&#039;&#039; &#039;&#039;instrução&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; | &#039;&#039;expressões&#039;&#039;&lt;br /&gt;
! style=&amp;quot;width: 50px; font-weight: normal;&amp;quot; |&amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| &#039;&#039;expressão&#039;&#039; &amp;lt;math&amp;gt;\langle&amp;lt;/math&amp;gt; &#039;&#039;&#039;,&#039;&#039;&#039; &#039;&#039;expressão&#039;&#039; &amp;lt;math&amp;gt;\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tipos, identificadores, literais e definição de expressões ==&lt;br /&gt;
&lt;br /&gt;
Algumas definições foram omitidas da gramática: tipos de dados. qualificadores e variável (ver [[#Declarações de variáveis|declarações de variáveis]]), identificador (ver [[#Identificadores (nomes)|identificadores]]), literal (ver [[#Literais|literais]]); expressão (ver [[#Expressões|expressões]]). &amp;lt;!--Note-se que &#039;&#039;função&#039;&#039; é qualquer especificação de função (corpo ou ponteiro com o tipo apropriado). Neste sentido, as funções contam como expressões primitivas.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quanto a tipos de dados, &#039;&#039;&#039;int&#039;&#039;&#039; designa valores inteiros, &#039;&#039;&#039;real&#039;&#039;&#039; designa valores reais, &#039;&#039;&#039;string&#039;&#039;&#039; designa cadeias de caracteres. Os ponteiros são tipos compostos por um tipo entre parênteses rectos, e.g., &#039;&#039;&#039;[int]&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Os tipos funcionais são definidos a partir dos tipos de dados anteriormente descritos e do tipo especial &#039;&#039;&#039;void&#039;&#039;&#039; (ver a seguir). O tipo é indicado com o formato indicado na gramática, i.e., tipo de retorno seguido dos tipos dos argumentos (zero ou mais separados por vírgulas). Estes tipos servem para declarar símbolos de função sem as definir.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Um ponteiro declarado com um tipo de função indica o endereço da função correspondente. Estes ponteiros não suportam aritmética de ponteiros.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O tipo &#039;&#039;&#039;void&#039;&#039;&#039; apenas pode ser usado para indicar a ausência de retorno ou para declarar um ponteiro genérico. Neste caso, o aninhamento é irrelevante, i.e., &#039;&#039;&#039;[void]&#039;&#039;&#039; e &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;[[[void]]]&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039; são equivalentes. Um ponteiro deste tipo é compatível com todos os outros tipos de ponteiros. A aritmética de ponteiros decrementa/incrementa em uma unidade o valor de um ponteiro do tipo &#039;&#039;&#039;[void]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Left-values ==&lt;br /&gt;
&lt;br /&gt;
Os &#039;&#039;left-values&#039;&#039; são posições de memória que podem ser modificadas (excepto onde proibido pelo tipo de dados). Os elementos de uma expressão que podem ser utilizados como left-values encontram-se individualmente identificados na semântica das expressões.&lt;br /&gt;
&lt;br /&gt;
== Ficheiros ==&lt;br /&gt;
&lt;br /&gt;
Um ficheiro é designado por principal se contiver a função principal (onde se inicia o programa).&lt;br /&gt;
&lt;br /&gt;
== Declaração de variáveis ==&lt;br /&gt;
&lt;br /&gt;
Uma declaração de variável indica sempre um tipo de dados (implícito ou explícito) e um identificador.&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
&lt;br /&gt;
* Inteiro: &#039;&#039;&#039;int i&#039;&#039;&#039;&lt;br /&gt;
* Real: &#039;&#039;&#039;real r&#039;&#039;&#039;&lt;br /&gt;
* Cadeia de caracteres: &#039;&#039;&#039;string s&#039;&#039;&#039;&lt;br /&gt;
* Ponteiro para inteiro: &#039;&#039;&#039;[int] p1&#039;&#039;&#039; (semelhante a &#039;&#039;&#039;int*&#039;&#039;&#039; em C)&lt;br /&gt;
* Ponteiro para real: &#039;&#039;&#039;[real] p2&#039;&#039;&#039; (semelhante a &#039;&#039;&#039;double*&#039;&#039;&#039; em C)&lt;br /&gt;
* Ponteiro para cadeia de caracteres: &#039;&#039;&#039;[string] p3&#039;&#039;&#039; (semelhante a &#039;&#039;&#039;char**&#039;&#039;&#039; em C)&lt;br /&gt;
* Ponteiro para ponteiro para inteiro: &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;[[int]]&amp;lt;/nowiki&amp;gt; p4&#039;&#039;&#039; (semelhante a &#039;&#039;&#039;int**&#039;&#039;&#039; em C)&lt;br /&gt;
&lt;br /&gt;
É possível usar o pseudo-tipo &#039;&#039;&#039;auto&#039;&#039;&#039; se a declaração tiver um valor inicial: neste caso, o tipo é o do valor inicial.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
* Variável inteira: &#039;&#039;&#039;auto i = 1&#039;&#039;&#039;&lt;br /&gt;
* Variável real: &#039;&#039;&#039;auto f = 2.0&#039;&#039;&#039;&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
== Símbolos globais ==&lt;br /&gt;
&lt;br /&gt;
Por omissão, os símbolos são privados a um módulo, não podendo ser importados por outros módulos.&lt;br /&gt;
&lt;br /&gt;
A palavra-chave &#039;&#039;&#039;public&#039;&#039;&#039; permite declarar um identificador como público, tornando-o acessível a partir de outros módulos. Quando usado com a palavra-chave &#039;&#039;&#039;auto&#039;&#039;&#039;, esta é opcional. Note-se que a declaração de uma variável tem de ter sempre, ou o qualificador, ou o tipo, podendo estar ambos presentes.&lt;br /&gt;
&lt;br /&gt;
A palavra-chave &#039;&#039;&#039;forward&#039;&#039;&#039; permite declarar num módulo variáveis ou funções definidas noutros módulos. Neste caso, não pode ser especificado o valor inicial das variáveis, pelo que não é possível o uso de &#039;&#039;&#039;auto&#039;&#039;&#039; em conjunto com &#039;&#039;&#039;forward&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A palavra-chave &#039;&#039;&#039;extern&#039;&#039;&#039; deve ser usada para declarar símbolos de função com tipos diferentes dos dos nativos da da linguagem P6, e.g. para importar funções definidas em C. Além de poderem ser usados para chamar as funções que designam, os símbolos assim declarados podem ser utilizados com valores convertidos de forma apropriada.&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
* Declarar variável privada ao módulo: &#039;&#039;&#039;real r1 = 22.0&#039;&#039;&#039;&lt;br /&gt;
* Declarar variável pública: &#039;&#039;&#039;public real r2 = 7.0&#039;&#039;&#039;&lt;br /&gt;
* Declarar variável pública: &#039;&#039;&#039;public auto r2 = 7.0&#039;&#039;&#039; (igual à anterior)&lt;br /&gt;
* Declarar variável pública: &#039;&#039;&#039;public r2 = 7.0&#039;&#039;&#039; (igual à anterior)&lt;br /&gt;
* Usar definição externa de variável pública: &#039;&#039;&#039;forward real r2&#039;&#039;&#039;&lt;br /&gt;
* Declarar função (nativa P6) definida externamente: &#039;&#039;&#039;forward int&amp;lt;int&amp;gt; factorial&#039;&#039;&#039;&lt;br /&gt;
* Declarar função definida noutra linguagem (e.g. em C): &#039;&#039;&#039;extern [void]&amp;lt;int&amp;gt; malloc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Inicialização ==&lt;br /&gt;
&lt;br /&gt;
Quando existe, é a designação do objecto que segue o símbolo &#039;&#039;&#039;=&#039;&#039;&#039;: inteiro, real, cadeia de caracteres, ou ponteiro. Entidades reais podem ser inicializadas por expressões inteiras (conversão implícita). A expressão de inicialização deve ser um literal se a variável for global.&amp;lt;!-- A associação de valores funcionais a variáveis pode ser realizada quando os tipos forem covariantes. As cadeias de caracteres são (possivelmente) inicializadas com uma lista não nula de valores sem separadores.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A palavra &#039;&#039;&#039;auto&#039;&#039;&#039; pode ser usada em lugar do tipo para declarar uma variável. Quando usada, o tipo da variável é inferido a partir do valor inicial (nestes casos, o valor inicial é obrigatório).&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
* Inteiro (literal): &#039;&#039;&#039;int i = 3&#039;&#039;&#039;&lt;br /&gt;
* Inteiro (expressão): &#039;&#039;&#039;int i = j + 1&#039;&#039;&#039;&lt;br /&gt;
* Real (literal): &#039;&#039;&#039;real r = 3.2&#039;&#039;&#039;&lt;br /&gt;
* Real (expressão): &#039;&#039;&#039;real r = i - 2.5&#039;&#039;&#039;&lt;br /&gt;
* Cadeia de caracteres (literal): &#039;&#039;&#039;string s = &amp;quot;olá&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
* Cadeia de caracteres (literais): &#039;&#039;&#039;string s = &amp;quot;olá&amp;quot; &amp;quot;mãe&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
* Ponteiro (literal): &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;[[[real]]] p&amp;lt;/nowiki&amp;gt; = null&#039;&#039;&#039;&lt;br /&gt;
* Ponteiro (expressão): &#039;&#039;&#039;[int] p = q + 1&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;!--* Função:&lt;br /&gt;
 int&amp;lt;int&amp;gt; f1&lt;br /&gt;
 int&amp;lt;real&amp;gt; g1&lt;br /&gt;
 real&amp;lt;int&amp;gt; g2&lt;br /&gt;
 int&amp;lt;int&amp;gt; f2 = f1  // ok: mesmo tipo&lt;br /&gt;
 f2 = g1 // ok: tipos covariantes&lt;br /&gt;
 f2 = g2 // ERRADO&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Funções =&lt;br /&gt;
&lt;br /&gt;
Uma função permite agrupar um conjunto de instruções num corpo, executado com base num conjunto de parâmetros (os argumentos formais), quando é invocada a partir de uma expressão.&lt;br /&gt;
&lt;br /&gt;
== Declaração ==&lt;br /&gt;
&lt;br /&gt;
As funções têm um nome que é também o endereço dessa função. O tipo de retorno de uma função que não produz valores de retorno é &#039;&#039;&#039;void&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
As funções que recebam argumentos devem indicá-los no cabeçalho. Funções sem argumentos definem um cabeçalho vazio. Os qualificadores de exportação/importação &#039;&#039;&#039;public&#039;&#039;&#039; ou &#039;&#039;&#039;forward&#039;&#039;&#039; (ver símbolos globais) podem ser aplicados às funções, mas não é possível aplicá-los às declarações dos argumentos de uma função. Não é possível especificar valores por omissão para os argumentos de uma função, nem para o valor de retorno.&lt;br /&gt;
&lt;br /&gt;
A declaração de um ponteiro para uma função (ou, de forma equivalente, do seu nome) é utilizada para caracterizar um identificador exterior ou para efectuar declarações antecipadas (utilizadas para pré-declarar funções que sejam usadas antes de ser definidas, por exemplo, entre duas funções mutuamente recursivas). &amp;lt;!--Caso a declaração tenha corpo, define-se uma nova função.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Invocação ==&lt;br /&gt;
&lt;br /&gt;
Uma função pode ser invocada através do seu nome. &amp;lt;!--ou de um ponteiro do tipo apropriado que refira essa função (ponteiro não nulo). O símbolo &#039;&#039;&#039;@&#039;&#039;&#039; pode ser usado dentro da própria função para efectuar uma invocação recursiva. Não é possível o uso de &#039;&#039;&#039;@&#039;&#039;&#039; no programa principal.--&amp;gt;&lt;br /&gt;
Se existirem argumentos, na invocação da função, o nome é seguido de uma lista de expressões delimitadas por parênteses curvos. Esta lista é uma sequência, possivelmente vazia, de expressões separadas por vírgulas. O número e tipo de parâmetros actuais deve ser igual ao número e tipo dos parâmetros formais da função invocada (a menos de conversões implícitas). A ordem dos parâmetros actuais deverá ser a mesma dos argumentos formais da função a ser invocada.&lt;br /&gt;
&lt;br /&gt;
De acordo com a convenção Cdecl, a função chamadora coloca os argumentos na pilha e é responsável pela sua remoção, após o retorno da chamada. Assim, os parâmetros actuais devem ser colocados na pilha pela ordem inversa da sua declaração (i.e., são avaliados da direita para a esquerda antes da invocação da função e o resultado passado por cópia/valor). O endereço de retorno é colocado no topo da pilha pela chamada à função. Note que o retorno de entidades com dimensão superior a 64 bits deve fazer-se através da reserva de espaço para o retorno no chamador e passando um ponteiro para esse espaço como primeiro argumento do chamado.&lt;br /&gt;
&lt;br /&gt;
== Corpo ==&lt;br /&gt;
&lt;br /&gt;
O corpo de uma função consiste num bloco que contém declarações (opcionais) seguidas de instruções (opcionais). Não é possível aplicar os qualificadores de exportação (&#039;&#039;&#039;public&#039;&#039;&#039;) ou de importação (&#039;&#039;&#039;forward&#039;&#039;&#039; ou &#039;&#039;&#039;extern&#039;&#039;&#039;) (ver [[#Símbolos globais|símbolos globais]]) dentro do corpo de uma função.&lt;br /&gt;
&lt;br /&gt;
Uma instrução &#039;&#039;&#039;return&#039;&#039;&#039; causa a interrupção da função. O valor devolvido por uma função, através de expressão usada como argumento da instrução &#039;&#039;&#039;return&#039;&#039;&#039;, deve ser do tipo declarado no cabeçalho da função. Ver casos especiais acima.&lt;br /&gt;
&lt;br /&gt;
É um erro especificar um valor de retorno se a função for declarada como não retornando um valor (indicada como &#039;&#039;&#039;void&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Qualquer bloco (usado, por exemplo, numa instrução condicional ou de iteração) pode definir variáveis locais. &amp;lt;!--, cujos valores podem ser outras funções. Funções definidas dentro de um bloco não têm acesso às variáveis em contexto na função actual onde ocorrem.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Função principal e execução de programas ==&lt;br /&gt;
&lt;br /&gt;
Um programa é a sequência de instruções que seguem as declarações globais num ficheiro, delimitadas pelas palavras-chave &#039;&#039;&#039;begin&#039;&#039;&#039; e &#039;&#039;&#039;end&#039;&#039;&#039;. Esta sequência forma o que em algumas linguagens se chama a função principal. Os argumentos com que o programa foi chamado podem ser obtidos através de funções &#039;&#039;&#039;argc&#039;&#039;&#039; (devolve o número de argumentos); &#039;&#039;&#039;argv&#039;&#039;&#039; (devolve o n-ésimo argumento como uma cadeia de caracteres, com n&amp;gt;0); e &#039;&#039;&#039;envp&#039;&#039;&#039; (devolve a n-ésima variável de ambiente como uma cadeia de caracteres, com n&amp;gt;0). Apenas um dos módulos do programa pode definir a função principal, i.e., se existirem vários módulos, apenas um deles pode conter mais do que declarações de variáveis globais.&lt;br /&gt;
&lt;br /&gt;
 extern int&amp;lt;&amp;gt; argc&lt;br /&gt;
 extern string&amp;lt;int&amp;gt; argv&lt;br /&gt;
 extern string&amp;lt;int&amp;gt; envp&lt;br /&gt;
&lt;br /&gt;
O valor de retorno da função principal é devolvido ao ambiente que invocou o programa. Este valor de retorno segue as seguintes regras (sistema operativo): 0 (zero), execução sem erros; 1 (um), argumentos inválidos (em número ou valor); 2 (dois), erro de execução. Os valores superiores a 128 indicam que o programa terminou com um sinal. Em geral, para correcto funcionamento, os programas devem devolver 0 (zero) se a execução foi bem-sucedida e um valor diferente de 0 (zero) em caso de erro.&lt;br /&gt;
&lt;br /&gt;
A biblioteca de run-time (RTS) contém informação sobre outras funções de suporte disponíveis, incluindo chamadas ao sistema (ver também o manual da RTS).&lt;br /&gt;
&lt;br /&gt;
= Instruções =&lt;br /&gt;
&lt;br /&gt;
Excepto quando indicado, as instruções são executadas em sequência.&lt;br /&gt;
&lt;br /&gt;
== Blocos ==&lt;br /&gt;
&lt;br /&gt;
Cada bloco tem uma zona de declarações de variáveis locais (facultativa), seguida por uma zona com instruções (possivelmente vazia). Não é possível definir funções dentro de blocos, mas é possível declarar ponteiros de função locais.&lt;br /&gt;
&lt;br /&gt;
A visibilidade das variáveis é limitada ao bloco em que foram declaradas. As entidades declaradas podem ser directamente utilizadas em sub-blocos ou passadas como argumentos para funções chamadas dentro do bloco. Caso os identificadores usados para definir as variáveis locais já estejam a ser utilizados para definir outras entidades ao alcance do bloco, o novo identificador passa a referir uma nova entidade definida no bloco até que ele termine (a entidade previamente definida continua a existir, mas não pode ser directamente referida pelo seu nome). Esta regra é também válida relativamente a&lt;br /&gt;
argumentos de funções (ver corpo das funções).&lt;br /&gt;
&lt;br /&gt;
== Instrução condicional ==&lt;br /&gt;
&lt;br /&gt;
Esta instrução tem comportamento semelhante ao da instrução &#039;&#039;&#039;if-else&#039;&#039;&#039; em C. As partes correspondentes a &#039;&#039;&#039;elif&#039;&#039;&#039; comportam-se como encadeamentos de instruções condicionais na parte &#039;&#039;&#039;else&#039;&#039;&#039; de um &#039;&#039;&#039;if-else&#039;&#039;&#039; à la C.&lt;br /&gt;
&lt;br /&gt;
== Instrução de iteração ==&lt;br /&gt;
&lt;br /&gt;
Esta instrução tem comportamento idêntico ao da instrução &#039;&#039;&#039;while&#039;&#039;&#039; em C.&lt;br /&gt;
&lt;br /&gt;
== Instrução de terminação ==&lt;br /&gt;
&lt;br /&gt;
A instrução &#039;&#039;&#039;stop&#039;&#039;&#039; termina o n-ésimo ciclo mais interior em que a instrução se encontrar (quando o argumento é omitido, assume-se &#039;&#039;&#039;n=1&#039;&#039;&#039;), tal como a instrução &#039;&#039;&#039;break&#039;&#039;&#039; em C. Esta instrução só pode existir dentro de um ciclo, sendo a última instrução do seu bloco.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que, tal como na restante aritmética de ponteiros, o valor inteiro, neste caso, corresponde a uma entidade binária com 32 bits.}}&lt;br /&gt;
&lt;br /&gt;
== Instrução de continuação ==&lt;br /&gt;
&lt;br /&gt;
A instrução &#039;&#039;&#039;next&#039;&#039;&#039; reinicia o n-ésimo ciclo mais interior em que a instrução se encontrar (quando o argumento é omitido, assume-se &#039;&#039;&#039;n=1&#039;&#039;&#039;), tal como a instrução &#039;&#039;&#039;continue&#039;&#039;&#039; em C. Esta instrução só pode existir dentro de um ciclo, sendo a última instrução do seu bloco.&lt;br /&gt;
&lt;br /&gt;
{{Suggestion|Note-se que, tal como na restante aritmética de ponteiros, o valor inteiro, neste caso, corresponde a uma entidade binária com 32 bits.}}&lt;br /&gt;
&lt;br /&gt;
== Instrução de retorno ==&lt;br /&gt;
&lt;br /&gt;
A instrução &#039;&#039;&#039;return&#039;&#039;&#039;, se existir, é a última instrução do seu bloco. Ver comportamento na [[#Corpo|descrição do corpo de uma função]].&lt;br /&gt;
&lt;br /&gt;
== Expressões como instruções ==&lt;br /&gt;
&lt;br /&gt;
As expressões utilizadas como instruções são sempre avaliadas, mesmo que não produzam efeitos secundários.&lt;br /&gt;
&lt;br /&gt;
== Instruções de impressão ==&lt;br /&gt;
&lt;br /&gt;
As notações &#039;&#039;&#039;!&#039;&#039;&#039; e &#039;&#039;&#039;!!&#039;&#039;&#039; podem ser utilizadas para apresentar valores na saída do programa. A primeira forma apresenta os valores sem mudar de linha; a segunda forma apresenta os valores mudando de linha depois de os apresentar a todos. Quando existe mais de uma expressão, as várias expressões são apresentadas sem separação. Valores numéricos (inteiros ou reais) são impressos em decimal. As cadeias de caracteres são impressas na codificação nativa. Ponteiros não podem ser impressos.&lt;br /&gt;
&lt;br /&gt;
= Expressões =&lt;br /&gt;
&lt;br /&gt;
Uma expressão é uma representação algébrica de uma quantidade: todas as expressões têm um tipo e devolvem um valor.&lt;br /&gt;
&lt;br /&gt;
Existem [[#Expressões primitivas|expressões primitivas]] e expressões que resultam da [[#Expressões resultantes de avaliação de operadores|avaliação de operadores]].&lt;br /&gt;
&lt;br /&gt;
A tabela seguinte apresenta as precedências relativas dos operadores: é a mesma para operadores na mesma linha, sendo as linhas seguintes de menor prioridade que as anteriores. A maioria dos operadores segue a semântica da linguagem C (excepto onde explicitamente indicado). &lt;br /&gt;
&lt;br /&gt;
Algumas instruções, como if-else e while, esperam condições binárias: nestes casos, os valores lógicos ternários podem ser avaliados, à la C, como &amp;quot;verdade&amp;quot; (mapeamento directo da condição verdadeira ternária) e &amp;quot;não verdadeiro&amp;quot; (i.e., os outros dois casos ternários). Ou seja, valores lógicos ternários menores ou iguais a zero são considerados falsos e os positivos são considerados verdadeiros. Ver casos de uso no compilador tritak (e.g. geração de código para o ciclo while).&lt;br /&gt;
&lt;br /&gt;
 {|&lt;br /&gt;
| &#039;&#039;&#039;Tipo de Expressão&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Operadores&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Associatividade&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Operandos&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Semântica&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| primária&lt;br /&gt;
| &#039;&#039;&#039;( ) [ ]&#039;&#039;&#039;&lt;br /&gt;
| não associativos&lt;br /&gt;
| -&lt;br /&gt;
| [[#Parênteses curvos|parênteses curvos]], [[#Indexação|indexação]], [[#Reserva de memória|reserva de memória]]&lt;br /&gt;
|-&lt;br /&gt;
| unária&lt;br /&gt;
| &#039;&#039;&#039;+ - ?&#039;&#039;&#039;&lt;br /&gt;
| não associativos&lt;br /&gt;
| -&lt;br /&gt;
| [[#Identidade e simétrico|identidade e simétrico]], [[#Expressão de indicação de posição|indicação de posição]]&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &amp;quot;não&amp;quot; lógico&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;~&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | não associativo&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | inteiros&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | Lógica de Kleene: negação&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | multiplicativa&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;* / %&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | da esquerda para a direita&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | inteiros, reais&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | análoga à do C (% é apenas para inteiros), mas para entidades ternárias&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | aditiva&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;+ -&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | da esquerda para a direita&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | inteiros, reais, ponteiros&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | análoga à do C (% é apenas para inteiros), mas para entidades ternárias: se envolverem ponteiros, calculam: (i) deslocamentos, i.e., um dos operandos deve ser do tipo ponteiro e o outro do tipo inteiro (binário de 32 bits); (ii) diferenças de ponteiros, i.e., apenas quando se aplica o operador &#039;&#039;&#039;-&#039;&#039;&#039; a dois ponteiros do mesmo tipo (o resultado é o número de objectos do tipo apontado entre eles, representado como um valor inteiro ternário de 64 bits). Se a memória não for contígua, o resultado é indefinido.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | comparativa&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;&amp;lt; &amp;gt; &amp;lt;= &amp;gt;=&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | da esquerda para a direita&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | inteiros, reais&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | análoga à do C, mas para entidades ternárias&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | igualdade&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;== !=&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | da esquerda para a direita&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | inteiros, reais, ponteiros&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | análoga à do C, mas para entidades ternárias&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &amp;quot;e&amp;quot; lógico&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;&amp;amp;&amp;amp;&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | da esquerda para a direita&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | inteiros&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | Lógica de Kleene: o 2º argumento só é avaliado se o 1º não for falso.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &amp;quot;ou&amp;quot; lógico&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | da esquerda para a direita&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | inteiros&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | Lógica de Kleene: o 2º argumento só é avaliado se o 1º não for verdadeiro.&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | atribuição&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | &#039;&#039;&#039;=&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | da direita para a esquerda&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | todos os tipos&lt;br /&gt;
! style=&amp;quot;vertical-align: top; font-weight: normal;&amp;quot; | O valor da expressão do lado direito do operador é guardado na posição indicada pelo &#039;&#039;left-value&#039;&#039; (operando esquerdo do operador). Podem ser atribuídos valores inteiros a &#039;&#039;left-values&#039;&#039; reais (conversão automática). Nos outros casos, ambos os tipos têm de concordar. O literal &#039;&#039;&#039;null&#039;&#039;&#039; é compatível com todos os tipos de ponteiros.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Expressões primitivas ==&lt;br /&gt;
&lt;br /&gt;
As [[#Literais|expressões literais]] e a [[#Invocação|invocação de funções]] foram definidas acima.&lt;br /&gt;
&lt;br /&gt;
=== Identificadores ===&lt;br /&gt;
&lt;br /&gt;
Um identificador é uma expressão se tiver sido declarado. Um identificador pode denotar uma variável.&lt;br /&gt;
&lt;br /&gt;
Um identificador é o caso mais simples de um &#039;&#039;[[#Left-values|left-value]]&#039;&#039;, ou seja, uma entidade que pode ser utilizada no lado esquerdo (&#039;&#039;left&#039;&#039;) de uma atribuição.&lt;br /&gt;
&lt;br /&gt;
=== Leitura ===&lt;br /&gt;
&lt;br /&gt;
A operação de leitura de um valor inteiro ou real pode ser efectuado pela expressão indicada pela palavra-chave &#039;&#039;&#039;input&#039;&#039;&#039;, que devolve o valor lido, de acordo com o tipo esperado (inteiro ou real). Caso se use como argumento dos operadores de impressão ou noutras situações que permitam vários tipos (e.g. &#039;&#039;&#039;!&#039;&#039;&#039; ou &#039;&#039;&#039;!!&#039;&#039;&#039;), deve ser lido um inteiro.&lt;br /&gt;
&lt;br /&gt;
Exemplos:  &#039;&#039;&#039;a = input&#039;&#039;&#039; (leitura para &#039;&#039;&#039;a&#039;&#039;&#039;), &#039;&#039;&#039;f(input)&#039;&#039;&#039; (leitura para argumento de função), &#039;&#039;&#039;input!!&#039;&#039;&#039; (leitura e impressão).&lt;br /&gt;
&lt;br /&gt;
=== Parênteses curvos ===&lt;br /&gt;
&lt;br /&gt;
Uma expressão entre parênteses curvos tem o valor da expressão sem os parênteses e permite alterar a prioridade dos operadores. Uma expressão entre parênteses não pode ser utilizada como &#039;&#039;left-value&#039;&#039; (ver também a [[#Indexação|expressão de indexação]]).&lt;br /&gt;
&amp;lt;!--=== Funções ===&lt;br /&gt;
&lt;br /&gt;
As funções (ponteiros ou o seu código: não confundir com chamadas a funções) podem ser usadas como expressões tipificadas como funções, i.e., ponteiros para funções (mesmo quando não se usa explicitamente um ponteiro).&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 f1(int i) -&amp;gt; int { return i + 1; }&lt;br /&gt;
 f2(int i) -&amp;gt; int { return i * 2; }&lt;br /&gt;
&lt;br /&gt;
 g(int n, int&amp;lt;int&amp;gt; fun) -&amp;gt; int { return fun(n); }&lt;br /&gt;
 &lt;br /&gt;
 begin&lt;br /&gt;
   g(3, f1)!!  // escreve 4&lt;br /&gt;
   g(3, f2)!!  // escreve 6&lt;br /&gt;
 end&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Expressões resultantes de avaliação de operadores ==&lt;br /&gt;
&lt;br /&gt;
=== Indexação de ponteiros ===&lt;br /&gt;
&lt;br /&gt;
A indexação de ponteiros devolve o valor de uma posição de memória indicada por um ponteiro. Consiste em uma expressão ponteiro seguida do índice entre parênteses rectos. O resultado de uma indexação de ponteiros é um &#039;&#039;[[#Left-values|left-value]]&#039;&#039;. Não é possível indexar ponteiros que designem funções.&lt;br /&gt;
&lt;br /&gt;
Exemplo (acesso à posição 0 da zona de memória indicada por &#039;&#039;&#039;p&#039;&#039;&#039;): &#039;&#039;&#039;p[0]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Identidade e simétrico ===&lt;br /&gt;
&lt;br /&gt;
Os operadores identidade (&#039;&#039;&#039;+&#039;&#039;&#039;) e simétrico (&#039;&#039;&#039;-&#039;&#039;&#039;) aplicam-se a inteiros e reais. Têm o mesmo significado que em análogo às operações correspondentes em C, mas operam sobre grandezas ternárias.&lt;br /&gt;
&lt;br /&gt;
=== Reserva de memória ===&lt;br /&gt;
&lt;br /&gt;
A expressão reserva de memória devolve o ponteiro que aponta para a zona de memória, na pilha da função actual, contendo espaço suficiente para o número de objectos indicados pelo seu argumento inteiro.&lt;br /&gt;
&lt;br /&gt;
Exemplo (reserva vector com 5 reais, apontados por &#039;&#039;&#039;p&#039;&#039;&#039;): &#039;&#039;&#039;[real] p = [5]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Expressão de indicação de posição ===&lt;br /&gt;
&lt;br /&gt;
O operador sufixo &#039;&#039;&#039;?&#039;&#039;&#039; aplica-se a &#039;&#039;left-values&#039;&#039;, retornando o endereço (com o tipo ponteiro) correspondente.&lt;br /&gt;
&lt;br /&gt;
Exemplo (indica o endereço de &#039;&#039;&#039;a&#039;&#039;&#039;): &#039;&#039;&#039;a?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Expressão de dimensão ===&lt;br /&gt;
&lt;br /&gt;
O operador &#039;&#039;&#039;sizeof&#039;&#039;&#039; tem um único argumento e aplica-se a expressões, retornando a dimensão correspondente em bytes.&lt;br /&gt;
&lt;br /&gt;
Exemplo: &#039;&#039;&#039;sizeof(a)&#039;&#039;&#039; (dimensão de &#039;&#039;&#039;a&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
= Exemplos e Testes =&lt;br /&gt;
&lt;br /&gt;
Os exemplos abaixo não são exaustivos e não ilustram todos os aspectos da linguagem.&lt;br /&gt;
&lt;br /&gt;
Estão ainda disponíveis outros [https://gitlab.rnl.tecnico.ulisboa.pt/leic-a-co26/eval/co26 pacotes de testes].&lt;br /&gt;
&lt;br /&gt;
O seguinte exemplo ilustra um programa com dois módulos: um que define a função &#039;&#039;&#039;factorial&#039;&#039;&#039; e outro que define a função principal.&lt;br /&gt;
&lt;br /&gt;
Definição da função &#039;&#039;&#039;factorial&#039;&#039;&#039; no ficheiro &#039;&#039;&#039;factorial.p6&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
public factorial(int n) -&amp;gt; int {&lt;br /&gt;
  if (n &amp;gt; 1) &lt;br /&gt;
    return n * factorial(n - 1);&lt;br /&gt;
  else &lt;br /&gt;
    return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplo da utilização da função &#039;&#039;&#039;factorial&#039;&#039;&#039; no ficheiro &#039;&#039;&#039;main.p6&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
// external builtin functions (non-P6)&lt;br /&gt;
extern int&amp;lt;&amp;gt; argc;&lt;br /&gt;
extern string&amp;lt;int&amp;gt; argv;&lt;br /&gt;
extern int&amp;lt;string&amp;gt; atoi;&lt;br /&gt;
&lt;br /&gt;
// external user functions (P6)&lt;br /&gt;
forward int&amp;lt;int&amp;gt; factorial;&lt;br /&gt;
&lt;br /&gt;
// the main function&lt;br /&gt;
begin&lt;br /&gt;
  auto value = 1;&lt;br /&gt;
  &amp;quot;Teste para a função factorial.&amp;quot;!!&lt;br /&gt;
  if (argc() == 2) {&lt;br /&gt;
    string s = argv(1);&lt;br /&gt;
    value = atoi(s);&lt;br /&gt;
  }&lt;br /&gt;
  value, &amp;quot;! é &amp;quot;, factorial(value)!!&lt;br /&gt;
  return 0;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como compilar:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
p6 --target asm factorial.p6&lt;br /&gt;
p6 --target asm main.p6&lt;br /&gt;
yasm -felf32 factorial.asm&lt;br /&gt;
yasm -felf32 main.asm&lt;br /&gt;
ld -melf_i386 -o main factorial.o main.o -lrts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Omissões e Erros =&lt;br /&gt;
&lt;br /&gt;
Casos omissos e erros serão corrigidos em futuras versões do manual de referência.&lt;br /&gt;
&lt;br /&gt;
[[category:Projecto de Compiladores]]&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_08&amp;diff=17825</id>
		<title>Optimization Topics/Exercise 08</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_08&amp;diff=17825"/>
		<updated>2026-06-02T07:50:47Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Código Postfix (não optimizado) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere a seguinte função em C:&lt;br /&gt;
# Que optimizações independentes da máquina são possíveis?&lt;br /&gt;
# Traduza-a para Postfix optimizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double *fun(double *a, double *b) {&lt;br /&gt;
  double *c = (double *)malloc(2 * 8);&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i = 0; i &amp;lt; (len &amp;lt; 2 ? len : 2); i++)&lt;br /&gt;
    c[i] = a[i] + b[i];&lt;br /&gt;
  return c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Código Postfix|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;; BB1 START&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL fun, FUNC&lt;br /&gt;
LABEL fun&lt;br /&gt;
ENTER 8  ; c@-4 i@-8 a@+8 b@+12 len@+16&lt;br /&gt;
INT 2&lt;br /&gt;
INT 8&lt;br /&gt;
MUL&lt;br /&gt;
CALL malloc&lt;br /&gt;
;; BB1 END&lt;br /&gt;
&lt;br /&gt;
;; BB2 START&lt;br /&gt;
TRASH 4&lt;br /&gt;
LDFVAL32I  ; malloc result (no conversion necessary)&lt;br /&gt;
LOCAL -4  ; &amp;amp;c&lt;br /&gt;
STINT  ; c = ...&lt;br /&gt;
&lt;br /&gt;
INT 0&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8  ; &amp;amp;i&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
;; BB2 END&lt;br /&gt;
&lt;br /&gt;
;; BB3 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL fortest&lt;br /&gt;
&lt;br /&gt;
LOCAL -8 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDINT  ; len&lt;br /&gt;
INT 2&lt;br /&gt;
LT&lt;br /&gt;
JZ op3else&lt;br /&gt;
;; BB3 END&lt;br /&gt;
&lt;br /&gt;
;; BB4 START&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDINT ; len&lt;br /&gt;
JMP op3end&lt;br /&gt;
;; BB4 END&lt;br /&gt;
&lt;br /&gt;
;; BB5 START&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL op3else&lt;br /&gt;
INT 2&lt;br /&gt;
;; BB5 END&lt;br /&gt;
&lt;br /&gt;
;; BB6 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL op3end&lt;br /&gt;
&lt;br /&gt;
LT&lt;br /&gt;
JZ forend&lt;br /&gt;
;; BB6 END&lt;br /&gt;
&lt;br /&gt;
;; BB7 START&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDINT   ; a&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;a[i]&lt;br /&gt;
LDDOUBLE  ; a[i]&lt;br /&gt;
&lt;br /&gt;
LOCAL +12&lt;br /&gt;
LDINT   ; b&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;b[i]&lt;br /&gt;
LDDOUBLE  ; b[i]&lt;br /&gt;
&lt;br /&gt;
DADD  ; a[i] + b[i]&lt;br /&gt;
DUP64&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT   ; c&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;c[i]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE&lt;br /&gt;
TRASH 8&lt;br /&gt;
;; BB7 END&lt;br /&gt;
&lt;br /&gt;
;; BB8 START&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL forincr&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT  ; i&lt;br /&gt;
DUP32&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
LOCAL -8&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
&lt;br /&gt;
JMP fortest&lt;br /&gt;
;; BB8 END&lt;br /&gt;
&lt;br /&gt;
;; BB9 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL forend&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
;; BB9 END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura Intel de 32 bits -- ix86):&lt;br /&gt;
&lt;br /&gt;
 pf2asm code.pf&lt;br /&gt;
 yasm -felf32 code.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_08&amp;diff=17824</id>
		<title>Optimization Topics/Exercise 08</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_08&amp;diff=17824"/>
		<updated>2026-06-02T07:48:24Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Código Postfix (não optimizado) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere a seguinte função em C:&lt;br /&gt;
# Que optimizações independentes da máquina são possíveis?&lt;br /&gt;
# Traduza-a para Postfix optimizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double *fun(double *a, double *b) {&lt;br /&gt;
  double *c = (double *)malloc(2 * 8);&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i = 0; i &amp;lt; (len &amp;lt; 2 ? len : 2); i++)&lt;br /&gt;
    c[i] = a[i] + b[i];&lt;br /&gt;
  return c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Código Postfix|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;; BB1 START&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL fun, FUNC&lt;br /&gt;
LABEL fun&lt;br /&gt;
ENTER 8  ; c@-4 i@-8 a@+8 b@+12 len@+16&lt;br /&gt;
INT 2&lt;br /&gt;
INT 8&lt;br /&gt;
MUL&lt;br /&gt;
CALL malloc&lt;br /&gt;
;; BB1 END&lt;br /&gt;
&lt;br /&gt;
;; BB2 START&lt;br /&gt;
TRASH 4&lt;br /&gt;
LDFVAL32I  ; malloc result (no conversion necessary)&lt;br /&gt;
LOCAL -4  ; &amp;amp;c&lt;br /&gt;
STINT  ; c = ...&lt;br /&gt;
&lt;br /&gt;
INT 0&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8  ; &amp;amp;i&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
;; BB2 END&lt;br /&gt;
&lt;br /&gt;
;; BB3 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL fortest&lt;br /&gt;
&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDINT  ; len&lt;br /&gt;
INT 2&lt;br /&gt;
LT&lt;br /&gt;
JZ op3else&lt;br /&gt;
;; BB3 END&lt;br /&gt;
&lt;br /&gt;
;; BB4 START&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDINT ; len&lt;br /&gt;
JMP op3end&lt;br /&gt;
;; BB4 END&lt;br /&gt;
&lt;br /&gt;
;; BB5 START&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL op3else&lt;br /&gt;
INT 2&lt;br /&gt;
;; BB5 END&lt;br /&gt;
&lt;br /&gt;
;; BB6 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL op3end&lt;br /&gt;
&lt;br /&gt;
LT&lt;br /&gt;
JZ forend&lt;br /&gt;
;; BB6 END&lt;br /&gt;
&lt;br /&gt;
;; BB7 START&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDINT   ; a&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;a[i]&lt;br /&gt;
LDDOUBLE  ; a[i]&lt;br /&gt;
&lt;br /&gt;
LOCAL +12&lt;br /&gt;
LDINT   ; b&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;b[i]&lt;br /&gt;
LDDOUBLE  ; b[i]&lt;br /&gt;
&lt;br /&gt;
DADD  ; a[i] + b[i]&lt;br /&gt;
DUP64&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT   ; c&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;c[i]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE&lt;br /&gt;
TRASH 8&lt;br /&gt;
;; BB7 END&lt;br /&gt;
&lt;br /&gt;
;; BB8 START&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL forincr&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT  ; i&lt;br /&gt;
DUP32&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
LOCAL -8&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
&lt;br /&gt;
JMP fortest&lt;br /&gt;
;; BB8 END&lt;br /&gt;
&lt;br /&gt;
;; BB9 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL forend&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
;; BB9 END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura Intel de 32 bits -- ix86):&lt;br /&gt;
&lt;br /&gt;
 pf2asm code.pf&lt;br /&gt;
 yasm -felf32 code.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Code_Generation/Exercise_11&amp;diff=17823</id>
		<title>Code Generation/Exercise 11</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Code_Generation/Exercise_11&amp;diff=17823"/>
		<updated>2026-06-01T22:44:23Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Problema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere o seguinte código C++ (assuma que ponteiros e   &#039;&#039;&#039;int&#039;&#039;&#039; ocupam 32 bits e que &#039;&#039;&#039;double&#039;&#039;&#039; ocupa 64 bits).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double *forall(double *v) {&lt;br /&gt;
  const static int limit = 1024;&lt;br /&gt;
  for (int i = 0; i &amp;lt; limit; i++) {&lt;br /&gt;
    v[i] = 3 * i – sizeof(double);&lt;br /&gt;
    if (v[i] &amp;gt; 2 * i) v[i] = limit;&lt;br /&gt;
  }&lt;br /&gt;
  return v;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente à função é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
No código Postfix, &#039;&#039;&#039;BB#&#039;&#039;&#039; significa &amp;quot;[[Optimization Topics|bloco básico]] número&amp;quot;.&lt;br /&gt;
{{CollapsedCode|Postfix code|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL forall, FUNC&lt;br /&gt;
LABEL forall&lt;br /&gt;
ENTER 4  ; i@-4 v@+8&lt;br /&gt;
&lt;br /&gt;
; define &amp;quot;limit&amp;quot; (this is not an assignment)&lt;br /&gt;
RODATA&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL limit ; not really this name&lt;br /&gt;
SINT 1024&lt;br /&gt;
; done - go back to code segment&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
&lt;br /&gt;
; initialize for-loop control variable (again, not an assignment)&lt;br /&gt;
INT 0&lt;br /&gt;
LOCAL -4&lt;br /&gt;
STINT ; i = 0&lt;br /&gt;
&lt;br /&gt;
; for-loop test&lt;br /&gt;
LABEL fortest&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT ; i&lt;br /&gt;
ADDR limit&lt;br /&gt;
LDINT ; limit&lt;br /&gt;
LT ; i&amp;lt;limit&lt;br /&gt;
JZ forend&lt;br /&gt;
&lt;br /&gt;
; BEGIN for-loop body&lt;br /&gt;
&lt;br /&gt;
; BEGIN assignment to v[i]&lt;br /&gt;
&lt;br /&gt;
; compute and promote 3*i&lt;br /&gt;
INT 3&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
MUL&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
SUB&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
DUP64 ; implement assignment value&lt;br /&gt;
&lt;br /&gt;
; compute &amp;amp;v[i] == v+i*sizeof(double)&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;v[i]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE ; do assignment of double value&lt;br /&gt;
&lt;br /&gt;
TRASH 8 ; discard value of assignment&lt;br /&gt;
&lt;br /&gt;
; END assignment to v[i]&lt;br /&gt;
&lt;br /&gt;
; if condition&lt;br /&gt;
; compute &amp;amp;v[i] == v+i*sizeof(double)&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;v[i]&lt;br /&gt;
LDDOUBLE ; v[i]&lt;br /&gt;
&lt;br /&gt;
; compute and promote 2*i&lt;br /&gt;
INT 2&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
MUL&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
; compare&lt;br /&gt;
DCMP&lt;br /&gt;
INT 0&lt;br /&gt;
GT&lt;br /&gt;
&lt;br /&gt;
; jump to if end&lt;br /&gt;
JZ ifend&lt;br /&gt;
&lt;br /&gt;
; BEGIN if block&lt;br /&gt;
; do assignment (double)&lt;br /&gt;
&lt;br /&gt;
; load and promote &amp;quot;limit&amp;quot;&lt;br /&gt;
ADDR limit&lt;br /&gt;
LDINT&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
DUP64 ; implement assignment value&lt;br /&gt;
&lt;br /&gt;
; compute &amp;amp;v[i] == v+i*sizeof(double)&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;v[i]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE ; do  assignment of double value&lt;br /&gt;
&lt;br /&gt;
TRASH 8 ; discard value of assignment&lt;br /&gt;
&lt;br /&gt;
; END if block&lt;br /&gt;
LABEL ifend&lt;br /&gt;
&lt;br /&gt;
; FOR increment&lt;br /&gt;
LABEL forincr&lt;br /&gt;
&lt;br /&gt;
; increment expression&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
DUP32&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
&lt;br /&gt;
; END for-loop body&lt;br /&gt;
JMP fortest&lt;br /&gt;
LABEL forend&lt;br /&gt;
&lt;br /&gt;
; return *v&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura de 32 bits):&lt;br /&gt;
&lt;br /&gt;
 pf2asm forall.pf&lt;br /&gt;
 yasm -felf forall.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Code_Generation/Exercise_11&amp;diff=17822</id>
		<title>Code Generation/Exercise 11</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Code_Generation/Exercise_11&amp;diff=17822"/>
		<updated>2026-06-01T22:44:09Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Código Postfix (não optimizado) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere o seguinte código C++ (assuma que ponteiros e   &#039;&#039;&#039;int&#039;&#039;&#039; ocupam 32 bits e que &#039;&#039;&#039;double&#039;&#039;&#039; ocupa 64 bits).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double *forall(double *v) {&lt;br /&gt;
  const static int limit = 1024;&lt;br /&gt;
  for (int i = 0; i &amp;lt; limit; i++) {&lt;br /&gt;
    v[i] = 3 * i – sizeof(double);&lt;br /&gt;
    if (v[i] &amp;gt; 2 * i) v[i] = limit;&lt;br /&gt;
  }&lt;br /&gt;
  return v;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente à função é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
No código Postfix, &#039;&#039;&#039;BB#&#039;&#039;&#039; significa &amp;quot;[[Optimization Topics|bloco básico]] número&amp;quot;.&lt;br /&gt;
{{CollapsedCode|Postfix code|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL forall, FUNC&lt;br /&gt;
LABEL forall&lt;br /&gt;
ENTER 4  ; i@-4 v@+8&lt;br /&gt;
&lt;br /&gt;
; define &amp;quot;limit&amp;quot; (this is not an assignment)&lt;br /&gt;
RODATA&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL limit ; not really this name&lt;br /&gt;
SINT 1024&lt;br /&gt;
; done - go back to code segment&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
&lt;br /&gt;
; initialize for-loop control variable (again, not an assignment)&lt;br /&gt;
INT 0&lt;br /&gt;
LOCAL -4&lt;br /&gt;
STINT ; i = 0&lt;br /&gt;
&lt;br /&gt;
; for-loop test&lt;br /&gt;
LABEL fortest&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT ; i&lt;br /&gt;
ADDR limit&lt;br /&gt;
LDINT ; limit&lt;br /&gt;
LT ; i&amp;lt;limit&lt;br /&gt;
JZ forend&lt;br /&gt;
&lt;br /&gt;
; BEGIN for-loop body&lt;br /&gt;
&lt;br /&gt;
; BEGIN assignment to v[i]&lt;br /&gt;
&lt;br /&gt;
; compute and promote 3*i&lt;br /&gt;
INT 3&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
MUL&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
SUB&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
DUP64 ; implement assignment value&lt;br /&gt;
&lt;br /&gt;
; compute &amp;amp;v[i] == v+i*sizeof(double)&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;v[i]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE ; do assignment of double value&lt;br /&gt;
&lt;br /&gt;
TRASH 8 ; discard value of assignment&lt;br /&gt;
&lt;br /&gt;
; END assignment to v[i]&lt;br /&gt;
&lt;br /&gt;
; if condition&lt;br /&gt;
; compute &amp;amp;v[i] == v+i*sizeof(double)&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;v[i]&lt;br /&gt;
LDDOUBLE ; v[i]&lt;br /&gt;
&lt;br /&gt;
; compute and promote 2*i&lt;br /&gt;
INT 2&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
MUL&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
; compare&lt;br /&gt;
DCMP&lt;br /&gt;
INT 0&lt;br /&gt;
GT&lt;br /&gt;
&lt;br /&gt;
; jump to if end&lt;br /&gt;
JZ ifend&lt;br /&gt;
&lt;br /&gt;
; BEGIN if block&lt;br /&gt;
; do assignment (double)&lt;br /&gt;
&lt;br /&gt;
; load and promote &amp;quot;limit&amp;quot;&lt;br /&gt;
ADDR limit&lt;br /&gt;
LDINT&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
DUP64 ; implement assignment value&lt;br /&gt;
&lt;br /&gt;
; compute &amp;amp;v[i] == v+i*sizeof(double)&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;v[i]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE ; do  assignment of double value&lt;br /&gt;
&lt;br /&gt;
TRASH 8 ; discard value of assignment&lt;br /&gt;
&lt;br /&gt;
; END if block&lt;br /&gt;
LABEL ifend&lt;br /&gt;
&lt;br /&gt;
; FOR increment&lt;br /&gt;
LABEL forincr&lt;br /&gt;
&lt;br /&gt;
; increment expression&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
LDINT ; i&lt;br /&gt;
DUP32&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
LOCAL -4 ; &amp;amp;i&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
&lt;br /&gt;
; END for-loop body&lt;br /&gt;
JMP fortest&lt;br /&gt;
LABEL forend&lt;br /&gt;
&lt;br /&gt;
; return *v&lt;br /&gt;
LOCAL +8 ; &amp;amp;v&lt;br /&gt;
LDINT ; v&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura de 32 bits):&lt;br /&gt;
&lt;br /&gt;
 pf2asm forall.pf&lt;br /&gt;
 yasm -felf forall.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_09&amp;diff=17821</id>
		<title>Optimization Topics/Exercise 09</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_09&amp;diff=17821"/>
		<updated>2026-06-01T21:06:31Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere a seguinte função em C:&lt;br /&gt;
# Que optimizações independentes da máquina são possíveis?&lt;br /&gt;
# Traduza-a para Postfix optimizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double *fun(double *a, double *b) {&lt;br /&gt;
  double *c = (double *)malloc(160 * 4);&lt;br /&gt;
  int i, j;&lt;br /&gt;
  for (j = 0; j &amp;lt; 40; ++j)&lt;br /&gt;
    for (i = 0; i &amp;lt; 4; ++i)&lt;br /&gt;
      c[i+j*4] = a[i+j*4] + b[i*40+j] + 100*j;&lt;br /&gt;
  return c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Código Postfix|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;; BB1 START&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL fun, FUNC&lt;br /&gt;
LABEL fun&lt;br /&gt;
ENTER 12 ; c@-4 i@-8 j@-12 a@+8 b@+12&lt;br /&gt;
&lt;br /&gt;
INT 160&lt;br /&gt;
INT 4&lt;br /&gt;
MUL&lt;br /&gt;
CALL malloc&lt;br /&gt;
;; BB1 END&lt;br /&gt;
&lt;br /&gt;
;; BB2 START&lt;br /&gt;
TRASH 4&lt;br /&gt;
LDFVAL32  ; malloc result (no conversion necessary)&lt;br /&gt;
LOCAL -4  ; &amp;amp;c&lt;br /&gt;
STINT  ; c = ...&lt;br /&gt;
&lt;br /&gt;
INT 0&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -12  ; &amp;amp;j&lt;br /&gt;
STINT  ; j = 0&lt;br /&gt;
TRASH 4&lt;br /&gt;
;; BB2 END&lt;br /&gt;
&lt;br /&gt;
;; BB3 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL for1test&lt;br /&gt;
&lt;br /&gt;
LOCAL -12&lt;br /&gt;
LDINT ; j&lt;br /&gt;
INT 40&lt;br /&gt;
LT  ; j &amp;lt; 40&lt;br /&gt;
JZ for1end&lt;br /&gt;
;; BB3 END&lt;br /&gt;
&lt;br /&gt;
;; BB4 START&lt;br /&gt;
INT 0&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8  ; &amp;amp;i&lt;br /&gt;
STINT  ; i = 0&lt;br /&gt;
TRASH 4&lt;br /&gt;
;; BB4 END&lt;br /&gt;
&lt;br /&gt;
;; BB5 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL for2test&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 4&lt;br /&gt;
LT  ; i &amp;lt; 4&lt;br /&gt;
JZ for2end&lt;br /&gt;
;; BB5 END&lt;br /&gt;
&lt;br /&gt;
;; BB6 START&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDINT ; a&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT ; i&lt;br /&gt;
LOCAL -12 &lt;br /&gt;
LDINT ; j&lt;br /&gt;
INT 4&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; i+j*4&lt;br /&gt;
&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;a[...]&lt;br /&gt;
LDDOUBLE  ; a[...]&lt;br /&gt;
&lt;br /&gt;
LOCAL +12&lt;br /&gt;
LDINT ; b&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT ; i&lt;br /&gt;
INT 40&lt;br /&gt;
MUL&lt;br /&gt;
LOCAL -12&lt;br /&gt;
LDINT ; j&lt;br /&gt;
ADD  ; i*40+j&lt;br /&gt;
&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;b[...]&lt;br /&gt;
LDDOUBLE  ; b[...]&lt;br /&gt;
&lt;br /&gt;
DADD&lt;br /&gt;
&lt;br /&gt;
INT 100&lt;br /&gt;
LOCAL -12&lt;br /&gt;
LDINT  ; j&lt;br /&gt;
MUL  ; 100*j&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
DADD&lt;br /&gt;
DUP64&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT ; c&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT ; i&lt;br /&gt;
LOCAL -12 &lt;br /&gt;
LDINT ; j&lt;br /&gt;
INT 4&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; i+j*4&lt;br /&gt;
&lt;br /&gt;
INT 8 ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD ; &amp;amp;c[...]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE&lt;br /&gt;
TRASH 8&lt;br /&gt;
;; BB6 END&lt;br /&gt;
&lt;br /&gt;
;; BB7 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL for2incr&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8&lt;br /&gt;
STINT ; ++i&lt;br /&gt;
TRASH 4&lt;br /&gt;
&lt;br /&gt;
JMP for2test&lt;br /&gt;
;; BB7 END&lt;br /&gt;
&lt;br /&gt;
;; BB8 START&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL for2end&lt;br /&gt;
&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL for1incr&lt;br /&gt;
&lt;br /&gt;
LOCAL -12&lt;br /&gt;
LDINT&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -12&lt;br /&gt;
STINT ; ++j&lt;br /&gt;
TRASH 4&lt;br /&gt;
&lt;br /&gt;
JMP for1test&lt;br /&gt;
;; BB8 END&lt;br /&gt;
&lt;br /&gt;
;; BB9 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL for1end&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT ; c&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
;; BB9 END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura Intel de 32 bits -- ix86):&lt;br /&gt;
&lt;br /&gt;
 pf2asm code.pf&lt;br /&gt;
 yasm -felf32 code.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_08&amp;diff=17820</id>
		<title>Optimization Topics/Exercise 08</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_08&amp;diff=17820"/>
		<updated>2026-06-01T21:05:34Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere a seguinte função em C:&lt;br /&gt;
# Que optimizações independentes da máquina são possíveis?&lt;br /&gt;
# Traduza-a para Postfix optimizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
double *fun(double *a, double *b) {&lt;br /&gt;
  double *c = (double *)malloc(2 * 8);&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i = 0; i &amp;lt; (len &amp;lt; 2 ? len : 2); i++)&lt;br /&gt;
    c[i] = a[i] + b[i];&lt;br /&gt;
  return c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Código Postfix|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;; BB1 START&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL fun, FUNC&lt;br /&gt;
LABEL fun&lt;br /&gt;
ENTER 8  ; c@-4 i@-8 a@+8 b@+12 len@+16&lt;br /&gt;
INT 2&lt;br /&gt;
INT 8&lt;br /&gt;
MUL&lt;br /&gt;
CALL malloc&lt;br /&gt;
;; BB1 END&lt;br /&gt;
&lt;br /&gt;
;; BB2 START&lt;br /&gt;
TRASH 4&lt;br /&gt;
LDFVAL32  ; malloc result (no conversion necessary)&lt;br /&gt;
LOCAL -4  ; &amp;amp;c&lt;br /&gt;
STINT  ; c = ...&lt;br /&gt;
&lt;br /&gt;
INT 0&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8  ; &amp;amp;i&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
;; BB2 END&lt;br /&gt;
&lt;br /&gt;
;; BB3 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL fortest&lt;br /&gt;
&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDINT  ; len&lt;br /&gt;
INT 2&lt;br /&gt;
LT&lt;br /&gt;
JZ op3else&lt;br /&gt;
;; BB3 END&lt;br /&gt;
&lt;br /&gt;
;; BB4 START&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDINT ; len&lt;br /&gt;
JMP op3end&lt;br /&gt;
;; BB4 END&lt;br /&gt;
&lt;br /&gt;
;; BB5 START&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL op3else&lt;br /&gt;
INT 2&lt;br /&gt;
;; BB5 END&lt;br /&gt;
&lt;br /&gt;
;; BB6 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL op3end&lt;br /&gt;
&lt;br /&gt;
LT&lt;br /&gt;
JZ forend&lt;br /&gt;
;; BB6 END&lt;br /&gt;
&lt;br /&gt;
;; BB7 START&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDINT   ; a&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;a[i]&lt;br /&gt;
LDDOUBLE  ; a[i]&lt;br /&gt;
&lt;br /&gt;
LOCAL +12&lt;br /&gt;
LDINT   ; b&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;b[i]&lt;br /&gt;
LDDOUBLE  ; b[i]&lt;br /&gt;
&lt;br /&gt;
DADD  ; a[i] + b[i]&lt;br /&gt;
DUP64&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT   ; c&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT   ; i&lt;br /&gt;
INT 8  ; sizeof(double)&lt;br /&gt;
MUL&lt;br /&gt;
ADD  ; &amp;amp;c[i]&lt;br /&gt;
&lt;br /&gt;
STDOUBLE&lt;br /&gt;
TRASH 8&lt;br /&gt;
;; BB7 END&lt;br /&gt;
&lt;br /&gt;
;; BB8 START&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL forincr&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT  ; i&lt;br /&gt;
DUP32&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
LOCAL -8&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
&lt;br /&gt;
JMP fortest&lt;br /&gt;
;; BB8 END&lt;br /&gt;
&lt;br /&gt;
;; BB9 START&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL forend&lt;br /&gt;
&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
;; BB9 END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura Intel de 32 bits -- ix86):&lt;br /&gt;
&lt;br /&gt;
 pf2asm code.pf&lt;br /&gt;
 yasm -felf32 code.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_07&amp;diff=17819</id>
		<title>Optimization Topics/Exercise 07</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_07&amp;diff=17819"/>
		<updated>2026-06-01T21:04:52Z</updated>

		<summary type="html">&lt;p&gt;Root: /* Código Postfix (não optimizado) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere a seguinte função em C:&lt;br /&gt;
# Que optimizações independentes da máquina são possíveis?&lt;br /&gt;
# Traduza-a para Postfix optimizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int fun(double a, double b) {&lt;br /&gt;
  int i = 10, c;&lt;br /&gt;
  c = 20 * 1024 + i;&lt;br /&gt;
  while (++i &amp;lt; a + b) {&lt;br /&gt;
    if (a + b &amp;lt; 3 * i + 5) c += 2 * i;&lt;br /&gt;
  }&lt;br /&gt;
  return c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Código Postfix|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;;---- BB1 START ----&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL fun, FUNC&lt;br /&gt;
LABEL fun&lt;br /&gt;
ENTER 8   ; i@-4 c@-8 a@+8 b@+16&lt;br /&gt;
&lt;br /&gt;
INT 10&lt;br /&gt;
LOCA -4 ; i=10&lt;br /&gt;
&lt;br /&gt;
INT 20&lt;br /&gt;
INT 1024&lt;br /&gt;
MUL&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8&lt;br /&gt;
STINT ; c = ...&lt;br /&gt;
TRASH 4&lt;br /&gt;
;;---- BB1 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB2 START ----&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL while_test&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -4&lt;br /&gt;
STINT  ; ++i&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
DADD  ; a + b&lt;br /&gt;
&lt;br /&gt;
DCMP&lt;br /&gt;
INT 0&lt;br /&gt;
LT&lt;br /&gt;
JZ while_end&lt;br /&gt;
;;---- BB2 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB3 START ----&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
DADD  ; a + b&lt;br /&gt;
&lt;br /&gt;
INT 3&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
MUL&lt;br /&gt;
INT 5&lt;br /&gt;
ADD&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
DCMP&lt;br /&gt;
INT 0&lt;br /&gt;
LT&lt;br /&gt;
JZ ifend&lt;br /&gt;
;;---- BB3 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB4 START ----&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT ; c&lt;br /&gt;
INT 2&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
MUL ; 2 * i&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8  ; &amp;amp;c&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
;;---- BB4 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB5 START ----&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL ifend&lt;br /&gt;
&lt;br /&gt;
JMP while_test&lt;br /&gt;
;;---- BB5 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB6 START ----&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL while_end&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT  ; c&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
;;---- BB6 END ----&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura Intel de 32 bits -- ix86):&lt;br /&gt;
&lt;br /&gt;
 pf2asm code.pf&lt;br /&gt;
 yasm -felf32 code.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_07&amp;diff=17818</id>
		<title>Optimization Topics/Exercise 07</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_07&amp;diff=17818"/>
		<updated>2026-06-01T21:04:36Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Problema ==&lt;br /&gt;
&lt;br /&gt;
Considere a seguinte função em C:&lt;br /&gt;
# Que optimizações independentes da máquina são possíveis?&lt;br /&gt;
# Traduza-a para Postfix optimizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int fun(double a, double b) {&lt;br /&gt;
  int i = 10, c;&lt;br /&gt;
  c = 20 * 1024 + i;&lt;br /&gt;
  while (++i &amp;lt; a + b) {&lt;br /&gt;
    if (a + b &amp;lt; 3 * i + 5) c += 2 * i;&lt;br /&gt;
  }&lt;br /&gt;
  return c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código Postfix (não optimizado) ==&lt;br /&gt;
&lt;br /&gt;
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).&lt;br /&gt;
&lt;br /&gt;
{{CollapsedCode|Código Postfix|&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;;---- BB1 START ----&lt;br /&gt;
TEXT&lt;br /&gt;
ALIGN&lt;br /&gt;
GLOBAL fun, FUNC&lt;br /&gt;
LABEL fun&lt;br /&gt;
ENTER 8   ; i@-4 c@-8 a@+8 b@+16&lt;br /&gt;
&lt;br /&gt;
INT 10&lt;br /&gt;
LOCA -4 ; i=10&lt;br /&gt;
&lt;br /&gt;
INT 20&lt;br /&gt;
INT 1024&lt;br /&gt;
MUL&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8&lt;br /&gt;
STINT ; c = ...&lt;br /&gt;
TRASH 4&lt;br /&gt;
;;---- BB1 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB2 START ----&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL while_test&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
INT 1&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -4&lt;br /&gt;
STINT  ; ++i&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
DADD  ; a + b&lt;br /&gt;
&lt;br /&gt;
DCMP&lt;br /&gt;
INT 0&lt;br /&gt;
LT&lt;br /&gt;
JZ while_end&lt;br /&gt;
;;---- BB2 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB3 START ----&lt;br /&gt;
LOCAL +8&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
LOCAL +16&lt;br /&gt;
LDDOUBLE&lt;br /&gt;
DADD  ; a + b&lt;br /&gt;
&lt;br /&gt;
INT 3&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
MUL&lt;br /&gt;
INT 5&lt;br /&gt;
ADD&lt;br /&gt;
I2D&lt;br /&gt;
&lt;br /&gt;
DCMP&lt;br /&gt;
INT 0&lt;br /&gt;
LT&lt;br /&gt;
JZ ifend&lt;br /&gt;
;;---- BB3 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB4 START ----&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT ; c&lt;br /&gt;
INT 2&lt;br /&gt;
LOCAL -4&lt;br /&gt;
LDINT&lt;br /&gt;
MUL ; 2 * i&lt;br /&gt;
ADD&lt;br /&gt;
DUP32&lt;br /&gt;
LOCAL -8  ; &amp;amp;c&lt;br /&gt;
STINT&lt;br /&gt;
TRASH 4&lt;br /&gt;
;;---- BB4 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB5 START ----&lt;br /&gt;
ALIGN&lt;br /&gt;
LABEL ifend&lt;br /&gt;
&lt;br /&gt;
JMP while_test&lt;br /&gt;
;;---- BB5 END ----&lt;br /&gt;
&lt;br /&gt;
;;---- BB6 START ----&lt;br /&gt;
ALIGN &lt;br /&gt;
LABEL while_end&lt;br /&gt;
&lt;br /&gt;
LOCAL -8&lt;br /&gt;
LDINT  ; c&lt;br /&gt;
STFVAL32I&lt;br /&gt;
LEAVE&lt;br /&gt;
RET&lt;br /&gt;
;;---- BB6 END ----&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Compiling and Running ==&lt;br /&gt;
&lt;br /&gt;
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta [[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]] (assumindo uma arquitectura Intel de 32 bits -- ix86):&lt;br /&gt;
&lt;br /&gt;
 pf2asm code.pf&lt;br /&gt;
 yasm -felf32 code.asm&lt;br /&gt;
&lt;br /&gt;
[[category:Compiladores]]&lt;br /&gt;
[[category: Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_06&amp;diff=17817</id>
		<title>Optimization Topics/Exercise 06</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_06&amp;diff=17817"/>
		<updated>2026-06-01T21:04:00Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Considere a seguinte função em C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main() { &lt;br /&gt;
  int a[10], i = 1; &lt;br /&gt;
  a[0] = 0; &lt;br /&gt;
  while (i &amp;lt; 10)&lt;br /&gt;
    a[i++] = a[i-1] + 2 * i - 1; &lt;br /&gt;
  return 0; &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Identifique os blocos básicos. &lt;br /&gt;
# Que optimizações poderiam ser efectuadas?&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_04&amp;diff=17816</id>
		<title>Optimization Topics/Exercise 04</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Optimization_Topics/Exercise_04&amp;diff=17816"/>
		<updated>2026-06-01T21:03:27Z</updated>

		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Considere a seguinte função em C: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int find(int tab[], int max, int val) { &lt;br /&gt;
  int i; &lt;br /&gt;
  for (i = 0; i &amp;lt; max; i++) &lt;br /&gt;
    if (tab[i] == val) &lt;br /&gt;
      break; &lt;br /&gt;
  return i; &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Identifique as optimizações independentes da máquina que são possíveis. &lt;br /&gt;
# Traduza para código Postfix optimizado a função acima. &lt;br /&gt;
# Identifique os blocos básicos.&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>