<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cumbuca Dev</title>
    <description>The latest articles on DEV Community by Cumbuca Dev (@cumbucadev).</description>
    <link>https://dev.to/cumbucadev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3698971%2Ff3b85dd5-04c6-4446-b9ef-40c4fbf2290b.png</url>
      <title>DEV Community: Cumbuca Dev</title>
      <link>https://dev.to/cumbucadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cumbucadev"/>
    <language>en</language>
    <item>
      <title>Executando uma Linguagem Interpretada - Pituguês</title>
      <dc:creator>Cumbuca Dev</dc:creator>
      <pubDate>Wed, 29 Apr 2026 19:32:42 +0000</pubDate>
      <link>https://dev.to/cumbucadev/executando-uma-linguagem-interpretada-pitugues-4kd3</link>
      <guid>https://dev.to/cumbucadev/executando-uma-linguagem-interpretada-pitugues-4kd3</guid>
      <description>&lt;p&gt;Agora que já geramos a AST do Pituguês através do Avaliador Sintático, chegou o momento de entendermos o processo por que nosso código passa para ser executado. Por estarmos tratando de uma linguagem interpretada, nossas instruções estarão sendo traduzidas para código de máquina de forma simultânea, como já comentamos neste &lt;a href="https://cumbuca.dev/2026/01/16/como-e-programado-o-pitugues/" rel="noopener noreferrer"&gt;artigo&lt;/a&gt; a respeito da diferença entre linguagens interpretadas e compiladas. &lt;/p&gt;

&lt;h3&gt;
  
  
  Impacto da Linguagem Interpretada
&lt;/h3&gt;

&lt;p&gt;Quando falamos sobre a diferença entre a linguagem interpretada e a linguagem compilada, anteriormente, acabamos não deixando tão clara a aplicabilidade de cada uma delas.&lt;/p&gt;

&lt;p&gt;Voltando um pouquinho no tempo, vamos pensar que, há alguns anos, era muito comum que fosse necessário instalar algum software na sua máquina para se ter acesso àquela funcionalidade/recurso. Antigamente, para conseguirmos nos comunicar por mensagens instantâneas em chats individuais, era comum instalarmos um software como o MSN Messenger, por exemplo, no computador.&lt;/p&gt;

&lt;p&gt;Para um software assim rodar no seu computador, ele precisava ser construído para aquele sistema operacional e aquela máquina em específico, o que requer um desenvolvimento em uma linguagem compilada. Afinal, são estes tipos de linguagens em que, após sofrer o processo de build, conseguem traduzir um código de alto nível para a linguagem de máquina e que correspondem às exigências que aquele dispositivo requer. O que significaria que não haveria portabilidade entre dispositivos, uma vez que aquele programa foi desenvolvido para aquela máquina.&lt;/p&gt;

&lt;p&gt;Além disso, depois que um código é compilado, aquele programa fica ali fechadinho em si e não conseguimos simplesmente fazer manutenção naquele código, mas precisamos retomar o código do programa e passar pelo processo de gerar um novo programa com as correções e deletar o antigo. &lt;br&gt;
Com o desenvolvimento e ampla aderência dos navegadores (browsers), começou a se dispensar a exigência de se ter um software instalado no seu computador para que você pudesse ter acesso àquele serviço. Tornou-se possível termos aplicações de troca de mensagens instantâneas como a versão web para o What'sApp em que podemos fazer o nosso login e ainda ter acesso às nossas conversas e lista de contatos sempre precisar da instalação de uma aplicação para aquela finalidade.   &lt;/p&gt;

&lt;p&gt;O impacto que os navegadores trouxeram foi justamente este de "encurtar o caminho" de execução das funcionalidades de um serviço, uma vez que eles têm a capacidade de interpretar instruções escritas em linguagens de programação interpretadas que são executadas sem passarem pela compilação, mas em tempo real. O que desobriga a instalação de aplicativos especializados para diferentes tipos de serviços.&lt;/p&gt;

&lt;p&gt;Isto significa que poderemos criar uma série de sistemas que ficarão hospedados na web e, quando algum usuário quiser acessar aquele serviço específico, ele apenas precisará navegar até o endereço em que este serviço está disponível e o browser é que será responsável por fornecer o acesso do usuário àquele serviço. E como são aplicações que não passam pela compilação, são mais maleáveis em sua manutenibilidade. &lt;/p&gt;

&lt;p&gt;Ou seja, no ambiente web, as linguagens interpretadas possuem um poderio imensurável!&lt;/p&gt;

&lt;p&gt;E justamente por terem esta característica que elas acabam se tornando agentes facilitadoras na portabilidade e flexibilidade de se construir e ofertar diversos tipos de serviços.&lt;/p&gt;
&lt;h1&gt;
  
  
  Uma linguagem interpretada em português
&lt;/h1&gt;

&lt;p&gt;A área de desenvolvimento de software vem ganhando destaque nos últimos anos, principalmente após a pandemia do COVID-19 em que muitas atividades precisaram se incluir no meio digital e o mercado de TI se viu precisando de mais profissionais. Diante deste cenário, uma expressiva parcela de falantes da língua portuguesa vem buscando formação neste universo devido ao mercado aquecido. &lt;/p&gt;

&lt;p&gt;No entanto, a gente já comentou &lt;a href="https://cumbuca.dev/2025/08/22/hackeando-o-ingles-programando-na-lingua-em-que-voce-pensa/" rel="noopener noreferrer"&gt;nesta outra postagem&lt;/a&gt; sobre como as linguagens de programação que são usadas comercialmente podem ser desafiadoras para falantes lusófonos, especialmente para pessoas iniciantes em programação e por isso linguagens em português podem ser uma excelente porta de entrada para estas pessoas.&lt;/p&gt;

&lt;p&gt;Por mais que existam outras linguagens de programação em português, elas ainda são voltadas apenas a fins didáticos e seu uso ocorre em "ambientes controlados", em editores de código exclusivos, ou até mesmo conseguem rodar no ambiente da web. E, embora contribuam imensamente como ferramenta de ensino de algoritmos e lógica de programação, não conseguimos criar e disseminar soluções em função desta limitação de não serem suportadas pelos interpretadores dos browsers.&lt;/p&gt;

&lt;p&gt;E é verdade que a revolução conquistada pelos browsers em dispensar a necessidade de uma aplicação específica para diferentes sistemas torna o desenvolvimento de aplicações mais flexível e até mesmo mais ágil. Mas eles ainda utilizam linguagens de programação em língua inglesa e precisamos lembrar das dificuldades enfrentadas por falantes da língua portuguesa ao aprender a programação.&lt;/p&gt;

&lt;p&gt;Com a ampla difusão dos navegadores e, como vimos antes, sua capacidade de executar serviços desenvolvidos com linguagens interpretadas, acreditamos que há espaço para se desenvolver uma linguagem interpretada em português que vá além da proposta educacional! &lt;/p&gt;

&lt;p&gt;Ao construirmos uma linguagem interpretada em português que consegue ser interpretada pelo Google Chrome, Opera, Firefox,Edge e entre outros, possibilitamos que falantes de língua portuguesa consigam usar essa mesma linguagem para criar! &lt;/p&gt;

&lt;p&gt;Com isto, temos a oportunidade de desenvolver e produzir serviços web em português! O que poderá contribuir para a geração de renda no mercado nacional! &lt;/p&gt;

&lt;p&gt;Então, por que não construir uma linguagem de programação interpretada em português que seja suportada pelos navegadores para desenvolvimento de serviços web e que contribua na geração de trabalho e renda, uma vez que teríamos a barreira linguística superada?&lt;/p&gt;

&lt;p&gt;É isto que se busca oportunizar com o Pituguês: uma linguagem interpretada que possa ser executada em qualquer dispositivo que tenha acesso a um navegador!&lt;/p&gt;
&lt;h2&gt;
  
  
  O Interpretador
&lt;/h2&gt;

&lt;p&gt;Agora, chegou o momento de entendermos como funciona o código do Interpretador! &lt;/p&gt;

&lt;p&gt;Depois de passarmos pelo processo do Avaliador Sintático, onde é verificado se a nossa instrução em Pituguês está de acordo com a sintaxe esperada e também acontece a construção da AST (Abstract Syntax Tree, ou Árvore Sintática Abstrata) do programa, ainda nos resta desenvolver a etapa que irá, de fato, executar o nosso comando. &lt;/p&gt;

&lt;p&gt;Vamos retomar o exemplo de código que trabalhamos no Avaliador Sintático:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;letra = "b"
se letra == "a":
    escreva("Letra A")
senao:
    escreva("Não é letra A")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Avaliador Sintático acabou gerando uma lista de declarações, que vem a ser a nossa AST, o que podemos chamar de "ramos da árvore", em que temos uma visão panorâmica quanto aos componentes que existem no nosso programa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;declaracoes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;Var&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;linha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;hashArquivo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;decoradores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
      &lt;span class="nx"&gt;assinaturaMetodo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;principal&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;simbolo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Simbolo&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;inicializador&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;texto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;tipoExplicito&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;referencia&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;desestruturacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;Se&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;linha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;hashArquivo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;decoradores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
      &lt;span class="nx"&gt;assinaturaMetodo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;principal&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;condicao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Binario&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;caminhoEntao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Bloco&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;caminhosSeSenao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
      &lt;span class="nx"&gt;caminhoSenao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Bloco&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui temos a ideia geral das declarações existentes no programa, mas não conseguimos ter acesso ao código em si e, como comentamos no artigo sobre o Avaliador Sintático, agora é responsabilidade do Interpretador percorrer esta lista de declarações, adentrar em cada uma delas e fazer com que o código seja executado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando a AST
&lt;/h2&gt;

&lt;p&gt;Agora que geramos e temos acesso à AST do nosso código, o Interpretador precisa conseguir acessar cada ramificação do nosso código para executar as instruções ali escritas. Como abordamos no artigo anterior, estruturas de dados em árvores não podem ser acessadas da mesma forma que estruturas lineares, uma vez que elas possuem toda uma hierarquia e conexões entre seus nós.&lt;/p&gt;

&lt;p&gt;Para este tipo de estrutura a literatura indica a utilização de um Design Pattern conhecido por Visitor Pattern - ou "Padrão Visitante" em tradução livre. Este padrão de projeto foi descrito no livro de mesmo nome, "Design Patterns", que apresenta uma série de problemas estruturais que podem ser enfrentados no código de um projeto e traz soluções através destes padrões de projeto.&lt;/p&gt;

&lt;p&gt;Uma linguagem de programação deve conseguir implementar diversos comportamentos e ainda ser possível expandi-los, mas isto precisa ser feito de uma forma que não cause interferência em elementos que já existem e que ainda se consiga fazer a manutenção da linguagem quando necessário. Nesse sentido, o Visitor Pattern consegue cumprir estes requisitos por usar e abusar dos pilares de polimorfismo e herança que a Programação Orientada a Objetos oferece. &lt;/p&gt;

&lt;p&gt;Para conhecer um pouco mais sobre este padrão de projeto, recomendamos a leitura do &lt;a href="https://refactoring.guru/pt-br/design-patterns/visitor" rel="noopener noreferrer"&gt;artigo sobre Visitor Patterns do Refactoring Guru&lt;/a&gt; e deste artigo no &lt;a href="https://medium.com/engenharia-arquivei/visitor-em-interpretadores-um-uso-espec%C3%ADfico-para-um-pattern-incomum-bfc01d651477" rel="noopener noreferrer"&gt;Medium sobre aplicar o Visitor Pattern em um interpretador de linguagem&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Visitor Pattern - ou Padrão Visitante
&lt;/h2&gt;

&lt;p&gt;Nesta seção, iremos abordar o Padrão Visitante já aplicado no Pituguês, portanto, se seu entendimento ficar um pouco confuso, recomendamos a leitura prévia dos artigos referidos na seção anterior. &lt;/p&gt;

&lt;p&gt;Para desenvolvermos a nossa solução com este padrão de projeto, precisamos ter definido três componentes-chave: &lt;/p&gt;

&lt;h3&gt;
  
  
  1. Visitor Interface (Interface dos Visitantes)
&lt;/h3&gt;

&lt;p&gt;Como toda interface, aqui, vamos apenas definir os métodos abstratos das operações que queremos efetuar e você pode encontrar este componente de Pituguês &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/interfaces/visitante-comum-interface.ts" rel="noopener noreferrer"&gt;neste arquivo&lt;/a&gt; da interface &lt;code&gt;VisitanteComumInterface&lt;/code&gt;.  Ou seja, as funções apenas possuem métodos abstratos declarados  e seus nomes e argumentos são descritos para que seja seguido um padrão de aplicação destes comportamentos que serão desenvolvidos em outras classes.&lt;/p&gt;

&lt;p&gt;Note que há declarados os métodos referentes a &lt;code&gt;visitarDeclaracaoVariavel&lt;/code&gt;, &lt;code&gt;visitarDeclaracaoSe&lt;/code&gt; e &lt;code&gt;visitarDeclaracaoEscreva&lt;/code&gt;, que são referentes ao comportamento das declarações que o Avaliador Sintático identificou no nosso código de exemplo.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Concrete Visitors (Visitantes Concretos)
&lt;/h3&gt;

&lt;p&gt;São as classes que vão implementar estes métodos declarados na interface &lt;code&gt;VisitanteComumInterface&lt;/code&gt; e que vão ser desenvolvidas em classes como a &lt;code&gt;InterpretadorBase&lt;/code&gt;, disponível &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/interpretador/interpretador-base.ts" rel="noopener noreferrer"&gt;neste arquivo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;É importante estar atento em como usamos a herança para implementar as funcionalidades que queremos no projeto do Pituguês. Para chegarmos na classe em que estão desenvolvidas estas "funções visitantes", vamos passar pelo caminho:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;VisitanteComumInterface&lt;/code&gt;: declaração de métodos abstratos de visitação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;InterpretadorInterface&lt;/code&gt;: herda o &lt;code&gt;VisitanteComumInterface&lt;/code&gt; com seus métodos abstratos, além de declarar os atributos e novos métodos que irão cumprir o papel de executar as instruções que escreveremos em Pituguês.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;InterpretadorBase&lt;/code&gt;: implementa o &lt;code&gt;InterpretadorInterface&lt;/code&gt; que traz consigo tanto seus métodos abstratos como os de &lt;code&gt;VisitanteComumInterface&lt;/code&gt; que, agora, já possui implementação, já tem seus comportamentos desenvolvidos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Interpretador&lt;/code&gt;: irá herdar o &lt;code&gt;InterpretadorBase&lt;/code&gt; com as funções já desenvolvidas, assim como irá sobrescrever algumas delas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;InterpretadorPitugues&lt;/code&gt;: herda o Interpretador com seus métodos e também sobrescreve alguns deles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em suma, para desenvolvimento do Interpretador do Pituguês, este fluxo de heranças se faz necessário para que possamos usufruir ao máximo do reaproveitamento de código, uma vez que estas classes podem ser reutilizadas em outros dialetos que Delégua suporta, o que acabou resultando no caminho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VisitanteComumInterface &amp;gt; InterpretadorInterface &amp;gt; InterpretadorBase &amp;gt; Interpretador &amp;gt; InterpretadorPitugues
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E é dentro do código em &lt;code&gt;InterpretadorBase&lt;/code&gt; que vamos ter desenvolvidos os comportamentos de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;visitarDeclaracaoVariavel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;visitarDeclaracaoSe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;visitarDeclaracaoEscreva&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Visitable Elements (Elementos Visitáveis)
&lt;/h3&gt;

&lt;p&gt;Aqui vamos começar a ter os objetos correspondentes às funcionalidades e recursos que queremos incluir na nossa linguagem e, novamente, vamos usar o pilar para herança para que possamos adicionar elementos sem interferir uns nos outros. &lt;/p&gt;

&lt;p&gt;Primeiramente, devemos lembrar que o Interpretador recebe uma AST de declarações do nosso código, então, vamos ter uma &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/declaracoes/declaracao.ts" rel="noopener noreferrer"&gt;classe abstrata chamada &lt;code&gt;Declaracao&lt;/code&gt;&lt;/a&gt; que vai  conter atributos que mapeiam a declaração específica e a função aceitar que será da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;aceitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;visitante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VisitanteComumInterface&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Este método não deveria ser chamado.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repare que a função recebe como argumento um objeto chamado &lt;code&gt;visitante&lt;/code&gt; do mesmo tipo da nossa primeira interface que declara os métodos de visitação: &lt;code&gt;VisitanteComumInterface&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora, precisamos implementar a nossa classe abstrata e esta função em uma "classe concreta", uma classe que poderá inicializar um objeto e vamos tomar como exemplo o comportamento de criação de variável. Ou seja, teremos uma &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/declaracoes/var.ts" rel="noopener noreferrer"&gt;classe para declaração de variável chamada &lt;code&gt;Var&lt;/code&gt;&lt;/a&gt; que irá sobrescrever a função aceitar, declarada na classe Declaracao, implementando o comportamento necessário para sua execução, o que irá resultar em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;aceitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;visitante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VisitanteComumInterface&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;visitante&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visitarDeclaracaoVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesta sobrescrita, estamos nos referindo a uma função cujo desenvolvimento se encontra em &lt;code&gt;IntrepretadorBase&lt;/code&gt; e que, logo em seguida, iremos apresentar qual é o percurso que é feito para chegar até aqui e executar a instrução pelo Interpretador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visitando as Declarações
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ATENÇÃO: Recomendamos que você acompanhe o código do Interpretador durante a leitura! Disponibilizaremos os links para o código referido ao longo do texto.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como já vimos antes, a AST é constituída pelas declarações geradas pelo Avaliador Sintático e precisamos usar o Padrão Visitante para percorrer esta árvore, adentrar seus ramos e executar o trecho de código que existe dentro de cada um deles. &lt;br&gt;
Vamos iniciar nosso passeio no arquivo de testes...&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Testes do Interpretador do Pituguês
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NOTA: Você pode acessar o arquivo por &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/testes/interpretador/dialetos/pitugues/interpretador-pitugues.test.ts" rel="noopener noreferrer"&gt;este link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos adicionar um teste unitário com o nosso código de exemplo para simular qual seria o trajeto que o interpretador faria para executá-lo caso estivéssemos usando uma IDE. Então, temos o teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Teste do exemplo de código presente no artigo sobre o Interpretador&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retornoLexador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lexador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mapear&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;letra = "b"&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;se letra == "a":&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;    escreva("Letra A")&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;senao:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;    escreva("Não é letra A")&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retornoAvaliadorSintatico&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;avaliadorSintatico&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analisar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;retornoLexador&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retornoInterpretador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;interpretador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;interpretar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;retornoAvaliadorSintatico&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;declaracoes&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

     &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;retornoInterpretador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;erros&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste teste, temos que repassar sequencialmente os retornos do Lexador para o Avaliador Sintático e do Avaliador Sintático para o Interpretador. O &lt;code&gt;Interpretador&lt;/code&gt; irá chamar a função &lt;code&gt;interpretar&lt;/code&gt;, que recebe as nossas declarações já identificadas pelo Avaliador Sintático e, agora, vamos conseguir entender um pouco mais o percurso que o Padrão Visitante faz ao entrar dentro da função &lt;code&gt;interpretar&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Função &lt;code&gt;interpretar&lt;/code&gt; da classe &lt;code&gt;Interpretador&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Inicialmente, vamos parar dentro do &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/interpretador/interpretador.ts" rel="noopener noreferrer"&gt;arquivo da classe &lt;code&gt;Interpretador&lt;/code&gt;&lt;/a&gt;, cuja função &lt;code&gt;interpretar&lt;/code&gt; consta como sobrescrita, ou seja, ela é herdada de outra classe, e logo em seguida temos o trecho de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resultados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;interpretar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracoes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;manterAmbiente&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta linha de código visa obter os resultados das declarações recebidas como argumentos a serem executadas, mas ela redireciona para outra função interpretar que pertence à classe mãe.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Função &lt;code&gt;interpretar&lt;/code&gt; da classe &lt;code&gt;InterpretadorBase&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O InterpretadorBase está disponível &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/interpretador/interpretador-base.ts" rel="noopener noreferrer"&gt;neste arquivo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aqui, nós vamos inicializar atributos referentes aos erros, escopo e pilha de execução e, mais abaixo, o código irá buscar se conseguirá receber um retorno das declarações ou algum erro e isto está declarado na linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retornoOuErro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executarUltimoEscopo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;manterAmbiente&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Função &lt;code&gt;executarUltimoEscopo&lt;/code&gt; da classe &lt;code&gt;Interpretador&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Voltamos à classe &lt;code&gt;[Interpretador](https://github.com/DesignLiquido/delegua/blob/principal/fontes/interpretador/interpretador.ts)&lt;/code&gt;, em que será capturada a &lt;code&gt;declaracaoAtual&lt;/code&gt; que está em espera na pilha de execução para ser executada até chegamos à instrução:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;retornoExecucao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracaoAtual&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Função &lt;code&gt;executar&lt;/code&gt; da classe &lt;code&gt;InterpretadorBase&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Todo esse caminho percorrido, até então, ilustra como o Interpretador recebe a AST do código de exemplo e tira proveito do Padrão Visitante para reaproveitamento e padronização do código, mas ele ainda não foi executado, apenas estamos identificando de qual declaração se trata para que ela possa ser executada. &lt;/p&gt;

&lt;p&gt;De toda forma, agora é o momento em que vamos começar a direcionar a nossa declaração para o objeto dela e começar a ver o Padrão Visitante em ação e como o Interpretador descobre qual instrução ele precisará executar.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Função &lt;code&gt;aceitar&lt;/code&gt; nas classes &lt;code&gt;Var&lt;/code&gt; e &lt;code&gt;Se&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Lembrando que a função aceitar foi declarada em uma classe abstrata Declaracao para ser herdada por outras declarações. Ela recebe como argumento um objeto do tipo VisitanteComumInterface que é uma interface cujos métodos estão implementados e desenvolvidos no InterpretadorBase.&lt;/p&gt;

&lt;p&gt;Na etapa 5, a função aceitar recebeu tanto a declaração &lt;code&gt;Var&lt;/code&gt; como a &lt;code&gt;Se&lt;/code&gt; e o código de cada uma delas se encontra desenvolvido desta forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Declaração &lt;code&gt;Var&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primeiramente, o Interpretador irá reconhecer a primeira linha do nosso código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;letra = "b"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É uma instrução que já foi identificada pelo Avaliador Sintática como uma &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/declaracoes/var.ts" rel="noopener noreferrer"&gt;declaração &lt;code&gt;Var&lt;/code&gt;&lt;/a&gt; e, dentro do seu código, ela herda a classe Declaracao, como já foi comentado, e aplica a função aceitar. Porém, quando estamos dentro da classe da declaração &lt;em&gt;Var&lt;/em&gt;, &lt;em&gt;aceitar&lt;/em&gt; é sobrescrita:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;aceitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;visitante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VisitanteComumInterface&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;visitante&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visitarDeclaracaoVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Declaração &lt;code&gt;Se&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em sequência, o Interpretador irá avançar para a próxima declaração, cujo código é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;se letra == "a":
    escreva("Letra A")
senao:
    escreva("Não é letra A")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/declaracoes/se.ts" rel="noopener noreferrer"&gt;declaração &lt;code&gt;Se&lt;/code&gt;&lt;/a&gt; também irá herdar e aplicar a função aceitar da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;aceitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;visitante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VisitanteComumInterface&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;visitante&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visitarDeclaracaoSe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repare que ambas recebem como argumento um visitante de tipo &lt;code&gt;VisitanteComumInterface&lt;/code&gt; , interface em foram declaradas nela funções abstratas e foram desenvolvidas em &lt;code&gt;InterpretadorBase&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A partir do momento que a função &lt;code&gt;aceitar&lt;/code&gt;, na etapa 5, recebe uma declaração de um determinado tipo, é o que vai permitir que o &lt;code&gt;InterpretadorBase&lt;/code&gt; seja direcionado para visitar o objeto da declaração, no nosso caso, as declarações &lt;code&gt;Var&lt;/code&gt; e &lt;code&gt;Se&lt;/code&gt;. E, sem sequência, Var e Se irão determinar qual método de visitação será chamado na o InterpretadorBase para que sejam executadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Funções &lt;code&gt;visitarDeclaracaoVar&lt;/code&gt; e &lt;code&gt;visitarDeclaracaoSe&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Somos redirecionados, novamente, para o &lt;code&gt;InterpretadorBase&lt;/code&gt; que é onde estão desenvolvidas as funções de visitação das declarações.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para a declaração &lt;code&gt;Var&lt;/code&gt;, vamos ter:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;visitarDeclaracaoVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Var&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valorFinal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;avaliacaoDeclaracaoVarOuConst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tipoResolvido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tipoResolvido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;função&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;tipoResolvido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tipoResolvido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;função&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pilhaEscoposExecucao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;definirVariavel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;simbolo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lexema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;valorFinal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;tipoResolvido&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, a nossa variável vai passar por uma verificação para garantir seu tipo e averiguar se já foi declarada antes ou não, até ser incluída na pilha de escopo para execução.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para a declaração &lt;code&gt;Se&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;visitarDeclaracaoSe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Se&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;avaliacaoCondicaoSe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;avaliar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;condicao&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eVerdadeiro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;avaliacaoCondicaoSe&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;caminhoEntao&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;caminhosSeSenao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// TODO: Qual o tipo de `atual`?&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;atual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;caminhosSeSenao&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eVerdadeiro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;avaliar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;atual&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;condicao&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;atual&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;caminho&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;caminhoSenao&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;declaracao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;caminhoSenao&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A condicional será avaliada aqui e o código irá mapear quais outras declarações e expressões existem dentro de &lt;code&gt;Se&lt;/code&gt;. Isto fará com que o Interpretador percorra todo aquele caminho que foi criado com o Padrão Visitante para identificar e executar as declarações, blocos e expressões dentro do &lt;code&gt;Se&lt;/code&gt; e que serão adicionadas à pilha de escopo para execução.&lt;/p&gt;

&lt;h1&gt;
  
  
  Contribua com o Pituguês!
&lt;/h1&gt;

&lt;p&gt;Agora que você sabe o que é o Padrão Visitante e como ele funciona aplicado no Interpretador do Pituguês, você já está apto a contribuir com ele!&lt;/p&gt;

&lt;p&gt;Como comentamos, o código-fonte do Pituguês mora dentro de Delégua, então você irá encontrá-lo &lt;a href="https://github.com/DesignLiquido/delegua" rel="noopener noreferrer"&gt;neste repositório do GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Além disso, também preparamos &lt;a href="https://github.com/DesignLiquido/pitugues-docs/blob/principal/CONTRIBUTING.md" rel="noopener noreferrer"&gt;este documento&lt;/a&gt; que te guia em como contribuir com a linguagem, em que damos uma visão geral da estrutura do código e os arquivos principais para você contribuir com o Pituguês.&lt;/p&gt;

&lt;p&gt;Caso encontre alguma dificuldade, a Design Líquido fez um &lt;a href="https://www.youtube.com/watch?v=OUt0s4F3jMk" rel="noopener noreferrer"&gt;vídeo demonstrando como programar e  contribuir com o Interpretador&lt;/a&gt; e você pode pegar inspirações de lá!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas com o que posso contribuir?
&lt;/h2&gt;

&lt;p&gt;De diversas formas... você pode usar a linguagem e reportar bugs pra gente, pode divulgar a linguagem e até mesmo fazer contribuições diretas no código-fonte...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Para contribuir com o Avaliador Sintático: investigue e analise os construtos que já existem na linguagem, pense o que mais você incluiria e/ou melhoria e vem contar pra gente!&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Um pequeno adendo sobre contribuições...
&lt;/h3&gt;

&lt;p&gt;Aderir a boas práticas, registrando no GitHub seu processo de contribuição, é de suma importância! No guia de contribuição que trouxemos para vocês, é ensinado como buscar por issues para contribuir - ou abrir as próprias issues - e como fazer um PR (Pull Request). Parte da função dessas etapas é deixar documentado e acessível para que outros contribuidores possam acompanhar o desenvolvimento do projeto.&lt;/p&gt;

&lt;p&gt;Aliás, não apenas para que outras pessoas consigam acompanhar o desenrolar do projeto, mas também é uma forma de mostrar para o mundo o seu trabalho! Aqui, na Cumbuca Dev, a gente promove e incentiva a contribuição em projetos de Código Aberto, por ser uma das formas de pessoas iniciantes aprenderem e se desenvolverem na programação, enquanto conquistam experiência real que será super válida para o mercado de trabalho!&lt;/p&gt;

&lt;p&gt;Ou seja, enquanto você consegue participar ativamente, ajudando com o crescimento de um projeto e trocando ideia com outros contribuidores, também consegue desenvolver suas habilidades! E como tudo isso é feito com transparência, você pode facilmente comprovar experiência! &amp;lt;3&lt;/p&gt;

&lt;h2&gt;
  
  
  E agora?
&lt;/h2&gt;

&lt;p&gt;Bom, agora que você já sabe como funciona e como se programa um Interpretador, te convidamos a aprender e testar o Pituguês! 😉​ Escrevemos &lt;a href="https://cumbuca.dev/2025/11/07/vem-com-a-gente-programar-em-portugues/" rel="noopener noreferrer"&gt;este tutorial&lt;/a&gt; para te ensinar como programar com ele! Além disso, você sempre pode consultar a documentação!&lt;/p&gt;

&lt;p&gt;​&lt;a href="https://github.com/cumbucadev/desafios-pitugues/issues" rel="noopener noreferrer"&gt;Neste repositório&lt;/a&gt; temos descrito alguns desafios para fazer em Pituguês! E se, por caso, tiver qualquer dificuldade com a linguagem, já pode reportar pra gente que te ajudamos!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>community</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Avaliador Sintático: Como Funciona no Pituguês</title>
      <dc:creator>Cumbuca Dev</dc:creator>
      <pubDate>Mon, 23 Mar 2026 12:51:12 +0000</pubDate>
      <link>https://dev.to/cumbucadev/avaliador-sintatico-como-funciona-no-pitugues-209a</link>
      <guid>https://dev.to/cumbucadev/avaliador-sintatico-como-funciona-no-pitugues-209a</guid>
      <description>&lt;p&gt;Depois de tratarmos sobre o Lexador, vamos avançar para a próxima etapa do processo que torna possível transformar uma linguagem de alto nível em linguagem de máquina, permitindo o desenvolvimento de uma linguagem de programação: o Avaliador Sintático!&lt;/p&gt;

&lt;p&gt;Este termo foi a escolha feita pela Design Líquido como tradução de um parser, mas também podemos encontrar por aí outros nomes equivalentes como AST Walker, AST Evaluator ou até mesmo Analisador Sintático.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retomando alguns conceitos…
&lt;/h3&gt;

&lt;p&gt;Lembram que o Lexador gera uma lista de símbolos (tokens) a partir das instruções que escrevemos no código-fonte do nosso programa? Tomemos o mesmo exemplo do artigo anterior, ao declararmos a variável:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nome_da_linguagem = "Pituguês"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O Lexador irá mapear cada elemento que contém nesta linha de código, retornando um vetor (array) de objetos Símbolo, em que é identificado o seu tipo e lexema. Estas informação são imprediscíveis para que o Avaliador Sintático possa dar continuidade da tradução da linguagem de alto nível para a de baixo nível e, assim, executar o programa que escrevemos.&lt;/p&gt;

&lt;p&gt;Mas escrever código e ter seus símbolos identificados por um Lexador não é o suficiente para que se possa tornar uma linguagem de programação executável, é a apenas a primeira parte do processo. Tomando como exemplo o Pituguês, imagine que o Lexador foi capaz de identificar a declaração de variável da seguinte linha de código:&lt;/p&gt;

&lt;p&gt;var nome_da_linguagem = "Pituguês"&lt;br&gt;
Nessa linha de código, o Lexador identificou que há dois símbolos que foram categorizados como identificadores, como nomes de variáveis, a palavra var e a palavra nome_da_linguagem. Até aí tudo bem, porque é a função dele apenas mapear os símbolos e seu tipos.&lt;/p&gt;

&lt;p&gt;Mas quando tentamos executar este código…&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffg1xo2g3jhyus6zr8nr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffg1xo2g3jhyus6zr8nr9.png" width="800" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A palavra var não é reconhecida pela linguagem por não fazer para de sua gramática e por isto temos retornado o erro acima que nos impede de executar o código. Afinal, assim como um idioma que segue uma estrutura sintática para gerar conexão entre palavras e transmitirmos uma mensagem, as linguagens de programação funcionam da mesma forma.&lt;/p&gt;

&lt;p&gt;Os símbolos que compõem uma instrução de um código precisam o corresponder a uma ordem para serem reconhecidos dentro da regra gramatical da linguagem. Então, por exemplo, não podemos declarar uma variável assim:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nome_da_linguagem "Pituguês" =&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Como o Avaliador Sintático avalia os tokens do Lexador?
&lt;/h1&gt;

&lt;p&gt;Como foi comentado antes, o Lexador gera uma lista dos símbolos que existem no código escrito e ele vai enviar essa lista para o Avaliador Sintático. A partir do momento em que o Avaliador Sintático tem acesso a esta lista de símbolos com seus devidos tipos identificados, ele terá ciência sobre o significado daquele símbolo. Isto é de suma importância pois é como o Avaliador conseguirá determinar a função daquela comando no programa.&lt;/p&gt;

&lt;p&gt;Esta etapa é como se fosse uma análise sintática de uma oração mesmo, um momento em que iremos identificar a classe e função de cada palavra em uma frase, como:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4mty54t7hmwdpvgbyyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4mty54t7hmwdpvgbyyp.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que cada palavra está ordenada de uma forma que faça sentindo para transmitir sua mensagem na língua portuguesa. Cada palavra pertence a uma classificação gramatical que possui uma função específica que determina seu propósito dentro da frase.&lt;/p&gt;

&lt;p&gt;Usando o exemplo da frase acima, é como se o Lexador identificasse que existe um pronome, um verbo, uma preposição e um substantivo, nessa respectiva ordem. O Avaliador Sintático vai, agora, identificar qual é a função desses elementos e verificar se eles estão ordenados seguindo o padrão de “SUJEITO + VERBO + OBJETO”.&lt;/p&gt;

&lt;p&gt;A nossa linha de código vai sofrer um processo parecido de identificação quanto a função dela naquele programa. Mas, desta vez, irá analisar se há elementos como variáveis, condicionais, laços de repetição e etc. Tomemos como exemplo a declaração de variável que já usamos antes do Pituguês:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nome_da_linguagem = "Pituguês&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Quando o Avaliador recebe esta linha de código, terá sido mapeado que ali temos um identificador, um sinal de atribuição de valor e, por último, temos o valor, um dado de tipo textual. Após receber esta sequência de caracteres com seus significado, será analisado se aquela linha de código está na ordem correta para que seja considerada uma declaração variável. Isto será processado dentro desta função (você pode encontrá-la &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.ts" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private async declaracaoImplicitaVariaveis(): Promise&amp;lt;Var&amp;gt; {
    const identificador = this.consumir(
        tiposDeSimbolos.IDENTIFICADOR,
        'Esperado nome de variável.'
    );
    this.consumir(tiposDeSimbolos.IGUAL, "Esperado '=' após identificador.");
    if (this.estaNoFinal()) {
        throw this.erro(
            this.simboloAnterior(),
            'Esperado valor após o símbolo de igual.'
        )
    }
    const valor = await this.expressao();
    const tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(valor, 'qualquer');
    this.pilhaEscopos.definirInformacoesVariavel(
        identificador.lexema,
        new InformacaoElementoSintatico(identificador.lexema, tipo)
    );
    return new Var(identificador, valor, tipo);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesta função, em código TypeScript, sua assinatura espera que seja construído um objeto do tipo Var, para criarmos uma variável, após o avaliador receber aquela linha de código. Só que esta variável só será construída após passar pelas validações na função acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;const identificador&lt;/code&gt;: irá armazenar o identificador a nossa variável;&lt;br&gt;
É validado se existe o sinal de igual para atribuição de valor;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verifica se há algum valor após o sinal de atribuição;&lt;br&gt;
const valor: é quando o código vai verificar qual é o dado que queremos armazenar na variável;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;const tipo&lt;/code&gt;: a partir do valor, identifica o tipo do dado;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adiciona à pilha de escopo do programa a variável;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Por fim, a função retorna um objeto Var, com as constantes e seus valores definidos na função: &lt;code&gt;identificador&lt;/code&gt;, &lt;code&gt;valor&lt;/code&gt;e &lt;code&gt;tipo&lt;/code&gt;.&lt;br&gt;
Ou seja, apenas após passar por todo esse processamento e validações é que o Pituguês conseguiu gerar uma variável para aquela linha de código.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Composição de um programa
&lt;/h1&gt;

&lt;p&gt;Até aqui, conseguimos entender como o Avaliador Sintático é capaz de reconhecer uma variável, só que é preciso lembrar que um programa não consiste em apenas um elemento. Geralmente, acabamos usando uma série de construções como condicionais, funções, laços de repetição, criação de classes, enfim, temos uma ampla gama de comandos que podemos elaborar num programa.&lt;/p&gt;

&lt;p&gt;Todavia, além do processo de identificar as instruções do código, a função do Avaliador Sintático também é construir uma forma de representação hierárquica dele, conhecida por AST (Abstract Syntax Tree, ou Árvore de Sintaxe Abstrata). E é essa representação que, mais a frente, permitirá que nosso Interpretador percorra e execute o programa desenvolvido.&lt;/p&gt;

&lt;p&gt;Mas, antes, vamos entender o que é uma…&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura de Dados em Árvore
&lt;/h2&gt;

&lt;p&gt;Quando nos referimos ao tema de estrutura de dados, lidamos com formas de armazenamento de dados que são lineares por terem um início e um fim, como vetores, pilhas e filas. A árvore também é uma estrutura de dados, porém, ela não opera de forma linear como as outras mencionadas, mas de maneira hierárquica e permite um crescimento contínuo de dados.&lt;/p&gt;

&lt;p&gt;Imagine que você elaborou uma lista de filmes que quer baixar para assistir mais tarde. Pensando em estrutura de dados, você pode guardar essa lista num vetor, como, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lista_de_filmes = [
 "Um conto chinês",
 "Nunca deixe de lembrar",
 "Nosferatu",
 "O enigma de Kaspar Hauser".
 "Cidade de Deus",
 "Minha mãe é uma peça",
 "Bacurau",
 "Parasita",
 "Invasão Zumbi"
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em um vetor, conseguimos ter essa visão mais panorâmica do que há na nossa lista e selecionar um item pela sua posição dentro do vetor, simplesmente por percorrer a estrutura com um laço de repetição, por exemplo. E até aqui tudo bem, porque a intenção era apenas de ter uma listagem dos filmes que se pretendia assistir.&lt;/p&gt;

&lt;p&gt;Agora, você já baixou os filmes e criou uma pasta chamada FILMES no seu computador para deixar eles guardadinhos ali dentro, mas isso te deixou incomodado porque só colocar os arquivos ali não ficou exatamente organizado. Então, que tal organizar os filmes de acordo com seu país de lançamento?&lt;/p&gt;

&lt;p&gt;Podemos ter uma organização em que iremos aninhar os filmes de acordo com seu país e ela ficaria mais ou mesmo assim…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── FILMES
│ ├── Argentina
│ │ ├── Um conto chinês
│ ├── Alemanha
│ │ ├── Nunca deixe de lembrar
│ │ ├── Nosferatu
│ │ ├── O enigma de Kaspar Hauser
│ ├── Brasil
│ │ ├── Cidade de Deus
│ │ ├── Minha mãe é uma peça
│ │ ├── Bacurau
│ ├── Coreia do Sul
│ │ ├── Parasita
│ │ ├── Invasão Zumbi

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É só pensar num sistema de arquivos no seu computador de forma simplificada: depois de dividir os filmes em diretórios de acordo com seu país, você não vai mais conseguir acessar o filme da mesma forma que conseguia como no vetor de antes.&lt;/p&gt;

&lt;p&gt;Agora, se quiser assistir o filme “Cidade de Deus”, vai precisar navegar pelo caminho de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecionar o diretório FILMES&lt;/li&gt;
&lt;li&gt;Depois o diretório Brasil&lt;/li&gt;
&lt;li&gt;E, por fim, o filme “Cidade de Deus“&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja, a partir do momento que eu quero ter acesso aos filmes que estão na pasta Brasil, eu já não tenho acesso visível aos filmes que estão aninhanados em outros países. Então, se eu estiver ainda dentro de Brasil, caso eu mude de ideia e queira assistir um filme da Argentina, eu vou precisar retroceder um diretório para poder entrar em outro, isto porque cada um do filmes está organizado na pasta do seu respectivo país.&lt;/p&gt;

&lt;p&gt;É mais ou menos assim que uma estrutura de dados em árvore se comporta. Você só consegue ter acesso àquele dado/informação se estiver “dentro do guarda-chuva dele”. É justamente por isso que não haverá linearidade em uma árvore, pois os dados estarão organizados, de novo, hierarquicamente.&lt;/p&gt;

&lt;p&gt;Se você quiser ler mais um pouquinho sobre as árvores, recomendamos este &lt;a href="https://www.freecodecamp.org/portuguese/news/tudo-o-que-voce-precisa-saber-sobre-estruturas-de-dados-em-arvore/" rel="noopener noreferrer"&gt;artigo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A AST do Avaliador Sintático
&lt;/h2&gt;

&lt;p&gt;Para que nosso programa em Pituguês seja executado o Avaliador Sintático não irá apenas identificar a função de cada trecho do código, mas vai gerar uma hierarquia em árvore dele. Vamos usar como exemplo o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;letra = "b"
se letra == "a":
    escreva("Letra A")
senao:
    "escreva("Não é letra A")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como comentamos, o Lexador irá mapear cada token presente em cada linha, retornando algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;simbolos: [
    Simbolo {
      tipo: 'IDENTIFICADOR',
      lexema: 'letra',
      literal: null,
      linha: 1,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IGUAL',
      lexema: '=',
      literal: null,
      linha: 1,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'TEXTO',
      lexema: 'b',
      literal: 'b',
      linha: 1,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'SE',
      lexema: 'se',
      literal: null,
      linha: 2,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IDENTIFICADOR',
      lexema: 'letra',
      literal: null,
      linha: 2,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IGUAL_IGUAL',
      lexema: '=',
      literal: null,
      linha: 2,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'TEXTO',
      lexema: 'a',
      literal: 'a',
      linha: 2,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'DOIS_PONTOS',
      lexema: '',
      literal: null,
      linha: 2,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'ESCREVA',
      lexema: 'escreva',
      literal: null,
      linha: 3,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'PARENTESE_ESQUERDO',
      lexema: '',
      literal: null,
      linha: 3,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'TEXTO',
      lexema: 'Letra A',
      literal: 'Letra A',
      linha: 3,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'PARENTESE_DIREITO',
      lexema: '',
      literal: null,
      linha: 3,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'SENAO',
      lexema: 'senao',
      literal: null,
      linha: 4,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'DOIS_PONTOS',
      lexema: '',
      literal: null,
      linha: 4,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'TEXTO',
      lexema: 'escreva(',
      literal: 'escreva(',
      linha: 5,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IDENTIFICADOR',
      lexema: 'Não',
      literal: null,
      linha: 5,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IDENTIFICADOR',
      lexema: 'é',
      literal: null,
      linha: 5,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IDENTIFICADOR',
      lexema: 'letra',
      literal: null,
      linha: 5,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IDENTIFICADOR',
      lexema: 'A',
      literal: null,
      linha: 5,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'TEXTO',
      lexema: ')',
      literal: ')',
      linha: 5,
      hashArquivo: undefined
    }
  ]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já o Avaliador Sintático, por sua vez, vai nos retornar algo mais enxuto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;declaracoes: [
    Var {
      linha: 1,
      hashArquivo: undefined,
      decoradores: [],
      assinaturaMetodo: '&amp;lt;principal&amp;gt;',
      simbolo: [Simbolo],
      inicializador: [Literal],
      tipo: 'texto',
      tipoExplicito: false,
      referencia: false,
      desestruturacao: false
    },
    Se {
      linha: 2,
      hashArquivo: 0,
      decoradores: [],
      assinaturaMetodo: '&amp;lt;principal&amp;gt;',
      condicao: [Binario],
      caminhoEntao: [Bloco],
      caminhosSeSenao: [],
      caminhoSenao: [Bloco]
    }
  ]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Percebe a diferença?&lt;/p&gt;

&lt;p&gt;Temos como resultado uma lista das declarações que foram feitas no nosso código: sabemos que existe uma declaração de variável e uma declaração da condicional se, mas não sabemos o que tem dentro de cada uma.&lt;/p&gt;

&lt;p&gt;É como se os ramos de uma árvore fossem vistos de longe, ou seja, podemos dizer que o retorno do Avaliador Sintático nos permite ter uma visão da ramificação do código em questão, conseguimos perceber como o código é organizado e hierarquizado.&lt;/p&gt;

&lt;p&gt;Neste exemplo, sabemos que a condicional não se limita ao o que é mostrado neste retorno, mas que ela se extende em mais linhas de código, só que, aqui, não temos acesso a esse detalhe. De toda forma, essa AST que o Avaliador Sintático gera vai ser usada pelo Interpretador. Mais adiante, é ele que irá adentrar o “ramo da condicional” e fazer com que o código ali de dentro seja executado (veremos mais detalhes sobre ele num próximo artigo).&lt;/p&gt;

&lt;h1&gt;
  
  
  Gerando os ramos da AST
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;ATENÇÃO: Recomendamos que você acompanhe o &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.ts" rel="noopener noreferrer"&gt;código do Avaliador Sintático&lt;/a&gt; durante a leitura.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Desenvolver uma linguagem de programação é uma atividade um tanto quanto complexa e temos que elaborar com bastante cuidado cada recurso e/ou funcionalidade que queremos empregar nela. Afinal, isso tudo é o que vai nos permitir construir com ela uma infinidade de soluções para sistemas e, para evitar que ocorram inconsistências na linguagem, precisamos ter todo este zelo no seu desenvolvimento.&lt;/p&gt;

&lt;p&gt;Cada funcionalidade empregada na linguagem é chamada de “construto” que nada mais é do que os comportamentos que são utilizados para programar em Pituguês e você pode encontrar uma espécie de lista deles &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/construtos/index.ts" rel="noopener noreferrer"&gt;neste arquivo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para dar um exemplo mais simples, vamos dar continuidade ao método imprima que adicionamos ao Lexador na postagem anterior sobre Pituguês…&lt;/p&gt;

&lt;p&gt;Após receber do Lexador os tipos de símbolos no trecho de código (imprima, texto e parênteses esquerdo e direito):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;imprima("Agora, você está aprendendo sobre o Avaliador Sintático do Pituguês!")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Avaliador Sintático recebe esta informação e vai seguir um fluxo de validações para gerar a nossa AST. Vamos entrar em cada uma das funções para gerar este “ramo da árvore” para o nosso método imprima que vai ser mais ou menos nesta ordem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── analisar 
│ ├── resolverDeclaracaoForaDeBloco 
│ │ ├── resolverDeclaracao 
│ │ │ ├── declaracaoEscreva 
│ │ │ │ ├── expressao 
│ │ │ │ │ ├── atribuir
│ │ │ │ │ │ ├── chamar
│ │ │ │ │ │ │ ├── primario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OBS&lt;/strong&gt;.: Durante a explicação da lógica das funções, vamos ignorar alguns trechos de código para tornar a escrita mais concisa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Função &lt;code&gt;analisar&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Neste primeiro momento, vamos receber a lista de símbolos do Lexador como argumento na função e vamos inicializar uma lista para abrigar as declarações que serão geradas e formarão a nossa AST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let declaracoes: Declaracao[] = [];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logo abaixo, teremos um laço de repetição que permitirá que o Avaliador Sintático siga analisando os símbolos recebidos enquanto não chegar ao final das linhas de código do programa em Pituguês.&lt;/p&gt;

&lt;p&gt;O objetivo principal desta função é que os símbolos trazidos pelo Lexador sejam traduzidos em declarações pelo Avaliador Sintático e é isto que será feito dentro deste laço de repetição, pois dentro dele teremos uma linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É aqui que o código vai começar a análise de cada um dos símbolos recebidos para depois instanciarmos o construto referente a declaração que queremos gerar e adicioná-la à nossa lista de declarações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Função &lt;code&gt;resolverDeclaracaoForaDeBloco&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Dentro desta função, o objetivo é verificar se a declaração é de uma função, classe, variável ou expressão. Como no caso da nossa linha de código se trata da instrução imprima, que não vai ser classificada como uma função, classe ou variável, vamos adentrar diretamente na função que irá analisar a instrução vigente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return await this.resolverDeclaracao();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Função &lt;code&gt;resolverDeclaracao&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos nos deparar com algumas verificações que dizem respeito a variáveis, mas, como não estamos analisando uma variável, a nossa linha de código vai entrar em um switch case, logo abaixo, que irá entrar neste trecho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;case tiposDeSimbolos.IMPRIMA:
case tiposDeSimbolos.ESCREVA:
    const simboloEscrevaOuImprima = this.avancarEDevolverAnterior();
    return this.declaracaoEscreva(simboloEscrevaOuImprima);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No nosso artigo sobre o Lexador, ensinamos que quando uma nova palavra-reservada for incluída, também devemos incluir o seu tipo dentro deste &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/tipos-de-simbolos/pitugues.ts" rel="noopener noreferrer"&gt;arquivo&lt;/a&gt;. É exatamente agora que ele vai ser de suma importância para que o Avaliador Sintático consiga buscar o método que irá verificar se a sintaxe do código foi escrita corretamente e gerar o construto e a declaração em questão para fazer parte da AST.&lt;/p&gt;

&lt;p&gt;Antes de irmos adiante no switch case, talvez cause uma ligeira dúvida ao leitor de: “por que estamos sendo direcionados para a função declaracaoEscreva se estamos tratando da função imprima? Por que não uma declaracaoImprima?”.&lt;/p&gt;

&lt;p&gt;A linguagem Pituguês, atualmente, é considerada um dialeto de programação e ela foi desenvolvida dentro do código-fonte de Delégua. Muitas características de Delégua foram herdadas pelo Pituguês, juntamente com os padrões de nomenclatura e assinatura dos métodos desenvolvidos para o Avaliador Sintático de Delégua.&lt;/p&gt;

&lt;p&gt;Geralmente, quando incluímos um dialeto de progamação no ecossistema de Delégua, vamos fazer com que este dialeto herde a classe Avaliador Sintatico Base que vai trazer para o nosso dialeto a assinatura de diversos métodos a serem implementados e por conta desta herança é que será empregada este padrão de nomes dos métodos. É apenas uma questão organizacional.&lt;/p&gt;

&lt;p&gt;De qualquer forma, como o nosso imprima possui o mesmo comportamento do escreva, não precisamos criar um novo método “declaracaoImprima“, por exemplo, para reproduzir esta funcionalidade, basta inserirmos o sinônimo “imprima” no switch case que será direcionado para a construção da declaração em questão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Função &lt;code&gt;declaracaoEscreva&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Após ter reconhecido o símbolo &lt;code&gt;imprima&lt;/code&gt;, entramos na função que irá construir a declaração do método para adicioná-la à AST.&lt;/p&gt;

&lt;p&gt;O que você pode notar é que a função &lt;code&gt;declaracaoEscreva&lt;/code&gt; recebe como argumento o símbolo gerado pelo Lexador e que chegou do Avaliador Sintático e, agora, vamos entrar na verificação para garantir que os itens estão na ordem esperada que se possa construir, finalmente, uma declaração para &lt;code&gt;imprima&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Função &lt;code&gt;consumir&lt;/code&gt;: apenas tem a finalidade de verificar se o símbolo atual corresponde ao parentese esquerdo que precede o texto que nossa função &lt;code&gt;imprima&lt;/code&gt; deverá nos devolver;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;const argumentos [...]&lt;/code&gt;: aqui, é iniciado uma constante que deverá receber um Array de algum construto. Neste caso, será o nosso texto;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos adentrar um laço de repetição que irá começar a verificação do conteúdo que há após a abertura do parenteses, a fim de validar se temos um dado textual;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Função &lt;code&gt;expressao&lt;/code&gt;: ainda estamos dentro de &lt;code&gt;declaracaoEscreva&lt;/code&gt;, mas fomos direcionados para a função &lt;code&gt;expressao&lt;/code&gt; que apenas irá nos enviar para a seguinte;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Função &lt;code&gt;atribuir&lt;/code&gt;: fará uma série de verificações buscando se o símbolo atual, o texto do nosso imprima, é algum tipo de operador (&lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Operadores" rel="noopener noreferrer"&gt;lista de operadores&lt;/a&gt; do Pituguês), no entanto, como ele não irá entrar em nenhuma dessas condições, iremos para o próximo método;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Função &lt;code&gt;chamar&lt;/code&gt;: esta função tem como objetivo identificar chamadas de funções, acesso de funções, acesso por índice e fatiamentos, porém, caso não se enquadre em nenhuma dessas opções, seremos enviados para a próxima função;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Função &lt;code&gt;primario&lt;/code&gt;: finalmente, vamos passar por um switch case para inferir que os argumentos dentro de imprima são do tipo textual, além de retornar e instanciar um construto Literal que é onde estará definido o tipo do dado;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos &lt;code&gt;consumir&lt;/code&gt; novamente para verificar se está ocorrendo o fechamento da função com parenteses direito;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;E, finalmente, o Avaliador Sintático conseguirá instanciar uma &lt;code&gt;declaracaoEscreva&lt;/code&gt; que construirá a função &lt;code&gt;imprima&lt;/code&gt; futuramente, o que nos trará o resultado:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;declaracoes: [
  Escreva {
      linha: 1,
      hashArquivo: -1,
      decoradores: [],
      assinaturaMetodo: '&amp;lt;principal&amp;gt;',
      argumentos: [Array],
      simboloEscreva: [Simbolo]
  }
],
erros: []
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após todo esse percurso percorrido, voltaremos para dentro da função &lt;code&gt;analisar&lt;/code&gt; que terá gerado a nossa declaração para &lt;code&gt;imprima&lt;/code&gt; e irá inseri-lá na AST. A geração da AST pode ser percebida no trecho de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let declaracoes: Declaracao[] = [];
while (!this.estaNoFinal()) {
    const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
    if (retornoDeclaracao === null) {
        continue;
    }
    if (Array.isArray(retornoDeclaracao)) {
        declaracoes = declaracoes.concat(retornoDeclaracao);
    } else {
        declaracoes.push(retornoDeclaracao as Declaracao);
    }
 // Restante do código [...]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para gerar a AST, depois de concluir todo aquele trajeto para conseguir transformar nosso símbolo numa declaração a partir da função &lt;code&gt;resolverDeclaracaoForaDeBloco&lt;/code&gt; e, por fim, enviamos o que foi retornado na variável &lt;code&gt;retornoDeclaracao&lt;/code&gt; por todo aquele processo de validação e enviamos para nosso array de &lt;code&gt;declaracoes&lt;/code&gt; com um &lt;code&gt;push&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Contribua com o Pituguês!
&lt;/h1&gt;

&lt;p&gt;Agora que você sabe o que é um Avaliador Sintático e como ele funciona no Pituguês, você já está apto a contribuir com ele!&lt;/p&gt;

&lt;p&gt;Como comentamos, o código-fonte do Pituguês mora dentro de Delégua, então você irá encontrá-lo &lt;a href="https://github.com/DesignLiquido/delegua" rel="noopener noreferrer"&gt;neste repositório do GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Além disso, também preparamos &lt;a href="https://github.com/DesignLiquido/pitugues-docs/blob/principal/CONTRIBUTING.md" rel="noopener noreferrer"&gt;este documento&lt;/a&gt; que &lt;strong&gt;te guia em como contribuir&lt;/strong&gt; com a linguagem, em que damos uma visão geral da estrutura do código e os arquivos principais para você contribuir com o Pituguês.&lt;/p&gt;

&lt;p&gt;Caso encontre alguma dificuldade, a Design Líquido fez um &lt;a href="https://www.youtube.com/watch?v=lxqY48mDjqQ&amp;amp;t" rel="noopener noreferrer"&gt;vídeo demonstrando como contribuir com um Avaliador Sintático&lt;/a&gt; e você pode pegar inspirações de lá!&lt;/p&gt;

&lt;p&gt;E se você for uma pessoa um pouquinho mais ansiosa e quer entender todas as etapas de desenvolvimento de uma linguagem de programação, te indicamos esta &lt;a href="https://www.youtube.com/watch?v=92RlDyXy5EE&amp;amp;list=PL6y10dwsUMhpnsBj_f3Us-JkRDBwEnq8O" rel="noopener noreferrer"&gt;playlist no YouTube da Design Líquido&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas com o que posso contribuir?
&lt;/h2&gt;

&lt;p&gt;De diversas formas… você pode usar a linguagem e reportar bugs pra gente, pode divulgar a linguagem e até mesmo fazer contribuições diretas no código-fonte…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Dica:&lt;/strong&gt;&lt;br&gt;
Para contribuir com o Avaliador Sintático: investigue e analise os construtos que já existem na linguagem, pense o que mais você incluiria e/ou melhoria e vem contar pra gente!&lt;/p&gt;

&lt;h3&gt;
  
  
  Um pequeno adendo sobre contribuições…
&lt;/h3&gt;

&lt;p&gt;Aderir a boas práticas, registrando no GitHub seu processo de contribuição, é de suma importância! No guia de contribuição que trouxemos para vocês, é ensinado a como buscar por issues para contribuir – ou abrir as próprias issues – e como fazer um PR (Pull Request). Parte da função dessas etapas é deixar documentado e acessível para que outros contribuidores possam acompanhar o desenvolvimento do projeto.&lt;/p&gt;

&lt;p&gt;Aliás, não apenas para que outras pessoas consigam acompanhar o desenrolar do projeto, mas também é uma forma de mostrar para o mundo o seu trabalho! Aqui, na Cumbuca Dev, a gente promove e incentiva a contribuição em projetos de Código Aberto, por ser uma das formas de pessoas iniciantes aprenderem e se desenvolverem na programação, enquanto conquistam experiência real que será super válida para o mercado de trabalho!&lt;/p&gt;

&lt;p&gt;Ou seja, enquanto você consegue participar ativamente, ajudando com o crescimento de um projeto e trocando ideia com outros contribuidores, também consegue desenvolver suas habilidades! E como tudo isso é feito com transparência, você pode facilmente comprovar experiência! ❤&lt;/p&gt;

&lt;h3&gt;
  
  
  E agora?
&lt;/h3&gt;

&lt;p&gt;Bom, agora que você já sabe como funciona e como se programa um Lexador, te convidamos a aprender e testar o Pituguês! 😉​ Escrevemos &lt;a href="https://cumbuca.dev/2025/11/07/vem-com-a-gente-programar-em-portugues/" rel="noopener noreferrer"&gt;este tutorial&lt;/a&gt; para te ensinar a como programar com ele! Além disso, você sempre pode consultar a &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cumbucadev/desafios-pitugues/issues" rel="noopener noreferrer"&gt;Neste repositório&lt;/a&gt; temos descrito alguns desafios para fazer em Pituguês! E se, por caso, tiver qualquer dificuldade com a linguagem, já pode reportar pra gente que te ajudamos!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>tutorial</category>
      <category>community</category>
    </item>
    <item>
      <title>O Lexador do Pituguês – Como Contribuir?</title>
      <dc:creator>Cumbuca Dev</dc:creator>
      <pubDate>Tue, 24 Feb 2026 16:04:09 +0000</pubDate>
      <link>https://dev.to/cumbucadev/o-lexador-do-pitugues-como-contribuir-2na1</link>
      <guid>https://dev.to/cumbucadev/o-lexador-do-pitugues-como-contribuir-2na1</guid>
      <description>&lt;p&gt;No &lt;a href="https://www.tabnews.com.br/maitecumbucadesign/como-programar-uma-linguagem-de-programacao-pitugues" rel="noopener noreferrer"&gt;post anterior&lt;/a&gt; sobre como programar o Pituguês, aprendemos que ela é uma linguagem interpretada e que sua arquitetura de projeto é composta por três camadas: o Lexador, o Avaliador Sintático e o Interpretador. Cada uma delas possui sua responsabilidade para que possamos desenvolver uma linguagem de programação e executá-la e, agora, vamos começar a desbravar um pouquinho de cada uma delas, começando por este artigo em que falaremos do Lexador e mostrar um pouquinho como podemos contribuir com o seu código.&lt;/p&gt;

&lt;p&gt;Mas, primeiramente…&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é um Lexador?
&lt;/h1&gt;

&lt;p&gt;Nada mais é do que um programa que irá percorrer e escanear, da esquerda para a direita, os caracteres da nossa linguagem. Nesta etapa, serão identificados os lexemas (que também podemos chamar de símbolos ou tokens) e seu tipo, seu devido significado naquela instrução.&lt;/p&gt;

&lt;p&gt;Existem diferentes categorias de símbolos…&lt;/p&gt;

&lt;h2&gt;
  
  
  Palavras-reservadas
&lt;/h2&gt;

&lt;p&gt;Também chamadas de &lt;em&gt;keywords&lt;/em&gt;, são palavras que estão presentes na linguagem de programação e são utilizadas para se escrever instruções do que queremos que nosso programa faça. Por exemplo, palavras como “&lt;code&gt;while&lt;/code&gt;“, “&lt;code&gt;for&lt;/code&gt;“, “&lt;code&gt;const&lt;/code&gt;“, “&lt;code&gt;else&lt;/code&gt;” e entre outras que já fazem parte da linguagem e não podem ser usadas para nomear variáveis ou funções.&lt;/p&gt;

&lt;p&gt;Aliás, as funções nativas de uma linguagem também são categorizadas como palavras-reservadas e não podem ser usadas para criar alguma outra instrução. Mas, não se preocupe, caso você não saiba que o nome que você deu a uma variável ou função que já exista na linguagem, ela mesma irá te avisar!&lt;/p&gt;

&lt;p&gt;Então, tomando como o exemplo o Pituguês, se quisermos desenvolver uma função para inverter a ordem de um vetor e queremos nomeá-la com inverter, não será possível, pois &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Estruturas-de-Dados-Elementares#inverter-1" rel="noopener noreferrer"&gt;já existe uma função que leva este nome&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identificadores
&lt;/h2&gt;

&lt;p&gt;É classificação que recebe tudo aquilo que podemos nomear enquanto desenvolvemos um programa! Ou seja, quando damos um nome a uma variável, seu nome é chamado de “identificador”. O mesmo acontece quando nomeamos uma função.&lt;/p&gt;

&lt;p&gt;Se criarmos a função…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;função somar(valor1, valor2):
    retorna valor1 + valor2 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos ter a palavra-reservada função para declaração de funções e, em seguida, o identificador somar. É assim que o Lexador irá reconher o nome da função e categoriza-lo para que seja reconhecido dentro da linguagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constantes
&lt;/h2&gt;

&lt;p&gt;São valores que não sofrem alterações ao longo da execução do programa. Pense que se formos desenvolver um software matemático, o valor do número PI (3,14) jamais poderia ser alterado durante a execução. Linguagens como JavaScript e Delégua permitem que constantes sejam declaradas da seguinte forma:&lt;br&gt;
&lt;code&gt;const valor_de_pi = 3.14;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No entanto, assim como no Python, o Lexador de Pituguês não reconhece ou permite a declaração de constantes como no exemplo de Delégua e JavaScript. Mas isto é algo que pode ser contornado se aplicarmos a convenção do Python no Pituguês que é declarar uma variável em caixa alta:&lt;br&gt;
&lt;code&gt;VALOR_DE_PI = 3.14&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esta convenção fará com que outras pessoas que tiverem contato com o código entendam que aquele dado não deve ser alterado.&lt;/p&gt;

&lt;p&gt;Mesmo que o Lexador do Pituguês não seja capaz de reconhecer constantes, achamos que é importante trazer para nossos leitores que elas ainda são uma forma de se identificar e categorizar dados e que, para que seu reconhecimento seja possível, deve ser incluído na programação de um Lexador (afinal, vai que um dia você mesmo queira desenvolver uma linguagem que use constantes…).&lt;/p&gt;
&lt;h2&gt;
  
  
  Operadores
&lt;/h2&gt;

&lt;p&gt;Outra categoria que um Lexador deve ser capaz de mapear são os operadores. Dentro das linguagens de progamação, teremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Operadores Aritméticos: são os símbolos usados para realizar operações matemáticas – adição, subtração, multiplicação, divisão, módulo e exponenciação. Você pode encontrar os operadores aritméticos (ou matemáticos) que existem no Pituguês na &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Operadores#operadores-matem%C3%A1ticos" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Operadores Relacionais: são os operadores usados para comparação – igual a, diferente de, maior que, menor que, maior ou igual e etc… também temos eles descritos na &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Operadores#operadores-de-compara%C3%A7%C3%A3o" rel="noopener noreferrer"&gt;documentação do Pituguês&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Operadores Lógicos: podem ser símbolos ou palavras-reservadas em que podemos verificar condições, geralmente retornam os valores verdadeiro ou falso. Os símbolos mais utilizados são: AND, &amp;amp;&amp;amp;, OR, || e ! – mas existem outros mais! Na documentação do Pituguês, temos listados os &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Operadores#operadores-l%C3%B3gicos" rel="noopener noreferrer"&gt;operadores lógicos&lt;/a&gt; e os &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Operadores#operadores-bit-a-bit" rel="noopener noreferrer"&gt;operadores bit a bit&lt;/a&gt;, que também podem se encaixar nesta categoria.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Símbolos Especiais
&lt;/h2&gt;

&lt;p&gt;Geralmente são os símbolos usados na estruturação do programa, por exemplo, quando uma linguagem requer que sua instrução seja terminada em ponto e vírgula, ou que a declaração de vetores exige que seus dados devem estar escrito entre colchetes. Nessas situações, o ponto e vírgula e os colchetes seriam os “símbolos especiais” que fazem parte da estrutura da linguagem para a escrita de comandos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lexemas
&lt;/h2&gt;

&lt;p&gt;Nada mais são dos que as strings que correspondem com um típo de símbolo. Por exemplo… quando declaramos uma variável em Pituguês:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nome_da_linguagem = "Pituguês"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Comentamos antes que o nome da variável é reconhecido como identificador, mas ele também vai ser mapeada como um lexema. Então, quando escrevemos esta linha de código em Pituguês e depuramos o Lexador, ele nos trará este retorno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;simbolos: [
    Simbolo {
      tipo: 'IDENTIFICADOR',
      lexema: 'nome_da_linguagem',
      literal: null,
      linha: 1,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'IGUAL',
      lexema: '=',
      literal: null,
      linha: 1,
      hashArquivo: undefined
    },
    Simbolo {
      tipo: 'TEXTO',
      lexema: 'Pituguês',
      literal: 'Pituguês',
      linha: 1,
      hashArquivo: undefined
    }
 ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note o Lexador nos retorna uma lista de símbolos, em formato json, e cada símbolo é mapeado de acordo com seu tipo e seu lexema. Aqui, o lexema é a declaração literal da escrita da instrução!&lt;/p&gt;

&lt;p&gt;Esta etapa é bastante importante para que se tenha a base inicial ao programar uma linguagem de programação, pois a partir da identificação desses lexemas e tipos é que poderemos criar as regras de execução de cada símbolo, baseados na sua função. E isto acontecerá na etapa do Avaliador Sintático.&lt;/p&gt;

&lt;h1&gt;
  
  
  E como eu posso contribuir com a linguagem Pituguês?
&lt;/h1&gt;

&lt;p&gt;O repositório em que podemos encontrar o Pituguês está &lt;a href="https://github.com/DesignLiquido/delegua" rel="noopener noreferrer"&gt;disponível no GitHub&lt;/a&gt;, dentro do projeto Delégua, então, é dentro desse projeto que podemos fazer contribuições diretamente no Pituguês: é onde está seu código fonte.&lt;/p&gt;

&lt;p&gt;Além disso, temos outro repositório em que &lt;a href="https://github.com/DesignLiquido/pitugues-docs/blob/principal/CONTRIBUTING.md" rel="noopener noreferrer"&gt;disponibilizamos um documento&lt;/a&gt; que ensina a como contribuir com a linguagem! Lá você vai encontrar um guia de como criar uma conta no GitHub, um passo a passo de como contribuir com a linguagem e como deve registrar sua contribuição na plataforma.&lt;/p&gt;

&lt;h3&gt;
  
  
  Um pequeno adendo…
&lt;/h3&gt;

&lt;p&gt;Aderir a boas práticas, registrando no GitHub seu processo de contribuição é de suma importância! No guia de contribuição que trouxemos para vocês, é ensinado a como buscar por issues para contribuir – ou abrir as próprias issues – e como fazer um PR (Pull Request). Parte da função dessas etapas é deixar documentado e acessível para que outros contribuidores possam acompanhar o desenvolvimento da linguagem.&lt;/p&gt;

&lt;p&gt;Aliás, não apenas para que outras pessoas consigam acompanhar o desenrolar do projeto, mas também é uma forma de mostrar para o mundo o seu trabalho! Aqui na Cumbuca Dev, a gente promove e incentiva a contribuição em projetos de Código Aberto, por ser uma das formas de pessoas iniciantes aprenderem e se desenvolverem na programação, enquanto conquistam experiência real que será super válida para o mercado de trabalho!&lt;/p&gt;

&lt;p&gt;Ou seja, enquanto você consegue participar ativamente, ajudando com o crescimento de um projeto e trocando ideia com outros contribuidores, também consegue desenvolver suas habilidades! E como tudo isso é feito com transparência, você pode facilmente comprovar experiência! ❤&lt;/p&gt;

&lt;h1&gt;
  
  
  Contribuindo com o Lexador!
&lt;/h1&gt;

&lt;p&gt;No documento que contém o guia de como contribuir, temos esta &lt;a href="https://github.com/DesignLiquido/pitugues-docs/blob/principal/CONTRIBUTING.md#9-estrutura-do-projeto" rel="noopener noreferrer"&gt;seção que trata da Estrutura do Projeto&lt;/a&gt;, nela, temos sinalizados os principais arquivos que estão envolvidos na programação do Pituguês.&lt;/p&gt;

&lt;p&gt;Mantendo o foco no Lexador, queremos trazer um exemplo de contribuição que foi implementado por quem vos escreve, a fim de ilustrar brevemente como adicionar uma funcionalidade neste elemento estrutural do dialeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  No início...
&lt;/h2&gt;

&lt;p&gt;Como Pituguês é um dialeto, muitas estruturas e características acabavam sendo herdadas de Delégua, parecia até uma cópia. O que podemos dizer que “não era considerado muito Pythônico”, uma vez que a proposta do Pituguês é ser um equivalente a Python, enquanto Delégua tem como principais influências Ruby, C# e Kotlin.&lt;/p&gt;

&lt;p&gt;Conforme fui estudando mais o dialeto e seu código, identifiquei que o Pituguês usava a mesma função que Delégua: escreva. Então, na época, como Pessoa Iniciante Contribuidora, isto me deixou um pouco inquieta, pois se queremos aproximar o Pituguês do Python, poderíamos buscar traduções equivalentes em casos como este.&lt;/p&gt;

&lt;p&gt;Dessa forma, veio a ideia de transformar o escreva em imprima, uma tradução um pouco mais direta do print da linguagem na qual Pituguês se inspira.&lt;/p&gt;

&lt;p&gt;Como foi comentado, o Lexador visa identificar os símbolos e seus tipos para que depois sua lógica possa ser implementada no Avaliador Sintático. Precisamos lembrar que o comportamento para uma função chamada imprima já existia na função escreva da linguagem e apenas queríamos adicionar um sinônimo a ela. Portanto, o que precisamos fazer é simplesmente adicionar a palavra “imprima” como uma palavras-reservadas e fazer com que o Lexador a reconheça como parte do Pituguês.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais arquivos eu mexo?
&lt;/h2&gt;

&lt;p&gt;Todo o código-fonte da linguagem está dentro do diretório fontes do projeto e como vamos mexer no Lexador do Pituguês, o caminho para chegar até ele é:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fontes &amp;gt; lexador &amp;gt; dialetos &amp;gt; lexador-pitugues.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro deste arquivo, você vai encontrar uma função chamada mapear. Imagine que você escreveu a seguinte linha de código:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;imprima("Você está aprendendo sobre o Lexador do Pituguês!")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Quando você escreve uma instrução como esta em um editor de código como o VS Code, por exemplo, deve lembrar que escrevemos apenas texto no editor e que esse texto precisa ser traduzido para a linguagem de máquina, como &lt;a href="https://www.tabnews.com.br/maitecumbucadesign/como-programar-uma-linguagem-de-programacao-pitugues" rel="noopener noreferrer"&gt;comentamos neste artigo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nesse contexto, o Lexador é quem fará a primeira etapa de reconhecimento do que há escrito no código, identificando e retornando os tokens ali presentes, com seus respectivos tipos. Basicamente, neste primeiro momento, precisamos apenas identificar os lexemas que compõe a nossa instrução.&lt;/p&gt;

&lt;p&gt;Dentro do Lexador do Pituguês, temos a função &lt;code&gt;mapear&lt;/code&gt; para percorrer todas linhas de código escritas no editor, identificando quando aquele comando é iniciado é encerrado. Assim como também verifica a partir de que momento está o início e o final do código por inteiro.&lt;/p&gt;

&lt;p&gt;Mas ainda não é aqui que vamos adicionar a palavra-reservada &lt;code&gt;imprima&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;Dentro do mapear, temos um trecho de código assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (!this.eFinalDoCodigo()) {
     this.inicioSimbolo = this.atual;
     this.analisarToken();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em resumo, esta instrução está dizendo que “enquanto não for o fim do código, cada token deverá ser analisado”. E é aí aqui que vamos fazer com que o nosso comando imprima seja reconhecido! Através da função &lt;code&gt;analisarToken&lt;/code&gt; no Lexador!&lt;/p&gt;

&lt;p&gt;Esta função vai capturar caractere por caractere da nossa linha de código e vai buscar identificar cada um deles em um longo &lt;code&gt;switch case&lt;/code&gt;. Pode reparar que vamos ter diversos &lt;code&gt;cases&lt;/code&gt; para caracteres diferentes (tabulação, espaçamento, nova linha, ponto e vírgula etc). Caracteres correspondentes às categorias que vimos anteriormente no artigo (palavra-reservadas, identificadores, operadores e símbolos especiais). Ou seja, a partir de um momento que o nosso &lt;code&gt;analisarToken&lt;/code&gt; consegue identificar um desses caracteres, ele vai verificar se há um tipo de símbolo correspondente ao caractere.&lt;/p&gt;

&lt;p&gt;Mas como vamos conseguir identificar a palavra &lt;code&gt;imprima&lt;/code&gt; como palavra-reservada dentro deste &lt;code&gt;switch case&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Ainda dentro do &lt;code&gt;analisarToken&lt;/code&gt;, no final do switch case, temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default:
    if (this.eDigito(caractere)) this.analisarNumero();
    else if (this.eAlfabeto(caractere)) this.identificarPalavraChave();
    else {
         this.erros.push({
                   linha: this.linha + 1,
                   caractere: caractere,
                   mensagem: 'Caractere inesperado.',
          } as ErroLexador);
          this.avancar();
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este trecho vai percorrer os caracteres também, mas seu objetivo é identificar o que é número e o que pode ser alguma letra do alfabeto. Inclusive, note que, na terceira linha, temos uma condição que diz que se haver um conjunto de caracteres, deve ser identificada a palavra chave através da função &lt;code&gt;identificaPalavraChave&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;Bom… vamos para esta função agora… nela, vai haver uma série de verificações quanto a composição da sequência de caracteres, mas a cereja do bolo está quando ela, finalmente, consegue determinar o lexema neste momento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const tipo: string =
    textoPalavraChave in palavrasReservadas
         ? palavrasReservadas[textoPalavraChave]
         : tiposDeSimbolos.IDENTIFICADOR;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui temos o que é chamado de “condição ternária” e está sendo verificado se a palavra que foi escrita no código existe ou não enquanto palavra-reservada.&lt;/p&gt;

&lt;p&gt;Na segunda linha do trecho de código anterior, temos a constante palavraReservada, em que temos dentro dela uma lista de palavras-reservadas. Esta constante é importada de um outro arquivo que está no caminho:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fontes &amp;gt; lexador &amp;gt; dialetos &amp;gt; palavras-reservadas &amp;gt; pitugues.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro da constante, vamos adicionar o nosso “imprima”, porém… temos que declará-lo neste formato:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;imprima: tiposDeSimbolos.IMPRIMA&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você pode conferir a lista de palavras-reservadas neste &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/lexador/dialetos/palavras-reservadas/pitugues.ts" rel="noopener noreferrer"&gt;link do GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Adicionar o imprima nesta lista de palavras-reservadas ainda não é o suficiente, temos que adicionar, também, na lista de objeto tiposDeSimbolos que está no arquivo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fontes &amp;gt; tipos-de-simbolos &amp;gt; pitugues.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você pode dar uma olhadinha &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/fontes/tipos-de-simbolos/pitugues.ts" rel="noopener noreferrer"&gt;neste arquivo&lt;/a&gt; para conferir o formato que devemos adicionar o nosso tipo de símbolo que é:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;IMPRIMA: 'IMPRIMA'&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando nossa adição
&lt;/h2&gt;

&lt;p&gt;Seguindo todos esses passos, você já pode adicionar uma nova palavra-reservada no Lexador do Pituguês, mas a gente ainda precisa garantir que ela está sendo reconhecida pela linguagem e sendo executada corretamente.&lt;/p&gt;

&lt;p&gt;Agora, vamos ir para nosso arquivo de teste do Lexador de Pituguês que você pode encontrar no seguinte caminho, já saindo do fontes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;testes &amp;gt; lexador &amp;gt; dialetos &amp;gt; pitugues &amp;gt; lexador.test.ts&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Já &lt;a href="https://github.com/DesignLiquido/delegua/blob/principal/testes/lexador/dialetos/pitugues/lexador.test.ts" rel="noopener noreferrer"&gt;dentro do arquivo&lt;/a&gt;, queremos saber se o Lexador já está identificando imprima como nova palavra-reservada, então devemos elaborar um teste unitário e executá-lo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;it('Sucesso - imprima', () =&amp;gt; {
    const resultado = lexador.mapear(
        ["imprima('Você está aprendendo sobre o Lexador do Pituguês!')"],
        -1
    );
    expect(resultado).toBeTruthy();
    expect(resultado.simbolos).toHaveLength(4);
    expect(resultado.simbolos).toEqual(
        expect.arrayContaining([
            expect.objectContaining({ tipo: 'IMPRIMA' }),
            expect.objectContaining({ tipo: 'PARENTESE_ESQUERDO' }),
            expect.objectContaining({ tipo: 'TEXTO' }),
            expect.objectContaining({ tipo: 'PARENTESE_DIREITO' }),
        ])
    );
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No teste para o Lexador, note que estamos apenas verificando se contém os tipos de símbolos esperados naquela linha de código. É apenas isto que precisamos fazer com o Lexador: verificar se nossos símbolos estão sendo reconhecidos como previsto.&lt;/p&gt;

&lt;p&gt;Após adicionar o teste, logo acima dele, no VS Code, você verá escrito Run | Debug e você pode clicar no Run para executar o teste e ver se ele é aprovado. Caso ele passar nos testes unitários, podemos enviar nossa contribuição para o repositório do projeto.&lt;/p&gt;

&lt;p&gt;A Design Líquido já fez um vídeo ensinando a programar um Lexador &lt;a href="https://www.youtube.com/watch?v=92RlDyXy5EE" rel="noopener noreferrer"&gt;neste vídeo do YouTube&lt;/a&gt;! Você pode dar uma conferida nele para ver como é todo o processo em ação.&lt;/p&gt;

&lt;p&gt;Lembrando que também temos este guia de como você pode fazer sua contribuições no código-fonte da linguagem!&lt;/p&gt;

&lt;h1&gt;
  
  
  E agora?
&lt;/h1&gt;

&lt;p&gt;Bom, agora que você já sabe como funciona e como se programa um Lexador, te convidamos a aprender e testar o Pituguês! 😉​ Escrevemos &lt;a href="https://cumbuca.dev/2025/11/07/vem-com-a-gente-programar-em-portugues/" rel="noopener noreferrer"&gt;este tutorial&lt;/a&gt; para te ensinar a como programar com ele! Além disso, você sempre pode consultar a documentação!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cumbucadev/desafios-pitugues/issues" rel="noopener noreferrer"&gt;Neste repositório&lt;/a&gt; temos descrito alguns desafios para fazer em Pituguês! E se, por caso, tiver qualquer dificuldade com a linguagem, já pode reportar pra gente que te ajudamos!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>python</category>
      <category>learning</category>
    </item>
    <item>
      <title>Como programar uma linguagem de programação? - Pituguês</title>
      <dc:creator>Cumbuca Dev</dc:creator>
      <pubDate>Fri, 06 Feb 2026 17:53:27 +0000</pubDate>
      <link>https://dev.to/cumbucadev/como-programar-uma-linguagem-de-programacao-pitugues-288j</link>
      <guid>https://dev.to/cumbucadev/como-programar-uma-linguagem-de-programacao-pitugues-288j</guid>
      <description>&lt;p&gt;Há poucos tempo, trouxe &lt;a href="https://www.tabnews.com.br/maitecumbucadesign/programando-em-pitugues-uma-linguagem-inspirada-em-python" rel="noopener noreferrer"&gt;aqui&lt;/a&gt; para o TabNews uma apresentação e tutorial da linguagem Pituguês. Mas lembram que também contamos que seu código-fonte é aberto? Isto significa que qualquer pessoa pode participar do desenvolvimento da linguagem, é o que chamamos de “Comunidade de Código Aberto (ou Open Source)”.&lt;/p&gt;

&lt;h2&gt;
  
  
  E como faço para participar da Comunidade de Código Aberto?
&lt;/h2&gt;

&lt;p&gt;Basta se voluntariar para ajudar em algum projeto que você tenha interesse e buscar formas de contato com as pessoas que já estão envolvidas com o projeto, seja por fóruns, redes sociais, e-mails e etc.&lt;/p&gt;

&lt;p&gt;Nesse sentido o GitHub também cumpre um papel importante para projetos de código aberto, pois podemos fazer discussões por lá, escrever documentação dos projetos, fazer nossas contribuições, deixar organizado e registrado o que e como a comunidade pode ajudar e por aí vai…&lt;/p&gt;

&lt;p&gt;As participações vão desde comentários, trazer suas dúvidas, sugestões, reportar imprevistos ao usar a linguagem, escrever e divulgar sobre ela ou, caso a pessoa se sinta a vontade, pode ajudar fazendo alterações no próprio código fonte da linguagem. Dentro do Código Aberto, cada pessoa pode colaborar com o pouquinho que lhe cabe e toda a contribuição é importante, válida e ajuda o projeto a crescer!&lt;/p&gt;

&lt;h1&gt;
  
  
  E como contribuir com o Pituguês?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Primeiramente, precisamos entender onde está o Pituguês!
&lt;/h2&gt;

&lt;p&gt;O Pituguês é uma das linguagens de programação que existem dentro de um projeto maior que é a linguagem Delégua. Como o código-fonte de Pituguês está em &lt;a href="https://pt.wikipedia.org/wiki/Del%C3%A9gua" rel="noopener noreferrer"&gt;Delégua&lt;/a&gt;, podemos dizer que ele é, até o momento, mais um “dialeto de programação”, pois ele acaba por ser uma variante de uma linguagem maior.&lt;/p&gt;

&lt;p&gt;Dialetos nada mais são do que variações de uma mesma língua, e na programação essa lógica também se aplica. Pense em um país continental como o Brasil, dividido em 5 regiões e com 27 estados (incluindo o Distrito Federal). Embora existam discussões no campo da linguística se as variações do português no Brasil sejam dialetos ou apenas sotaques, é inegável que podemos notar diferenças bem acentuadas de expressões, palavras e entonações entre regiões diferentes ao ponto de um nortista ter dificuldade de entender a fala de um sulista e vice-versa. Esta pequena diferença linguística entre pessoas oriundas de diferentes regiões de um mesmo país, que geram um contratempo comunicacional, pode ser classificada como um dialeto.&lt;/p&gt;

&lt;p&gt;E, talvez você não saiba, mas já tenha tido contato com dialetos de outras linguagens de programação! Podemos dizer que TypeScript seria um dialeto de JavaScript, por exemplo, uma vez que usa toda a sintaxe do JavaScript e adiciona a tipagem à linguagem.&lt;/p&gt;

&lt;p&gt;Outro exemplo interessante são os dialetos PL/SQL e PL/pgSQL que unem a lógica de programação procedural com linguagem de consulta. Se você for comparar, eles são bastante similares, mas ainda possuem diferenças em sua sintaxe que são bem características e que demarcam sua distinção.&lt;/p&gt;

&lt;p&gt;Se formos comparar as funções nativas de &lt;a href="https://github.com/DesignLiquido/delegua/wiki/Fun%C3%A7%C3%B5es-nativas" rel="noopener noreferrer"&gt;Delégua&lt;/a&gt; e &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Fun%C3%A7%C3%B5es-Nativas" rel="noopener noreferrer"&gt;Pituguês&lt;/a&gt;, percebemos que ambas possuem funções com nomes iguais ou semelhantes. No entanto, a forma de declaração de variáveis e definição de bloco de código são diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delégua
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Declaração de variáveis requer a palavra-reservada &lt;code&gt;var&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Blocos de código são definidos entre par de chaves &lt;code&gt;{&lt;/code&gt; &lt;code&gt;}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pituguês
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Seguimos o modelo de Python em que apenas nomeamos a variável e atribuímos um valor&lt;/li&gt;
&lt;li&gt;Blocos de código são definidos após dois pontos e identancão&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Onde fica o código-fonte de Pituguês e como ele é organizado?
&lt;/h1&gt;

&lt;p&gt;Comentamos repetidas vezes que ele é um dialeto de Delégua e que vive dentro do código-fonte de Delégua. Você pode encontrar o &lt;a href="https://github.com/DesignLiquido/delegua" rel="noopener noreferrer"&gt;repositório do núcleo de Delégua disponível no Github&lt;/a&gt; e, além disso, também está disponibilizado este &lt;a href="https://github.com/DesignLiquido/pitugues-docs/blob/principal/CONTRIBUTING.md" rel="noopener noreferrer"&gt;tutorial de como contribuir com o Pituguês&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas, antes, o que a gente precisa entender é como a linguagem tem seu código arquitetado e organizado! Lembrando que estamos programando uma linguagem de programação e que existem dois tipos principais de linguagens de programação: a compilada e a interpretada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagem Compilada
&lt;/h2&gt;

&lt;p&gt;Geralmente, quando construímos um software, a pessoa desenvolvedora irá escrever o código do programa com o que chamamos de “linguagem de alto nível”. Isto significa que se trata de uma linguagem de programação mais próxima à linguagem humana, de mais fácil leitura e entendimento para quem está lidando com aquele código.&lt;/p&gt;

&lt;p&gt;Por essa lógica, podemos presumir que “quanto mais baixo o nível, mais distante da linguagem humana”… O que é bem verdade!&lt;/p&gt;

&lt;p&gt;Só que quando programamos algo, estamos criando programas para serem executados em máquinas e elas não falam a mesma língua que a gente! Elas só entendem linguagens de baixo nível, que vem a ser o que chamamos de “linguagem de máquina” ou “linguagem binária”.&lt;/p&gt;

&lt;p&gt;É a famosa linguagem composta de zeros e uns, em que eles representam o estado da eletricidade – desligado ou ligado. Convenhamos que ela realmente não é muito acessível para se escrever um programa…&lt;/p&gt;

&lt;p&gt;O ponto é que, nas linguagens compiladas, a gente consegue escrever programas de uma forma que é acessível para pessoas, mas ainda não é para a máquina. Então, após o programa ser desenvolvido por inteiro, é aí que entra o papel do compilador que vai fazer no nosso código passar por um processo que, normalmente, é chamado de “build” (construir) e que irá traduzir o nosso código da linguagem humana para a linguagem de máquina. Só assim vamos conseguir executar o programa na máquina.&lt;/p&gt;

&lt;p&gt;E isso pode acontecer sucessivamente, pois cada vez que identificamos algum bug ou queremos atualizar ou editar algo no código, vamos ter que fazer todo esse processo de reconstruir o código para criar um arquivo executável dele que a máquina consiga rodar.&lt;/p&gt;

&lt;p&gt;Um detalhe bastante interessante é que as linguagens compiladas elas te ajudam a identificar erros de sintaxe na escrita do código, pois, se houver qualquer erro, elas vão impedir o processo de compilação – a construção do programa -, já que ele não conseguirá ser executado de jeito nenhum.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagem Interpretada
&lt;/h2&gt;

&lt;p&gt;Já aqui, nas linguagens interpretadas, ainda que o programa precise ser traduzido para código de máquina, as instruções serão executadas ao mesmo tempo em que a linha de código é lida. É como se fosse uma tradução simultânea.&lt;/p&gt;

&lt;p&gt;As linguagens compiladas nos avisam quando encontram um erro que as impede de construir o programa. Já as linguagens interpretadas, quando o interpretador esbarra numa linha de código que possui um bug, ou alguma inconsistência, simplesmente quebram e interrompem o a execução.&lt;/p&gt;

&lt;p&gt;Por um lado, ela nos dá uma certa vantagem de que não precisamos compilar nosso código, reconstruindo o programa, toda vez que for necessário fazer alguma alteração nele. Ela acaba nos dando mais flexibilidade e agilidade na edição do algoritmo, embora sua execução possa ficar um pouco comprometida.&lt;/p&gt;

&lt;p&gt;Outra diferença importante é que o interpretador pode tanto traduzir a linguagem de alto nível direto para a linguagem de máquina, como pode haver uma linguagem intermediária que esta irá traduzir para o código de máquina.&lt;/p&gt;

&lt;p&gt;Afinal, como é programado o Pituguês?&lt;/p&gt;

&lt;p&gt;Bom, acabamos de ver, de forma resumida, quais são os dois principais de tipos de linguagens de programação. E isso é bastante importante para sabermos como programar a nossa linguagem!&lt;/p&gt;

&lt;p&gt;Mas… qual delas é o Pituguês?&lt;/p&gt;

&lt;p&gt;No próprio código-fonte, é descrito como é organizada a arquitetura da linguagem, com os componentes: lexador, avaliador sintático e, finalmente, interpretador. Dessa forma, podemos presumir que ela é uma linguagem interpretada, uma vez que sua arquitetura possui um interpretador.&lt;/p&gt;

&lt;p&gt;Cada um dos componentes mencionados é responsável por uma etapa do processo que faz com que as instruções escritas em Pituguês sejam traduzidas para o código de máquina, permitindo que um programa desenvolvido nesta linguagem possa ser efetivamente executado. Vamos entender um pouquinho deles…?&lt;/p&gt;

&lt;h2&gt;
  
  
  Lexador
&lt;/h2&gt;

&lt;p&gt;A Design Líquido escolheu a palavra “Lexador” para traduzir o que normalmente é chamado de “Lexer” e/ou “Tokenizer”, mas você ainda pode encontrar outras traduções que irão usar o termo “Analisador Léxico” e/ou “Tokenizador”.&lt;/p&gt;

&lt;p&gt;E qual é a função dele aqui?&lt;/p&gt;

&lt;p&gt;Bom, pense que as linguagens de programação possuem símbolos e termos específicos que usamos para conseguirmos elaborar instruções e construir um programa para a finalidade que queremos. Todo esse arcabouço de recursos precisa ser mapeado e reconhecido como um item que faz parte daquela linguagem e é o Lexador que cumprirá este papel.&lt;/p&gt;

&lt;p&gt;Por exemplo, quando queremos declarar uma variável no Pituguês:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nome_da_linguagem = "Pituguês"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O Lexador vai percorrer cada caractere existente nesta linha de código e mapear cada elemento e sua devida função no código, então, teremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“nome_da_linguagem”: será reconhecido como o “identificador”, o nome da variável;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“=”: a maioria das pessoas nomeia este símbolo como “sinal de igual”, mas no contexto da declaração de variável, o Lexador deverá identifica-lo como um “sinal de atribuição”, pois após ele deverá ser escrito o valor que aquela variável conterá;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Pituguês”: finalmente temos o valor que será guardado pela variável e, neste caso, como o Pituguês é capaz de identificar o tipo de dado por si mesmo, a própria linguagem deverá presumir que se trata de um tipo textual.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja, para o Pituguês aceitar a declaração de uma variável, o Lexador deve conseguir mapear cada um destes elementos, caso contrário, por ser uma linguagem interpretada, o programa irá interromper sua execução abruptamente, enquanto está em processo de execução. Esta mesma lógica é empregada para todas as outras palavras reservadas e símbolos que compõem a linguagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avaliador Sintático
&lt;/h2&gt;

&lt;p&gt;O Avaliador Sintático é a parte do processo que irá fazer a “análise sintática”, identificando se os símbolos estão dispostos na ordem adequada para serem reconhecidos enquanto sentenças que fazem parte da linguagem em questão. Ele vai receber do Lexador os símbolos mapeados e verificar se eles estão estruturados de uma maneira que faça sentido para que se possa executar as instruções do programa.&lt;/p&gt;

&lt;p&gt;E por que essa etapa é tão importante?&lt;/p&gt;

&lt;p&gt;Pense que o único propósito do Lexador é mapear e identificar os tipos de símbolos. Vamos supor que tentamos declarar uma variável escrita na seguinte maneira:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var nome_da_linguagem = "Pituguês"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note que adicionamos a palavra ‘var’ antes do identificador da variável, ‘nome_da_linguagem’, o Lexador ainda consegue reconhecer e identificar os símbolos que existem nesta sequência textual, porém, o Avaliador Sintático vai impedir que esta linha de código seja executada, pois ela não será reconhecida como uma sentença válida.&lt;/p&gt;

&lt;p&gt;E o que faz o Avaliador Sintático reconhecer uma instrução possível ou não? A sua programação! É dentro deste componente estrutural da linguagem de programação que elaboramos e verificamos quais instruções serão válidas: nós programamos o Avaliador Sintático para que não reconheça “var” enquanto uma palavra reservada para declaração de variáveis.&lt;/p&gt;

&lt;p&gt;Esse tipo de comportamento é equivalente ao que encontramos num idioma, por exemplo, ao ler a sentença “Eu batata programo em Pituguês”. Note que temos uma palavra inserida que não faz sentido para a mensagem da frase. Podemos dizer que ela não está seguindo as regras gramaticais do português, uma vez que tempos uma palavra extra deslocada na frase.&lt;/p&gt;

&lt;p&gt;Agora, se escrevermos “eu programo em Pituguês”, os termos estarão conectados e relacionados, tornando a mensagem compreensível! Da mesma forma acontece com linguagens de programação: &lt;strong&gt;seguir suas regras gramaticais é essencial para que se possa construir um programa!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Interpretador
&lt;/h2&gt;

&lt;p&gt;Esta é a etapa da nossa arquitetura que será responsável pela execução do código! Como mencionamos antes, um interpretador é como se fosse uma tradução simultânea em que, conforme nosso interpretador vai lendo linha a linha, suas instruções vão sendo verificadas pelo Avaliador Sintáitco e, se estiverem na estrutura esperada da linguagem, serão executadas.&lt;/p&gt;

&lt;p&gt;Para que a execução seja efetuada, partimos do princípio em que nosso código passou pela aprovação do Lexador e do Avaliador Sintático e, agora, o Interpretador, também, precisará contribuir com a sua aprovação.&lt;/p&gt;

&lt;p&gt;Mas como isso é feito?&lt;/p&gt;

&lt;p&gt;Ele irá receber as declarações que foram identificadas no Avaliador Sintático e que estão seguindo as regras gramaticais esperadas. Caso a gramática não esteja de acordo, é o momento em que a nossa “tradução simultânea” será interrompida abruptamente e a linguagem retornará um erro para nós.&lt;/p&gt;

&lt;p&gt;Devemos lembrar que o Avaliador Sintático fez a verificação gramatical das instruções em Pituguês e, se ela corresponder às normas esperadas, irá gerar uma espécie de Árvore de Análise Sintática, também conhecida como Árvore de Derivação. É papel do Interpretador percorrer essa “árvore” e verificar qual instrução está sendo chamada para execução e, para desempenhar esta função, o Interpretador vai usar um “Design Pattern” conhecido como “Visitor Pattern”, ou “padrão Visitante”.&lt;/p&gt;

&lt;p&gt;É com o padrão Visitante é que o interpretador poderá buscar e identificar a instrução escrita em Pituguês a partir de Árvore de Análise Sintática, no entanto, estes conceitos são um pouco mais complexos e sua aplicabilidade para o Pituguês será tratada mais futuramente. Mas… caso você tenha interesse em já ir conhecendo um pouquinho mais deles, recomendamos a leitura do &lt;a href="https://refactoring.guru/design-patterns/visitor" rel="noopener noreferrer"&gt;artigo Visitor do refactoring.guru&lt;/a&gt; e o trecho de Análise Sintática do ebook &lt;a href="https://johnidm.gitbooks.io/compiladores-para-humanos/content/part1/syntax-analysis.html" rel="noopener noreferrer"&gt;Compiladores para Humanos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recomendamos fortemente que eassista &lt;a href="https://www.youtube.com/watch?v=PgKMZbUGFy8&amp;amp;t" rel="noopener noreferrer"&gt;este vídeo&lt;/a&gt;, produzido pela Design Líquido, demonstrando como cada etapa funciona e se complementa – Lexador, Avaliador Sintático e Interpretador. No vídeo, a demonstração é com a linguagem Delégua, mas a mesma estrutura é utilizada na programação do Pituguês e pode ficar mais claro para você ao ver cada etapa em ação!&lt;/p&gt;

&lt;p&gt;E, só pra reforçar, como vimos antes, nas linguagens interpretadas, elas podem traduzir nosso código diretamente para o código de máquina, ou podem ter um código intermediário que a traduz para o código de máquina.&lt;/p&gt;

&lt;p&gt;No caso do Pituguês, ela é uma linguagem de programação desenvolvida em TypeScript que passará direto para o JavaScript, que é uma linguagem de característica híbrida, o que chamamos de &lt;a href="https://www.freecodecamp.org/portuguese/news/compilacao-just-in-time-explicada/" rel="noopener noreferrer"&gt;Just In Time Compilation (JIT)&lt;/a&gt;, para traduzir/transpilar o Pituguês para a linguagem de máquina e ser executado. O processo de transpilação do JavaScript se dá por uma Máquina Virtual, chamada de V8, para criar o código de máquina e rodar o programa.&lt;/p&gt;

&lt;p&gt;Ou seja, o Pituguês precisa de um intermediário para traduzir seu código em código de máquina e tornar possível a execução de um programa, percorrendo um caminho mais ou menos assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fcumbucadev%2Fblog%2Frefs%2Fheads%2Fmain%2F.gitbook%2Fassets%2FPitugu%25C3%25AAs%2520-%2520Linguagem%2520Interpretada%2520%282%29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fcumbucadev%2Fblog%2Frefs%2Fheads%2Fmain%2F.gitbook%2Fassets%2FPitugu%25C3%25AAs%2520-%2520Linguagem%2520Interpretada%2520%282%29.png" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Falando sobre o futuro…
&lt;/h1&gt;

&lt;p&gt;Até a escrita deste artigo, como comentamos repetidamente, Pituguês é considerado um dialeto, uma vez que ele vive dentro do código-fonte de Delégua. Por ele se encontrar dependende do núcleo de outra linguagem, acaba por ter certas limitações no seu desenvolvimento, principalmente por ambas compartilharem do mesmo Interpretador.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acreditamos que para maior expansão do Pituguês, ele precise “caminhar com suas próprias pernas” e ser oficialmente uma linguagem!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gostaríamos de promover a independência do Pituguês para que, assim como em Python, a comunidade possa ter mais liberdade de contribuir e incrementar tudo aquilo que for benéfico para seus usuários! E, principalmente, sem a preocupação do quanto as contribuições possam afetar outro projeto.&lt;/p&gt;

&lt;p&gt;Te convidamos a trocar uma ideia com a gente futuro do Pituguês neste &lt;a href="https://github.com/DesignLiquido/delegua/discussions/1074" rel="noopener noreferrer"&gt;fórum do GitHub&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Inicialmente, queremos propor as discussões:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quais os primeiros passos para tornar o Pituguês independente?&lt;/li&gt;
&lt;li&gt;Como podemos projetar esta linguagem?&lt;/li&gt;
&lt;li&gt;Aliás, em qual linguagem de programação devemos programar o Pituguês? Continuaríamos com TypeScript ou seria mais interessante escolher outra e por quê?&lt;/li&gt;
&lt;li&gt;Materíamos a arquitetura de: Lexador, Avaliador Sintático e Interpretador?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>community</category>
      <category>opensource</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Programando em Pituguês! - Uma linguagem inspirada em Python</title>
      <dc:creator>Cumbuca Dev</dc:creator>
      <pubDate>Wed, 28 Jan 2026 17:43:48 +0000</pubDate>
      <link>https://dev.to/cumbucadev/programando-em-pitugues-uma-linguagem-inspirada-em-python-49bi</link>
      <guid>https://dev.to/cumbucadev/programando-em-pitugues-uma-linguagem-inspirada-em-python-49bi</guid>
      <description>&lt;p&gt;&lt;code&gt;⚠️ Atenção: Esse texto é uma introdução e tutorial! Divirta-se! :)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Quando começamos a aprender a programar, uma das primeiras descobertas que nos deparamos é que: as linguagens de programação são todas em inglês! Bom, pelo menos as que são utilizadas no mercado de trabalho.&lt;/p&gt;

&lt;p&gt;Estatisticamente falando, apenas 5% dos brasileiros entendem inglês em algum nível, enquanto apenas 1% possui fluência. Ou seja, nem todos os falantes de língua portuguesa tem conhecimento do idioma inglês.&lt;/p&gt;

&lt;p&gt;O que faz com que a pessoa aprendiz passa encontrar barreiras que a faça dispor mais esforço para desenvolver várias habilidades ao mesmo tempo (programar e aprender outro idioma concomitantemente). Ela terá dificuldades de lidar com recursos e instruções da linguagem de programação, o que poderá comprometer sua aprendizagem de lógica e algoritmos.&lt;/p&gt;

&lt;p&gt;Aí tem-se a importância de existir uma linguagem como o Pituguês, em que a pessoa nativa em português consiga programar em sua língua mãe, eliminando a barreira idiomática.&lt;/p&gt;

&lt;h1&gt;
  
  
  Mas de onde vem o Pituguês?
&lt;/h1&gt;

&lt;p&gt;Sua sintaxe é inspirada na da linguagem de programação Python que, embora seu nome faça alusão a uma espécie de cobra e seu símbolo seja composto de duas cobras em Ying &amp;amp; Yang, seus criadores eram muito fãs da série de comédia “Monty Python’s Flying Circus” e batizaram a linguagem com o nome de “Python”.&lt;/p&gt;

&lt;p&gt;Pegando carona até mesmo no nome, se formos traduzir “python”, temos “píton”. Assim, para trazer a ideia de uma linguagem de programação inspirada em Python para a língua portuguesa, uniu-se “píton” + “português” que resultou em: Pituguês!&lt;/p&gt;

&lt;p&gt;E, como comentamos, o Pituguês vai se inspirar e buscar trazer características do Python para português, como…&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipagem Dinâmica
&lt;/h2&gt;

&lt;p&gt;Quando lidamos com linguagem de programação, devemos lembrar que existem tipos diferentes de dados, como dados textuais, numéricos, binários e etc.&lt;/p&gt;

&lt;p&gt;Algumas linguagens exigem que o tipo de dado seja declarado como, por exemplo, em Java, declaramos uma variável da seguinte maneira…&lt;/p&gt;

&lt;p&gt;&lt;code&gt;int numero = 2025;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;String nome = "Java";&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note que, em Java, indicamos o tipo do dado (int, para números inteiro, e String para tipos textuais), escrevemos o nome da variável e, por fim, damos um valor a ela. Se formos comparar com Python, já possui uma diferença acentuada…&lt;/p&gt;

&lt;p&gt;&lt;code&gt;numero = 2025&lt;/code&gt;&lt;br&gt;
&lt;code&gt;nome = "Python"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Como podem ver, já não é necessário indicar o tipo da variável, pois a linguagem irá verificar isso automaticamente, é o que chamamos de “inferir tipo”.&lt;/p&gt;

&lt;p&gt;No Pituguês, não vai ser diferente, a nossa declaração de variáveis também vai inferir o tipo...&lt;/p&gt;

&lt;p&gt;&lt;code&gt;numero = 2025&lt;/code&gt;&lt;br&gt;
&lt;code&gt;nome = "Pituguês"&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Indentação
&lt;/h2&gt;

&lt;p&gt;A indentação nada mais é que o aninhamento de trechos de código que, no caso do Python, se dá através da tabulação (4 espaçamentos), ela tem o objetivo de determinar quais linhas de código pertencem a um bloco lógico, definindo a estrutura e hierarquia.&lt;/p&gt;

&lt;p&gt;Ou seja, declaramos uma função, por exemplo, em seguida, escrevemos os dois pontos e, logo abaixo deles, com certo espaçamento, começamos a escrever o que a nossa função irá executar. Dessa forma que definimos o escopo e a hierarquia do código, determinando em que momento o trecho de código é iniciado e finalizado.&lt;/p&gt;

&lt;p&gt;Caso a indentação não seja feita da maneira correta, sem o espaçamento ou com espaçamento excessivo, o próprio Python irá nos sinalizar com uma mensagem de erro.&lt;/p&gt;

&lt;p&gt;Na documentação do Pituguês você consegue ter acesso a exemplos de como a indentação funciona:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Fun%C3%A7%C3%B5es" rel="noopener noreferrer"&gt;Funções&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/La%C3%A7os-de-Repeti%C3%A7%C3%A3o" rel="noopener noreferrer"&gt;Laços de Repetição&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki/Orienta%C3%A7%C3%A3o-a-Objetos" rel="noopener noreferrer"&gt;Classes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pituguês X Python
&lt;/h2&gt;

&lt;p&gt;Assim como o Python, o Pituguês também é uma linguagem de Código Livre e está aberta a contribuições e, deste a postagem original deste tutorial e introdução a respeito da linguagem, já aconteceram mudanças bastante significativas...&lt;/p&gt;

&lt;h3&gt;
  
  
  Declaração de Variáveis
&lt;/h3&gt;

&lt;p&gt;Há pouco tempo atrás, Pituguês adicionava a palavra &lt;code&gt;var&lt;/code&gt; na declaração de variáveis, o que o distanciava de Python. No entanto, contribuições mais recentes da comunidade fizeram que consigamos declarar variáveis da mesma forma que em Python:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;linguagem_de_programacao = "Pituguês"&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Interpolação de Texto
&lt;/h3&gt;

&lt;p&gt;Em resumo, Pituguês existe no repositório de uma outra linguagem de programação em português chamada Delégua e acabou herdando algumas características dela, como a interpolação:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var linguagemDeProgramacao = "Delégua"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;escreva("Linguagem de programação: ${linguagemDeProgramacao}")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Este tipo de interpolação também se distanciava do Python, mas contribuições recentes trouxeram proximidade entre Pituguês e Python e, agora, a interpolação segue o padrão f-strings:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;linguagem_de_programacao = "Pituguês"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;imprima(f"Linguagem de programação: {linguagemDeProgramacao}")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lembrando que estamos atualização a &lt;a href="https://github.com/DesignLiquido/pitugues-docs/wiki" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; do Pituguês constantemente e, qualquer dúvida que senha sobre a sintaxe, basta consultá-la!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas como programar em Pituguês?
&lt;/h2&gt;

&lt;p&gt;Para programar em Pituguês, basta que você instale uma extensão no VS Code. Se na aba de extensões você procurar por "pitugues", deve encontrar a extensão da Design Líquido que possui todo um ecossistema de linguagens em português como: linguagem de programação, de marcação, de estilo, de consulta e etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cumbuca.dev/2025/11/07/vem-com-a-gente-programar-em-portugues/" rel="noopener noreferrer"&gt;Nesta postagem&lt;/a&gt; você pode encontrar um tutorial semelhante a este, mas que demonstra por imagens como instalar a extensão e como executar seus programar em Pituguês!&lt;/p&gt;

&lt;h2&gt;
  
  
  Lembrando...
&lt;/h2&gt;

&lt;p&gt;O Pituguês é uma iniciativa feita pela comunidade, para a comunidade e toda contribuição conta! 🐍💜&lt;br&gt;
É uma linguagem que está em constante transformação e vocês podem acompanhar junto com a gente todo esse processo!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/DesignLiquido/delegua" rel="noopener noreferrer"&gt;Código fonte do Pituguês no repositório de Delégua&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/DesignLiquido/pitugues-docs/blob/principal/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Manual de Contribuição do Pituguês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Junte-se a nós e ajude a construir o Pituguês — uma linguagem feita com comunidade, propósito e muito coração. 💜&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Hackeando o Inglês: Programando na Língua em que Você Pensa</title>
      <dc:creator>Cumbuca Dev</dc:creator>
      <pubDate>Wed, 28 Jan 2026 17:34:31 +0000</pubDate>
      <link>https://dev.to/cumbucadev/hackeando-o-ingles-programando-na-lingua-em-que-voce-pensa-56e6</link>
      <guid>https://dev.to/cumbucadev/hackeando-o-ingles-programando-na-lingua-em-que-voce-pensa-56e6</guid>
      <description>&lt;p&gt;Ingressar no mercado de tecnologia, cujo idioma utilizado nas linguagens de programação é o inglês costuma ser bastante desafiador para quem ainda não tem conhecimentos da língua. É um cenário que força pessoas iniciantes a aprenderem duas habilidades ao mesmo tempo: a lógica de programação e um novo idioma. E, convenhamos, não são habilidades triviais de aprender…&lt;/p&gt;

&lt;p&gt;A barreira idiomática é uma das causas de desistência de muitas pessoas iniciantes na programação. Imagino que você mesmo tenha tido contato com alguém que comentou sobre a dificuldade com o inglês enquanto tentava aprender a programar, não?&lt;/p&gt;

&lt;p&gt;Buscando ultrapassar essa barreira, a &lt;a href="https://cumbuca.dev/" rel="noopener noreferrer"&gt;Cumbuca Dev&lt;/a&gt; e a &lt;a href="https://www.designliquido.com.br/" rel="noopener noreferrer"&gt;Design Líquido&lt;/a&gt; se uniram para oferecer ferramentas e conteúdo de capacitação técnica que são acessíveis a pessoas falantes da língua portuguesa e podem ser&lt;br&gt;
usadas para fins educacionais ou comerciais e, acima de tudo, são Open Source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas quais são a vantagens de se programar em português, afinal?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facilita a Localização de Erros&lt;/strong&gt;: Programar em português pode tornar mais fácil a localização e correção de erros de código, uma vez que as pessoas desenvolvedoras podem compreender rapidamente o contexto dos problemas;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acessibilidade e Compreensão&lt;/strong&gt;: Programar em sua língua materna, como o português, torna os conceitos de programação mais acessíveis e fáceis de entender, especialmente para iniciantes, reduzindo a barreira de entrada para novas pessoas programadoras;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facilita o Aprendizado&lt;/strong&gt;: A programação em português permite que as aprendizes concentrem-se nos conceitos de programação em vez de lidar com a barreira de um segundo idioma. Isso pode acelerar o processo de aprendizado, especialmente para pessoas que não têm fluência em inglês (considerando que cerca de 95% dos falantes de português nunca tiveram contato com a língua inglesa);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Melhor Comunicação e Documentação&lt;/strong&gt;: Programar em seu idioma nativo leva a uma comunicação mais clara e eficaz com colegas e clientes locais. Além disso, a documentação em português é mais fácil de compreender e seguir;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contribuição para a Identidade Cultural&lt;/strong&gt;: Linguagens de programação em português contribuem para a preservação e fortalecimento da identidade cultural e linguística, promovendo o uso e a adoção do idioma em contextos tecnológicos;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agora, vamos conhecer um pouco mais do ecossistema?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Delégua
&lt;/h3&gt;

&lt;p&gt;Uma linguagem com sintaxe totalmente em português, pensada para tornar a programação mais próxima, inclusiva e acessível para quem fala a nossa língua.&lt;br&gt;
E vai muito além do educacional: com Delégua e o ecossistema da Design Líquido, você pode construirprojetos reais e profissionais 100% em português!&lt;/p&gt;

&lt;h3&gt;
  
  
  LMHT
&lt;/h3&gt;

&lt;p&gt;Inspirada no HTML, LMHT propõe uma estrutura de marcação totalmente em português, facilitando a compreensão e utilização por falantes da nossa língua.&lt;br&gt;
Mais do que uma ponte para quem está começando, a LMHT é uma ferramenta prática para a criação de páginas e sistemas reais, sem barreiras idiomáticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  FolEs
&lt;/h3&gt;

&lt;p&gt;FolEs é a linguagem de folhas de estilo do ecossistema Design Líquido, análoga ao CSS, com sintaxe em português.&lt;br&gt;
Pronta para uso profissional, também torna o aprendizado de estilização muito mais acessível!&lt;/p&gt;

&lt;h3&gt;
  
  
  LinConEs
&lt;/h3&gt;

&lt;p&gt;Linguagem de consulta de banco de dados inspirada no SQL, com comandos e estruturas em português, tornando o trabalho mais acessível para quem fala a nossa língua.&lt;br&gt;
Amplia as oportunidades na área de dados, democratizando o acesso a uma das habilidades mais valorizadas no mercado de tecnologia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Líquido
&lt;/h3&gt;

&lt;p&gt;E, finalmente, o framework que conecta todas as tecnologias da Design Líquido! Com ele, é possível desenvolver aplicações web com um código 100% em português!&lt;br&gt;
Reúne linguagens, ferramentas e documentação pensadas para tornar o desenvolvimento acessível&lt;br&gt;
em português, desde o aprendizado até a produção de soluções profissionais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lembrando que esse ecossistema é de código aberto e você pode encontrá-los &lt;a href="https://github.com/DesignLiquido" rel="noopener noreferrer"&gt;neste link&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Além disso, você também pode contribuir e ajudar os projetos a crescerem!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contribuir com projetos de Código Aberto pode ser uma ótima porta de entrada para uma pessoa iniciante construir experiência, aprender junto à comunidade de código aberto e aumentar network. E, para além da experiência, participar do desenvolvimento de projetos assim tem um gostinho especial de estar construindo algo real e útil que pessoas que nem imaginamos podem se beneficiar!&lt;/p&gt;

&lt;p&gt;A Design Líquido e a Cumbuca Dev acreditam e praticam o código aberto como filosofia de trabalho. *&lt;em&gt;Todo esse ecossistema é feito pela comunidade e para a comunidade!&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Por isso, queremos te convidar a explorar, usar, construir e contribuir com estes projetos! Eles existem para beneficiar nós, falantes da língua portuguesa, tornando mais acessível o ensino e a prática da programação.&lt;/p&gt;

&lt;p&gt;Só assim, em unidade, podemos construir ferramentas que correspondam à nossa realidade!&lt;/p&gt;

&lt;p&gt;E, só para dar aquela reforçadinha: você pode encontrar todos estes projetos no &lt;a href="https://github.com/DesignLiquido" rel="noopener noreferrer"&gt;GitHub da Design Líquido&lt;/a&gt; com toda a documentação de como utilizar e como contribuir, além do canal no YouTube que contém uma série de vídeos demonstrativos, que explicam a estrutura de cada um desses projetos.&lt;/p&gt;

&lt;p&gt;Se você gostou do ecossistema e também acredita que o inglês pode ser uma barreira: dê uma estrela nos repositórios do GitHub ⭐ Isso ajuda mais pessoas a conhecerem este ecossistema e pode abrir portas para quem busca uma entrada na tecnologia.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>news</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
