From 629bae2d7a3985578af6c4b95c7c3e0523d9dcdf Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Fri, 18 Sep 2026 22:06:20 -0300 Subject: [PATCH 01/11] Add AGENTS.md --- AGENTS.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..8744f55c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,90 @@ +# Guia para agentes + +## Visão geral + +G-Portugol é uma implementação em C++ da linguagem didática Portugol. O binário +`gpt` pode interpretar programas, compilá-los para executáveis x86, gerar +assembly e traduzir para C. O projeto usa Autotools, ANTLR 2.x e PCRE2, e deve +continuar compatível com GNU/Linux e Windows/MSYS2. + +## Estrutura do repositório + +- `src/`: ponto de entrada e coordenação do compilador. +- `src/modules/parser/`: lexer, parser e análise semântica. As gramáticas + ANTLR são `lexer.g`, `parser.g` e `semantic.g`. +- `src/modules/interpreter/`: interpretador e depurador. +- `src/modules/x86/`: gerador de assembly x86 e trechos de runtime. +- `src/modules/c_translator/`: tradutor de Portugol para C. +- `lib/base.gpt`: biblioteca padrão da linguagem. +- `test/`: programa de regressão `tester.gpt` e `run_test.sh`. +- `exemplos/`: programas de exemplo. +- `doc/`: páginas de manual e fonte LaTeX do manual. +- `packages/win_setup/`: empacotamento e recursos do instalador Windows. + +## Ambiente, build e testes + +No GNU/Linux, instale as dependências descritas em `HACKING.md`: compilador +C++, make, autoconf, automake, libtool, pkg-config, ANTLR 2.x (`runantlr` e +`antlr-config`), PCRE2 e NASM. + +```bash +autoreconf -i +./configure --prefix=/usr/local +make -j$(nproc) +bash test/run_test.sh +``` + +O teste requer `src/gpt` já compilado. Ele verifica interpretação, compilação +nativa, geração de assembly e, quando disponível, montagem com NASM. Em hosts +que não são x86, a execução do binário nativo é pulada intencionalmente. + +Para uma verificação rápida e manual: + +```bash +src/gpt -i exemplos/olamundo.gpt +src/gpt -o olamundo exemplos/olamundo.gpt && ./olamundo +``` + +Não execute `make install` sem uma razão explícita. Para validar a instalação +sem alterar o sistema, use `make install DESTDIR="$PWD/release"`. + +## Regras para mudanças + +- Mantenha o escopo mínimo e preserve compatibilidade com o estilo C++ já + presente no arquivo modificado; o código legado usa `std::string` exposto por + headers e ponteiros crus em diversos pontos. +- Rode `pre-commit run --all-files` quando disponível. O hook aplica + `clang-format` a C/C++ e também verifica espaços finais, conflitos e arquivos + grandes. +- Ao alterar comportamento da linguagem, adicione ou ajuste um caso em + `test/tester.gpt` (ou crie um teste específico) e execute o script de testes. +- Ao alterar opções da CLI, atualize a ajuda em `src/GPT.cpp` e a documentação + aplicável. +- Preserve os avisos de licença/copyright existentes nos arquivos C++ que forem + modificados. Não troque a licença GPL-2.0 do projeto. + +## ANTLR e arquivos gerados + +As fontes dos walkers, lexer e parser são geradas durante o build e estão em +`BUILT_SOURCES`/`CLEANFILES` nos respectivos `Makefile.am`. Edite as gramáticas +`.g`, não arquivos como `PortugolLexer.cpp`, `PortugolParser.cpp`, +`SemanticWalker.cpp`, `InterpreterWalker.cpp`, `Portugol2CWalker.cpp` ou +`X86Walker.cpp` quando eles tiverem sido gerados localmente. + +Ao mudar uma gramática, faça um build limpo o suficiente para forçar a geração +e confira os consumidores correspondentes. O lexer também distribui +`PortugolTokenTypes.txt` aos módulos de tradução, interpretação e x86. + +## Portabilidade + +- Evite dependências e comandos exclusivos de Linux no código do produto. +- Teste ou considere os caminhos condicionais de Windows ao mexer em arquivos, + processos temporários, assembly e flags de compilação. +- O CI é a referência para os builds Linux e Windows; mantenha `HACKING.md` e + os workflows coerentes quando o processo de build mudar. + +## Antes de concluir + +Relate os arquivos alterados, os comandos de validação executados e qualquer +limitação de ambiente (por exemplo, ANTLR/NASM indisponível). Não inclua +artefatos de build, binários de teste ou arquivos temporários no patch. From 555896b644c9576c2441ef1d4f2f90b2ccda4234 Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Fri, 18 Sep 2026 22:15:35 -0300 Subject: [PATCH 02/11] Add SECURITY.md --- SECURITY.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..962cb49b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,65 @@ +# Política de Segurança + +## Reportando uma vulnerabilidade + +Levamos vulnerabilidades de segurança no G-Portugol a sério. Se você encontrar +um problema de segurança, reporte-o de forma responsável. + +**Não abra uma issue pública no GitHub para relatar uma vulnerabilidade.** + +Em vez disso, use o recurso de relato privado de vulnerabilidade do GitHub: + +1. Abra a aba **Security** do repositório; +2. Selecione **Report a vulnerability**; +3. Envie os detalhes pelo formulário de GitHub Security Advisory. + +Inclua o máximo de informações possível para permitir a reprodução e análise: + +- descrição da vulnerabilidade; +- passos para reproduzir o problema; +- impacto potencial; +- prova de conceito, se disponível; +- versão do G-Portugol, sistema operacional, arquitetura e modo de execução + utilizado (interpretador, compilador, assembly ou tradutor C). + +Confirmaremos o recebimento do relatório assim que possível e trabalharemos com +você para entender e corrigir o problema. + +## Divulgação responsável + +Pedimos que siga práticas de divulgação responsável: + +- não divulgue publicamente a vulnerabilidade antes que ela seja corrigida; +- conceda aos mantenedores tempo razoável para investigar e preparar uma + correção; +- coordene conosco a publicação de advisories, CVEs, posts ou outros materiais + públicos. + +Após a correção, reconheceremos sua contribuição publicamente, a menos que você +prefira permanecer anônimo. + +## Versões com suporte + +Correções de segurança são fornecidas prioritariamente para a versão estável +mais recente. + +| Versão | Suporte | +| --- | --- | +| Última versão estável | ✅ | +| Versões estáveis anteriores | ⚠️ Melhor esforço | +| Versões não suportadas | ❌ | + +Recomendamos manter instalações do G-Portugol atualizadas. + +## Considerações para execução segura + +Programas G-Portugol podem ser interpretados ou compilados para binários +nativos. Trate código de origem de terceiros como não confiável: revise-o e +execute-o em ambiente isolado, com permissões restritas, quando não confiar em +sua procedência. Isso também se aplica aos binários e ao código C gerados pelo +compilador. + +## Agradecimentos + +Agradecemos pesquisadores de segurança e a comunidade de código aberto por +relatos responsáveis que ajudam a tornar o G-Portugol mais seguro. From b8157705d253100145b5fcedfed1c34c3389758e Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Fri, 18 Sep 2026 22:24:01 -0300 Subject: [PATCH 03/11] Add CONTRIBUTING.md --- CONTRIBUTING.md | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..2013a11a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,108 @@ +# Contribuindo para o G-Portugol + +Obrigado por considerar contribuir com o G-Portugol. São bem-vindas correções, +melhorias na linguagem e no compilador, testes, exemplos e documentação. + +## Antes de começar + +- Pesquise issues e pull requests existentes para evitar trabalho duplicado. +- Para uma dúvida, ideia ampla ou proposta de mudança de linguagem, abra uma + issue antes de investir em uma implementação grande. +- Para uma vulnerabilidade, siga a [política de segurança](SECURITY.md); não a + reporte em uma issue pública. + +## Ambiente de desenvolvimento + +As dependências e as instruções completas para GNU/Linux e Windows/MSYS2 estão +em [HACKING.md](HACKING.md). Em GNU/Linux, o fluxo usual é: + +```bash +git clone https://github.com/gportugol/gpt.git +cd gpt +autoreconf -i +./configure --prefix=/usr/local +make -j$(nproc) +bash test/run_test.sh +``` + +O projeto requer ANTLR 2.x, PCRE2, Autotools, um compilador C++ e NASM. O +script de testes verifica interpretação, compilação nativa, geração de assembly +e, quando possível, montagem com NASM. Em máquinas que não são x86, a execução +do binário nativo é pulada. + +## Fazendo uma alteração + +1. Crie uma branch a partir da versão atual do repositório. +2. Faça uma alteração pequena e focada, preservando o estilo do código ao redor. +3. Acrescente ou atualize testes que demonstrem a correção ou o recurso novo. +4. Execute as verificações locais descritas abaixo. +5. Envie um pull request com uma descrição clara. + +Não inclua binários, diretórios de build, arquivos temporários ou outros +artefatos gerados no pull request. + +### Código C++ + +- O código-fonte deve permanecer compatível com GNU/Linux e Windows/MSYS2. +- Preserve os avisos de licença/copyright existentes nos arquivos modificados. +- Use UTF-8 para fontes, exemplos e documentação. +- A configuração de pre-commit aplica `clang-format` a arquivos C/C++ e verifica + espaços finais, conflitos de merge e arquivos grandes. Execute, quando + disponível: + + ```bash + pre-commit run --all-files + ``` + +### Gramáticas ANTLR + +Os arquivos em `src/modules/parser/`, `interpreter/`, `c_translator/` e `x86` +incluem fontes geradas durante o build. Para alterar a sintaxe ou os walkers, +edite as gramáticas `.g` correspondentes, não os arquivos gerados como +`PortugolLexer.cpp`, `PortugolParser.cpp`, `SemanticWalker.cpp`, +`InterpreterWalker.cpp`, `Portugol2CWalker.cpp` ou `X86Walker.cpp`. + +Após mudar uma gramática, execute um build que force a regeneração e teste todos +os modos de execução afetados. O lexer gera tipos de token consumidos pelos +módulos de tradução, interpretação e x86. + +### Testes e exemplos + +Adicione casos de regressão em `test/tester.gpt` quando for adequado, ou crie um +teste específico em `test/`. Para alterações que afetem o comportamento da +linguagem, cubra tanto o comportamento esperado quanto o caso que antes falhava. + +Você pode testar manualmente um exemplo compilado: + +```bash +src/gpt -i exemplos/olamundo.gpt +src/gpt -o olamundo exemplos/olamundo.gpt && ./olamundo +``` + +Remova o executável temporário depois do teste. + +### Documentação + +Atualize a documentação junto com mudanças visíveis aos usuários: + +- opções de linha de comando: `README.md`, manual e páginas man aplicáveis; +- sintaxe ou semântica: manual em `doc/manual/` e exemplos, se necessário; +- instruções de build: `HACKING.md` e workflows de CI, quando aplicável. + +## Pull requests + +Na descrição do pull request, informe: + +- o problema resolvido e a abordagem adotada; +- impactos de compatibilidade ou mudanças de comportamento; +- testes e comandos de validação executados; +- limitações de ambiente, se houver, como ausência de ANTLR ou NASM. + +Mantenha o pull request focado; separe refatorações não relacionadas. O CI +executa build e testes em Linux e Windows, além das verificações de pre-commit. +Responda aos comentários de revisão e atualize o patch quando necessário. + +## Licença + +Ao enviar uma contribuição, você concorda que ela será distribuída sob a +[GNU General Public License v2](COPYING), licença do projeto. From 4fefc2138f2925ddec989f9f89a06a4ca7155c9b Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Mon, 21 Sep 2026 23:34:29 -0300 Subject: [PATCH 04/11] Ship all top-level docs with the package AGENTS.md, CONTRIBUTING.md, SECURITY.md and INSTALL.md were missing from doc_DATA, so they were left out of "make dist" and "make install". The Windows installer script gets the same list and drops its references to README.pt_BR and NEWS, which no longer exist. --- Makefile.am | 3 ++- packages/win_setup/setup.iss | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index fcab57c9..b2532891 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,8 @@ SUBDIRS = src doc exemplos lib docdir = $(datadir)/doc/$(PACKAGE) -doc_DATA = README.md README.en.md CHANGELOG.md HACKING.md NEWS.md THANKS +doc_DATA = AGENTS.md CHANGELOG.md CONTRIBUTING.md HACKING.md INSTALL.md \ + NEWS.md README.md README.en.md SECURITY.md THANKS EXTRA_DIST = INSTALL.default $(doc_DATA) diff --git a/packages/win_setup/setup.iss b/packages/win_setup/setup.iss index f8f8d6ba..66b8513c 100644 --- a/packages/win_setup/setup.iss +++ b/packages/win_setup/setup.iss @@ -29,12 +29,19 @@ Source: "bin\nasm.exe"; DestDir: "{app}\bin" Source: "bin\gptshell.bat"; DestDir: "{app}\bin" Source: "..\..\lib\base.gpt"; DestDir: "{app}\lib" Source: "..\..\exemplos\olamundo.gpt"; DestDir: "{app}\codigos" -Source: "..\..\README.pt_BR"; DestName: "LEIAME.txt"; DestDir: "{app}\doc"; Flags: isreadme +Source: "..\..\README.md"; DestName: "LEIAME.txt"; DestDir: "{app}\doc"; Flags: isreadme Source: "copy\BSD.COPYING.txt"; DestDir: "{app}\doc" Source: "copy\GNU.COPYING.txt"; DestDir: "{app}\doc" Source: "..\..\AUTHORS"; DestName: "AUTORES.txt"; DestDir: "{app}\doc" Source: "..\..\THANKS"; DestName: "AGRADECIMENTOS.txt"; DestDir: "{app}\doc" -Source: "..\..\NEWS"; DestName: "MUDANÇAS.txt"; DestDir: "{app}\doc" +Source: "..\..\NEWS.md"; DestName: "MUDANÇAS.txt"; DestDir: "{app}\doc" +Source: "..\..\README.en.md"; DestDir: "{app}\doc" +Source: "..\..\INSTALL.md"; DestDir: "{app}\doc" +Source: "..\..\CHANGELOG.md"; DestDir: "{app}\doc" +Source: "..\..\HACKING.md"; DestDir: "{app}\doc" +Source: "..\..\AGENTS.md"; DestDir: "{app}\doc" +Source: "..\..\CONTRIBUTING.md"; DestDir: "{app}\doc" +Source: "..\..\SECURITY.md"; DestDir: "{app}\doc" Source: "..\..\doc\manual\manual.pdf"; DestName: "G-Portugol - Manual.pdf"; DestDir: "{app}\doc" From 8b04183f5d860e9fa2ac560a8817e4d66dfbbe50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Bregu=C3=AAz?= Date: Fri, 18 Sep 2026 18:51:49 -0300 Subject: [PATCH 05/11] =?UTF-8?q?N=C3=A3o=20emite=20convers=C3=A3o=20de=20?= =?UTF-8?q?tipo=20no=20"retorne"=20sem=20valor=20(issue=20#29)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A regra `stm_ret` de `src/modules/x86/x86.g` declarava `int etype;` sem inicializar e chamava `x86.writeCast(etype, expecting_type)` também na alternativa `TI_NULL` — o `retorne;` sem valor —, na qual `etype` nunca é atribuída. `X86::writeCast` (`src/modules/x86/X86.cpp:380` e `:386`) compara esse valor com `TIPO_REAL` para decidir se emite a sequência de truncamento x87, então lixo de pilha decidia o que entrava no assembly. Não é caminho de erro: `test/tester.gpt:655` (`funcao_void()`, que termina em `retorne;`) já exercita isso. Medido em ubuntu:24.04/aarch64, build `-O0 -g`, com valgrind sobre `test/tester.gpt`: antes, `gpt -s`: 2 errors from 2 contexts X86::writeCast (X86.cpp:380) <- X86Walker::stm_ret (X86Walker.cpp:901) X86::writeCast (X86.cpp:386) <- X86Walker::stm_ret (X86Walker.cpp:901) depois, `gpt -s`: 0 errors from 0 contexts (o mesmo par some em `gpt -o`: 2 -> 0) A correção é não chamar `writeCast` quando não houve expressão de retorno, em vez de só inicializar a variável: sem expressão não há valor na pilha para converter — de fato o `pop eax` acima já é pulado quando `expecting_type == TIPO_NULO`. `etype` também passa a nascer `TIPO_NULO`, como defesa. Que o valor lido de fato alterava a saída foi comprovado por mutação: forçando `int etype=TIPO_REAL;` na mesma regra, `tester.asm` ganha 10 instruções x87 (`fnstcw`/`fld`/`fistp`/`fldcw`) no epílogo de `_funcao_void`. Com a correção, o assembly de `test/tester.gpt` e dos três `exemplos/*.gpt` é idêntico ao de antes, e `bash test/run_test.sh` passa antes e depois. Co-Authored-By: Claude Opus 5 (1M context) --- src/modules/x86/x86.g | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/x86/x86.g b/src/modules/x86/x86.g index 7726fe2f..4a6693ef 100644 --- a/src/modules/x86/x86.g +++ b/src/modules/x86/x86.g @@ -336,7 +336,8 @@ fcall[int expct_type] returns [int type] stm_ret { int expecting_type=TIPO_NULO; - int etype; + int etype=TIPO_NULO; + bool hasRetExpr=false; bool isGlobalEscope = (x86.currentScope()==SymbolTable::GlobalScope); if (isGlobalEscope){ expecting_type = TIPO_INTEIRO; // o retorno no bloco principal é do TIPO_INTEIRO @@ -344,7 +345,7 @@ stm_ret expecting_type = stable.getSymbol(SymbolTable::GlobalScope, x86.currentScope(), true).type.primitiveType(); } } - : #(T_KW_RETORNE (TI_NULL|etype=expr[expecting_type])) + : #(T_KW_RETORNE (TI_NULL|etype=expr[expecting_type] {hasRetExpr=true;})) { if (isGlobalEscope){ x86.writeTEXT("pop ecx"); @@ -357,7 +358,8 @@ stm_ret x86.writeTEXT("addarg eax"); x86.writeTEXT("call clone_literal"); x86.writeTEXT("clargs 1"); - } else { + } else if(hasRetExpr) { + // sem expressão de retorno não há valor a converter x86.writeCast(etype, expecting_type); } From 8089e2ea8e3ed5b03dec3d66197364f24c3fe971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Bregu=C3=AAz?= Date: Fri, 18 Sep 2026 16:11:15 -0300 Subject: [PATCH 06/11] CI: uma execucao por commit em vez de duas (issue #9) `build-on-push.yml` e `pre-commit.yml` declaravam `push` e `pull_request` ambos sem filtro de branch. Um push num branch que tem PR aberto dispara os dois eventos, e o mesmo commit era construido duas vezes -- como se ve em https://github.com/gportugol/gpt/pull/8/checks. Com `push` restrito ao `master`, cada commit passa uma vez so: branch de PR pelo evento `pull_request`, e `master` pelo `push`. ## O que muda para quem empurra branch sem PR Antes, um push em qualquer branch construia. Agora constroi quando o PR existe. E o comportamento que a issue pede ("apenas uma execucao de build por commit quando o PR e criado ou atualizado") e o padrao recomendado pela propria documentacao do GitHub Actions, mas e uma mudanca de habito -- vale dizer em voz alta em vez de deixar a pessoa descobrir. Quem quiser manter o build em branch solto pode trocar por `push: branches-ignore: [master]` mais `pull_request`, que tambem evita a duplicata, ao custo de nao construir o merge-commit do PR. ## O `concurrency` Um push novo cancela a execucao anterior DO MESMO BRANCH. Sem isso, tres commits seguidos deixam tres builds na fila e quem empurrou espera os tres, sendo que so o ultimo interessa. No `master` o cancelamento fica DESLIGADO de proposito: ali cada commit e um estado publicado, e perder o resultado de um deles esconderia uma quebra. Fecha #9. --- .github/workflows/build-on-push.yml | 9 ++++++--- .github/workflows/pre-commit.yml | 6 ++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-on-push.yml b/.github/workflows/build-on-push.yml index 8388cbea..517dabd9 100644 --- a/.github/workflows/build-on-push.yml +++ b/.github/workflows/build-on-push.yml @@ -3,10 +3,13 @@ name: Build on Commit on: push: branches: - - "*" + - master pull_request: - branches: - - "*" + workflow_dispatch: + +concurrency: + group: build-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} + cancel-in-progress: true jobs: build: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 5ffd9a2f..4f20646e 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -2,8 +2,14 @@ name: pre-commit on: push: + branches: + - master pull_request: +concurrency: + group: pre-commit-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} + cancel-in-progress: true + jobs: pre-commit: runs-on: ubuntu-latest From 159526e92fb588b1c26bfbf6f12d824047794b12 Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Thu, 24 Sep 2026 10:11:29 -0300 Subject: [PATCH 07/11] Add a regression suite covering the three execution modes test/run_test.sh only checked that tester.gpt exits with 42 when interpreted and as a native binary, and that the assembly and the C translation get generated. It now runs every program in test/casos through the interpreter, the native binary and the C translation compiled with gcc, comparing stdout and exit code with recorded outputs, checks that every program in test/erros is rejected with the recorded message, and fails when NASM rejects the -s assembly instead of only warning. The suite exposed two Windows bugs, fixed here: the Win32 runtime printed with WriteConsoleA, which fails on a redirected handle, so gpt -o binaries wrote nothing to a file or a pipe (it now uses WriteFile), and GPTDisplay::toOEM left no room for the terminating null, writing one byte past its buffer on pure ASCII messages. The expected outputs are what the current ANTLR2 build produces, known flaws included (doubled periods, cascading syntax errors), so that a later change of parser shows each behaviour change as a diff of these files. Mode-specific expected files cover the places where the backends already disagree, and the pre-commit whitespace hooks skip the expected outputs, which are compared byte by byte. A missing NASM stays an explicit skip, and nasm assembles x86 on any host, so only running the native binary is skipped outside x86. The toOEM overflow only surfaced with the MSYS2 GCC 16 build on CI; a MinGW GCC 14 build under Wine does not reproduce it. --- .pre-commit-config.yaml | 4 + AGENTS.md | 17 +- CHANGELOG.md | 8 + CONTRIBUTING.md | 16 +- HACKING.md | 8 + src/modules/GPTDisplay.cpp | 10 +- src/modules/x86/asm_win32.h | 9 +- test/casos/_multifile_lib.gpt | 4 + test/casos/arith.gpt | 28 ++ test/casos/arith.saida | 23 ++ test/casos/arith.saida.c | 23 ++ test/casos/arith.saida.nativo | 23 ++ test/casos/array_oob.codigo | 1 + test/casos/array_oob.codigo.c | 1 + test/casos/array_oob.codigo.nativo | 1 + test/casos/array_oob.gpt | 13 + test/casos/array_oob.saida | 1 + test/casos/array_oob.saida.c | 4 + test/casos/array_oob.saida.nativo | 4 + test/casos/arrays.gpt | 62 ++++ test/casos/arrays.pular | 1 + test/casos/arrays.saida | Bin 0 -> 147 bytes test/casos/arrays.saida.nativo | 23 ++ test/casos/big_loop.gpt | 16 + test/casos/big_loop.saida | 3 + test/casos/big_loop.saida.nativo | 3 + test/casos/case_ident.gpt | 9 + test/casos/case_ident.saida | 1 + test/casos/chars.gpt | 21 ++ test/casos/chars.saida | 14 + test/casos/chars.saida.nativo | 14 + test/casos/control.gpt | 66 +++++ test/casos/control.saida | 64 ++++ test/casos/divzero.codigo | 1 + test/casos/divzero.codigo.c | 1 + test/casos/divzero.codigo.nativo | 1 + test/casos/divzero.gpt | 10 + test/casos/divzero.pular | 1 + test/casos/divzero.saida | 1 + test/casos/divzero.saida.c | 0 test/casos/divzero_real.codigo | 1 + test/casos/divzero_real.codigo.c | 1 + test/casos/divzero_real.codigo.nativo | 1 + test/casos/divzero_real.gpt | 10 + test/casos/divzero_real.pular | 1 + test/casos/divzero_real.saida | 0 test/casos/divzero_real.saida.c | 3 + test/casos/divzero_real.saida.nativo | 3 + test/casos/exitcode.codigo | 1 + test/casos/exitcode.gpt | 6 + test/casos/exitcode.saida | 1 + test/casos/exitcode_default.gpt | 4 + test/casos/exitcode_default.saida | 1 + test/casos/exitcode_expr.codigo | 1 + test/casos/exitcode_expr.gpt | 8 + test/casos/exitcode_expr.saida | 0 test/casos/fizzbuzz.gpt | 23 ++ test/casos/fizzbuzz.saida | 15 + test/casos/funcs.gpt | 180 ++++++++++++ test/casos/funcs.saida | 23 ++ test/casos/invertervetor.gpt | 32 ++ test/casos/invertervetor.saida | 24 ++ test/casos/leia.entrada | 19 ++ test/casos/leia.gpt | 30 ++ test/casos/leia.pular | 1 + test/casos/leia.saida | 20 ++ test/casos/leia.saida.c | 18 ++ test/casos/lexical.gpt | 25 ++ test/casos/lexical.saida | 13 + test/casos/lexical.saida.c | 13 + test/casos/logic.gpt | 31 ++ test/casos/logic.saida | 16 + test/casos/main_after_funcs.gpt | 17 ++ test/casos/main_after_funcs.saida | 2 + test/casos/modzero.codigo | 1 + test/casos/modzero.gpt | 9 + test/casos/modzero.pular | 1 + test/casos/modzero.saida | 0 test/casos/multifile_main.args | 1 + test/casos/multifile_main.gpt | 5 + test/casos/multifile_main.saida | 2 + test/casos/multifile_main.saida.c | 2 + test/casos/multifile_main.saida.nativo | 2 + test/casos/novars.gpt | 4 + test/casos/novars.saida | 1 + test/casos/olamundo.gpt | 5 + test/casos/olamundo.saida | 1 + test/casos/precedence.gpt | 28 ++ test/casos/precedence.saida | 20 ++ test/casos/real_format.gpt | 31 ++ test/casos/real_format.saida | 24 ++ test/casos/real_format.saida.c | 24 ++ test/casos/real_format.saida.nativo | 24 ++ test/casos/scoping.gpt | 31 ++ test/casos/scoping.saida | 5 + test/casos/stmt_forms.gpt | 23 ++ test/casos/stmt_forms.saida | 4 + test/casos/string_in_func.gpt | 28 ++ test/casos/string_in_func.saida | 6 + test/casos/strings.gpt | 33 +++ test/casos/strings.saida | 24 ++ test/casos/strings.saida.c | 24 ++ test/casos/strings.saida.nativo | 24 ++ test/erros/and_symbol.gpt | 8 + test/erros/and_symbol.msg | 2 + test/erros/assign_char_to_str.gpt | 7 + test/erros/assign_char_to_str.msg | 1 + test/erros/assign_int_to_str.gpt | 7 + test/erros/assign_int_to_str.msg | 1 + test/erros/assign_matrix_to_matrix.gpt | 8 + test/erros/assign_matrix_to_matrix.msg | 1 + test/erros/assign_str_to_char.gpt | 7 + test/erros/assign_str_to_char.msg | 1 + test/erros/assign_str_to_int.gpt | 7 + test/erros/assign_str_to_int.msg | 1 + test/erros/assign_str_to_logico.gpt | 7 + test/erros/assign_str_to_logico.msg | 1 + test/erros/assign_str_to_real.gpt | 7 + test/erros/assign_str_to_real.msg | 1 + test/erros/assign_to_func.gpt | 8 + test/erros/assign_to_func.msg | 1 + test/erros/bitor_on_real.gpt | 7 + test/erros/bitor_on_real.msg | 2 + test/erros/bnot_on_real.gpt | 7 + test/erros/bnot_on_real.msg | 2 + test/erros/char_plus_str.gpt | 7 + test/erros/char_plus_str.msg | 2 + test/erros/double_unary.gpt | 8 + test/erros/double_unary.msg | 1 + test/erros/empty_stmt.gpt | 7 + test/erros/empty_stmt.msg | 1 + test/erros/exp_literal.gpt | 7 + test/erros/exp_literal.msg | 1 + test/erros/fcall_matrix_to_scalar.gpt | 10 + test/erros/fcall_matrix_to_scalar.msg | 1 + test/erros/fcall_matrix_wrong_dims.gpt | 10 + test/erros/fcall_matrix_wrong_dims.msg | 1 + test/erros/fcall_scalar_to_matrix.gpt | 7 + test/erros/fcall_scalar_to_matrix.msg | 1 + test/erros/fcall_too_few_args.gpt | 7 + test/erros/fcall_too_few_args.msg | 1 + test/erros/fcall_too_many_args.gpt | 7 + test/erros/fcall_too_many_args.msg | 1 + test/erros/fcall_wrong_arg_type.gpt | 7 + test/erros/fcall_wrong_arg_type.msg | 1 + test/erros/ident_accent.gpt | 7 + test/erros/ident_accent.msg | 2 + test/erros/imprima_matrix.gpt | 7 + test/erros/imprima_matrix.msg | 1 + test/erros/imprima_no_args.gpt | 4 + test/erros/imprima_no_args.msg | 1 + test/erros/keywords_no_accents.gpt | 17 ++ test/erros/keywords_no_accents.msg | 1 + test/erros/keywords_upper.gpt | 10 + test/erros/keywords_upper.msg | 10 + test/erros/leia_as_stmt.gpt | 4 + test/erros/leia_as_stmt.msg | 1 + test/erros/leia_in_cond.gpt | 4 + test/erros/leia_in_cond.msg | 1 + test/erros/leia_in_expr.gpt | 8 + test/erros/leia_in_expr.msg | 2 + test/erros/leia_with_args.gpt | 7 + test/erros/leia_with_args.msg | 1 + test/erros/main_retorne_vazio.gpt | 6 + test/erros/main_retorne_vazio.msg | 1 + test/erros/main_return_logico.gpt | 4 + test/erros/main_return_logico.msg | 1 + test/erros/main_return_str.gpt | 4 + test/erros/main_return_str.msg | 1 + test/erros/matrix_dim_zero.gpt | 7 + test/erros/matrix_dim_zero.msg | 1 + test/erros/matrix_in_expr.gpt | 8 + test/erros/matrix_in_expr.msg | 2 + test/erros/matrix_missing_subscript.gpt | 7 + test/erros/matrix_missing_subscript.msg | 1 + test/erros/matrix_too_many_subscripts.gpt | 7 + test/erros/matrix_too_many_subscripts.msg | 1 + test/erros/minus_on_str.gpt | 7 + test/erros/minus_on_str.msg | 2 + test/erros/mod_on_real.gpt | 7 + test/erros/mod_on_real.msg | 2 + test/erros/para_logico_ate.gpt | 7 + test/erros/para_logico_ate.msg | 1 + test/erros/para_logico_var.gpt | 7 + test/erros/para_logico_var.msg | 1 + test/erros/para_passo_real.gpt | 7 + test/erros/para_passo_real.msg | 1 + test/erros/para_passo_var.gpt | 8 + test/erros/para_passo_var.msg | 1 + test/erros/para_passo_zero.gpt | 7 + test/erros/para_passo_zero.msg | 1 + test/erros/para_real_bounds.gpt | 7 + test/erros/para_real_bounds.msg | 2 + test/erros/para_real_var.gpt | 7 + test/erros/para_real_var.msg | 1 + test/erros/para_str_bounds.gpt | 7 + test/erros/para_str_bounds.msg | 2 + test/erros/para_str_var.gpt | 7 + test/erros/para_str_var.msg | 1 + test/erros/param_duplicate.gpt | 7 + test/erros/param_duplicate.msg | 1 + test/erros/param_redeclared_local.gpt | 9 + test/erros/param_redeclared_local.msg | 1 + test/erros/redeclared_func.gpt | 10 + test/erros/redeclared_func.msg | 1 + test/erros/redeclared_var.gpt | 8 + test/erros/redeclared_var.msg | 1 + test/erros/redeclared_var_sameline.gpt | 7 + test/erros/redeclared_var_sameline.msg | 1 + test/erros/return_type_mismatch.gpt | 8 + test/erros/return_type_mismatch.msg | 1 + test/erros/return_value_in_void.gpt | 8 + test/erros/return_value_in_void.msg | 1 + test/erros/sem_multiple_errors.gpt | 10 + test/erros/sem_multiple_errors.msg | 5 + test/erros/str_eq_int.gpt | 7 + test/erros/str_eq_int.msg | 2 + test/erros/str_plus_int.gpt | 7 + test/erros/str_plus_int.msg | 2 + test/erros/str_plus_str.gpt | 7 + test/erros/str_plus_str.msg | 2 + test/erros/subscript_on_scalar.gpt | 7 + test/erros/subscript_on_scalar.msg | 1 + test/erros/subscript_real.gpt | 7 + test/erros/subscript_real.msg | 1 + test/erros/subscript_str.gpt | 7 + test/erros/subscript_str.msg | 1 + test/erros/syn_assign_eq.gpt | 7 + test/erros/syn_assign_eq.msg | 1 + test/erros/syn_bad_char.gpt | 4 + test/erros/syn_bad_char.msg | 2 + test/erros/syn_bad_ident.gpt | 6 + test/erros/syn_bad_ident.msg | 1 + test/erros/syn_bad_real.gpt | 7 + test/erros/syn_bad_real.msg | 3 + test/erros/syn_char_multi.gpt | 7 + test/erros/syn_char_multi.msg | 2 + test/erros/syn_dangling_senao.gpt | 4 + test/erros/syn_dangling_senao.msg | 1 + test/erros/syn_empty_file.gpt | 0 test/erros/syn_empty_file.msg | 2 + test/erros/syn_empty_vars.gpt | 5 + test/erros/syn_empty_vars.msg | 1 + test/erros/syn_extra_after_fim.gpt | 5 + test/erros/syn_extra_after_fim.msg | 1 + test/erros/syn_fcall_missing_paren.gpt | 7 + test/erros/syn_fcall_missing_paren.msg | 1 + test/erros/syn_func_before_main.gpt | 7 + test/erros/syn_func_before_main.msg | 1 + .../syn_func_missing_type_after_colon.gpt | 6 + .../syn_func_missing_type_after_colon.msg | 1 + test/erros/syn_keyword_as_ident.gpt | 7 + test/erros/syn_keyword_as_ident.msg | 3 + test/erros/syn_local_var_in_main.gpt | 5 + test/erros/syn_local_var_in_main.msg | 1 + test/erros/syn_matrix_singular_type.gpt | 6 + test/erros/syn_matrix_singular_type.msg | 1 + test/erros/syn_matrix_var_dim.gpt | 7 + test/erros/syn_matrix_var_dim.msg | 1 + test/erros/syn_missing_colon_decl.gpt | 6 + test/erros/syn_missing_colon_decl.msg | 1 + test/erros/syn_missing_comma_decl.gpt | 6 + test/erros/syn_missing_comma_decl.msg | 1 + test/erros/syn_missing_entao.gpt | 4 + test/erros/syn_missing_entao.msg | 2 + test/erros/syn_missing_faca.gpt | 7 + test/erros/syn_missing_faca.msg | 2 + test/erros/syn_missing_fim_func.gpt | 7 + test/erros/syn_missing_fim_func.msg | 1 + test/erros/syn_missing_fimse.gpt | 4 + test/erros/syn_missing_fimse.msg | 1 + test/erros/syn_missing_paren.gpt | 4 + test/erros/syn_missing_paren.msg | 1 + test/erros/syn_missing_semicolon.gpt | 8 + test/erros/syn_missing_semicolon.msg | 1 + .../erros/syn_missing_semicolon_algoritmo.gpt | 4 + .../erros/syn_missing_semicolon_algoritmo.msg | 1 + test/erros/syn_no_algoritmo.gpt | 3 + test/erros/syn_no_algoritmo.msg | 1 + test/erros/syn_only_comment.gpt | 1 + test/erros/syn_only_comment.msg | 2 + test/erros/syn_scalar_plural_type.gpt | 6 + test/erros/syn_scalar_plural_type.msg | 1 + test/erros/syn_stray_operator.gpt | 7 + test/erros/syn_stray_operator.msg | 1 + test/erros/syn_two_algoritmos.gpt | 6 + test/erros/syn_two_algoritmos.msg | 1 + test/erros/syn_unbalanced_paren.gpt | 7 + test/erros/syn_unbalanced_paren.msg | 1 + test/erros/syn_unterminated_comment.gpt | 5 + test/erros/syn_unterminated_comment.msg | 2 + test/erros/syn_unterminated_string.gpt | 4 + test/erros/syn_unterminated_string.msg | 1 + test/erros/syn_wrong_end.gpt | 4 + test/erros/syn_wrong_end.msg | 2 + test/erros/undeclared_func.gpt | 4 + test/erros/undeclared_func.msg | 1 + test/erros/undeclared_var.gpt | 4 + test/erros/undeclared_var.msg | 2 + test/erros/undeclared_var_expr.gpt | 7 + test/erros/undeclared_var_expr.msg | 3 + test/erros/use_func_as_var.gpt | 11 + test/erros/use_func_as_var.msg | 1 + test/erros/var_and_func_same_name.gpt | 10 + test/erros/var_and_func_same_name.msg | 1 + test/erros/void_func_in_expr.gpt | 10 + test/erros/void_func_in_expr.msg | 1 + test/run_test.sh | 274 ++++++++++++++---- test/tester.codigo | 1 + test/tester.saida | 1 + test/tester.saida.c | 5 + test/tester.saida.nativo | 6 + 312 files changed, 2475 insertions(+), 81 deletions(-) create mode 100644 test/casos/_multifile_lib.gpt create mode 100644 test/casos/arith.gpt create mode 100644 test/casos/arith.saida create mode 100644 test/casos/arith.saida.c create mode 100644 test/casos/arith.saida.nativo create mode 100644 test/casos/array_oob.codigo create mode 100644 test/casos/array_oob.codigo.c create mode 100644 test/casos/array_oob.codigo.nativo create mode 100644 test/casos/array_oob.gpt create mode 100644 test/casos/array_oob.saida create mode 100644 test/casos/array_oob.saida.c create mode 100644 test/casos/array_oob.saida.nativo create mode 100644 test/casos/arrays.gpt create mode 100644 test/casos/arrays.pular create mode 100644 test/casos/arrays.saida create mode 100644 test/casos/arrays.saida.nativo create mode 100644 test/casos/big_loop.gpt create mode 100644 test/casos/big_loop.saida create mode 100644 test/casos/big_loop.saida.nativo create mode 100644 test/casos/case_ident.gpt create mode 100644 test/casos/case_ident.saida create mode 100644 test/casos/chars.gpt create mode 100644 test/casos/chars.saida create mode 100644 test/casos/chars.saida.nativo create mode 100644 test/casos/control.gpt create mode 100644 test/casos/control.saida create mode 100644 test/casos/divzero.codigo create mode 100644 test/casos/divzero.codigo.c create mode 100644 test/casos/divzero.codigo.nativo create mode 100644 test/casos/divzero.gpt create mode 100644 test/casos/divzero.pular create mode 100644 test/casos/divzero.saida create mode 100644 test/casos/divzero.saida.c create mode 100644 test/casos/divzero_real.codigo create mode 100644 test/casos/divzero_real.codigo.c create mode 100644 test/casos/divzero_real.codigo.nativo create mode 100644 test/casos/divzero_real.gpt create mode 100644 test/casos/divzero_real.pular create mode 100644 test/casos/divzero_real.saida create mode 100644 test/casos/divzero_real.saida.c create mode 100644 test/casos/divzero_real.saida.nativo create mode 100644 test/casos/exitcode.codigo create mode 100644 test/casos/exitcode.gpt create mode 100644 test/casos/exitcode.saida create mode 100644 test/casos/exitcode_default.gpt create mode 100644 test/casos/exitcode_default.saida create mode 100644 test/casos/exitcode_expr.codigo create mode 100644 test/casos/exitcode_expr.gpt create mode 100644 test/casos/exitcode_expr.saida create mode 100644 test/casos/fizzbuzz.gpt create mode 100644 test/casos/fizzbuzz.saida create mode 100644 test/casos/funcs.gpt create mode 100644 test/casos/funcs.saida create mode 100644 test/casos/invertervetor.gpt create mode 100644 test/casos/invertervetor.saida create mode 100644 test/casos/leia.entrada create mode 100644 test/casos/leia.gpt create mode 100644 test/casos/leia.pular create mode 100644 test/casos/leia.saida create mode 100644 test/casos/leia.saida.c create mode 100644 test/casos/lexical.gpt create mode 100644 test/casos/lexical.saida create mode 100644 test/casos/lexical.saida.c create mode 100644 test/casos/logic.gpt create mode 100644 test/casos/logic.saida create mode 100644 test/casos/main_after_funcs.gpt create mode 100644 test/casos/main_after_funcs.saida create mode 100644 test/casos/modzero.codigo create mode 100644 test/casos/modzero.gpt create mode 100644 test/casos/modzero.pular create mode 100644 test/casos/modzero.saida create mode 100644 test/casos/multifile_main.args create mode 100644 test/casos/multifile_main.gpt create mode 100644 test/casos/multifile_main.saida create mode 100644 test/casos/multifile_main.saida.c create mode 100644 test/casos/multifile_main.saida.nativo create mode 100644 test/casos/novars.gpt create mode 100644 test/casos/novars.saida create mode 100644 test/casos/olamundo.gpt create mode 100644 test/casos/olamundo.saida create mode 100644 test/casos/precedence.gpt create mode 100644 test/casos/precedence.saida create mode 100644 test/casos/real_format.gpt create mode 100644 test/casos/real_format.saida create mode 100644 test/casos/real_format.saida.c create mode 100644 test/casos/real_format.saida.nativo create mode 100644 test/casos/scoping.gpt create mode 100644 test/casos/scoping.saida create mode 100644 test/casos/stmt_forms.gpt create mode 100644 test/casos/stmt_forms.saida create mode 100644 test/casos/string_in_func.gpt create mode 100644 test/casos/string_in_func.saida create mode 100644 test/casos/strings.gpt create mode 100644 test/casos/strings.saida create mode 100644 test/casos/strings.saida.c create mode 100644 test/casos/strings.saida.nativo create mode 100644 test/erros/and_symbol.gpt create mode 100644 test/erros/and_symbol.msg create mode 100644 test/erros/assign_char_to_str.gpt create mode 100644 test/erros/assign_char_to_str.msg create mode 100644 test/erros/assign_int_to_str.gpt create mode 100644 test/erros/assign_int_to_str.msg create mode 100644 test/erros/assign_matrix_to_matrix.gpt create mode 100644 test/erros/assign_matrix_to_matrix.msg create mode 100644 test/erros/assign_str_to_char.gpt create mode 100644 test/erros/assign_str_to_char.msg create mode 100644 test/erros/assign_str_to_int.gpt create mode 100644 test/erros/assign_str_to_int.msg create mode 100644 test/erros/assign_str_to_logico.gpt create mode 100644 test/erros/assign_str_to_logico.msg create mode 100644 test/erros/assign_str_to_real.gpt create mode 100644 test/erros/assign_str_to_real.msg create mode 100644 test/erros/assign_to_func.gpt create mode 100644 test/erros/assign_to_func.msg create mode 100644 test/erros/bitor_on_real.gpt create mode 100644 test/erros/bitor_on_real.msg create mode 100644 test/erros/bnot_on_real.gpt create mode 100644 test/erros/bnot_on_real.msg create mode 100644 test/erros/char_plus_str.gpt create mode 100644 test/erros/char_plus_str.msg create mode 100644 test/erros/double_unary.gpt create mode 100644 test/erros/double_unary.msg create mode 100644 test/erros/empty_stmt.gpt create mode 100644 test/erros/empty_stmt.msg create mode 100644 test/erros/exp_literal.gpt create mode 100644 test/erros/exp_literal.msg create mode 100644 test/erros/fcall_matrix_to_scalar.gpt create mode 100644 test/erros/fcall_matrix_to_scalar.msg create mode 100644 test/erros/fcall_matrix_wrong_dims.gpt create mode 100644 test/erros/fcall_matrix_wrong_dims.msg create mode 100644 test/erros/fcall_scalar_to_matrix.gpt create mode 100644 test/erros/fcall_scalar_to_matrix.msg create mode 100644 test/erros/fcall_too_few_args.gpt create mode 100644 test/erros/fcall_too_few_args.msg create mode 100644 test/erros/fcall_too_many_args.gpt create mode 100644 test/erros/fcall_too_many_args.msg create mode 100644 test/erros/fcall_wrong_arg_type.gpt create mode 100644 test/erros/fcall_wrong_arg_type.msg create mode 100644 test/erros/ident_accent.gpt create mode 100644 test/erros/ident_accent.msg create mode 100644 test/erros/imprima_matrix.gpt create mode 100644 test/erros/imprima_matrix.msg create mode 100644 test/erros/imprima_no_args.gpt create mode 100644 test/erros/imprima_no_args.msg create mode 100644 test/erros/keywords_no_accents.gpt create mode 100644 test/erros/keywords_no_accents.msg create mode 100644 test/erros/keywords_upper.gpt create mode 100644 test/erros/keywords_upper.msg create mode 100644 test/erros/leia_as_stmt.gpt create mode 100644 test/erros/leia_as_stmt.msg create mode 100644 test/erros/leia_in_cond.gpt create mode 100644 test/erros/leia_in_cond.msg create mode 100644 test/erros/leia_in_expr.gpt create mode 100644 test/erros/leia_in_expr.msg create mode 100644 test/erros/leia_with_args.gpt create mode 100644 test/erros/leia_with_args.msg create mode 100644 test/erros/main_retorne_vazio.gpt create mode 100644 test/erros/main_retorne_vazio.msg create mode 100644 test/erros/main_return_logico.gpt create mode 100644 test/erros/main_return_logico.msg create mode 100644 test/erros/main_return_str.gpt create mode 100644 test/erros/main_return_str.msg create mode 100644 test/erros/matrix_dim_zero.gpt create mode 100644 test/erros/matrix_dim_zero.msg create mode 100644 test/erros/matrix_in_expr.gpt create mode 100644 test/erros/matrix_in_expr.msg create mode 100644 test/erros/matrix_missing_subscript.gpt create mode 100644 test/erros/matrix_missing_subscript.msg create mode 100644 test/erros/matrix_too_many_subscripts.gpt create mode 100644 test/erros/matrix_too_many_subscripts.msg create mode 100644 test/erros/minus_on_str.gpt create mode 100644 test/erros/minus_on_str.msg create mode 100644 test/erros/mod_on_real.gpt create mode 100644 test/erros/mod_on_real.msg create mode 100644 test/erros/para_logico_ate.gpt create mode 100644 test/erros/para_logico_ate.msg create mode 100644 test/erros/para_logico_var.gpt create mode 100644 test/erros/para_logico_var.msg create mode 100644 test/erros/para_passo_real.gpt create mode 100644 test/erros/para_passo_real.msg create mode 100644 test/erros/para_passo_var.gpt create mode 100644 test/erros/para_passo_var.msg create mode 100644 test/erros/para_passo_zero.gpt create mode 100644 test/erros/para_passo_zero.msg create mode 100644 test/erros/para_real_bounds.gpt create mode 100644 test/erros/para_real_bounds.msg create mode 100644 test/erros/para_real_var.gpt create mode 100644 test/erros/para_real_var.msg create mode 100644 test/erros/para_str_bounds.gpt create mode 100644 test/erros/para_str_bounds.msg create mode 100644 test/erros/para_str_var.gpt create mode 100644 test/erros/para_str_var.msg create mode 100644 test/erros/param_duplicate.gpt create mode 100644 test/erros/param_duplicate.msg create mode 100644 test/erros/param_redeclared_local.gpt create mode 100644 test/erros/param_redeclared_local.msg create mode 100644 test/erros/redeclared_func.gpt create mode 100644 test/erros/redeclared_func.msg create mode 100644 test/erros/redeclared_var.gpt create mode 100644 test/erros/redeclared_var.msg create mode 100644 test/erros/redeclared_var_sameline.gpt create mode 100644 test/erros/redeclared_var_sameline.msg create mode 100644 test/erros/return_type_mismatch.gpt create mode 100644 test/erros/return_type_mismatch.msg create mode 100644 test/erros/return_value_in_void.gpt create mode 100644 test/erros/return_value_in_void.msg create mode 100644 test/erros/sem_multiple_errors.gpt create mode 100644 test/erros/sem_multiple_errors.msg create mode 100644 test/erros/str_eq_int.gpt create mode 100644 test/erros/str_eq_int.msg create mode 100644 test/erros/str_plus_int.gpt create mode 100644 test/erros/str_plus_int.msg create mode 100644 test/erros/str_plus_str.gpt create mode 100644 test/erros/str_plus_str.msg create mode 100644 test/erros/subscript_on_scalar.gpt create mode 100644 test/erros/subscript_on_scalar.msg create mode 100644 test/erros/subscript_real.gpt create mode 100644 test/erros/subscript_real.msg create mode 100644 test/erros/subscript_str.gpt create mode 100644 test/erros/subscript_str.msg create mode 100644 test/erros/syn_assign_eq.gpt create mode 100644 test/erros/syn_assign_eq.msg create mode 100644 test/erros/syn_bad_char.gpt create mode 100644 test/erros/syn_bad_char.msg create mode 100644 test/erros/syn_bad_ident.gpt create mode 100644 test/erros/syn_bad_ident.msg create mode 100644 test/erros/syn_bad_real.gpt create mode 100644 test/erros/syn_bad_real.msg create mode 100644 test/erros/syn_char_multi.gpt create mode 100644 test/erros/syn_char_multi.msg create mode 100644 test/erros/syn_dangling_senao.gpt create mode 100644 test/erros/syn_dangling_senao.msg create mode 100644 test/erros/syn_empty_file.gpt create mode 100644 test/erros/syn_empty_file.msg create mode 100644 test/erros/syn_empty_vars.gpt create mode 100644 test/erros/syn_empty_vars.msg create mode 100644 test/erros/syn_extra_after_fim.gpt create mode 100644 test/erros/syn_extra_after_fim.msg create mode 100644 test/erros/syn_fcall_missing_paren.gpt create mode 100644 test/erros/syn_fcall_missing_paren.msg create mode 100644 test/erros/syn_func_before_main.gpt create mode 100644 test/erros/syn_func_before_main.msg create mode 100644 test/erros/syn_func_missing_type_after_colon.gpt create mode 100644 test/erros/syn_func_missing_type_after_colon.msg create mode 100644 test/erros/syn_keyword_as_ident.gpt create mode 100644 test/erros/syn_keyword_as_ident.msg create mode 100644 test/erros/syn_local_var_in_main.gpt create mode 100644 test/erros/syn_local_var_in_main.msg create mode 100644 test/erros/syn_matrix_singular_type.gpt create mode 100644 test/erros/syn_matrix_singular_type.msg create mode 100644 test/erros/syn_matrix_var_dim.gpt create mode 100644 test/erros/syn_matrix_var_dim.msg create mode 100644 test/erros/syn_missing_colon_decl.gpt create mode 100644 test/erros/syn_missing_colon_decl.msg create mode 100644 test/erros/syn_missing_comma_decl.gpt create mode 100644 test/erros/syn_missing_comma_decl.msg create mode 100644 test/erros/syn_missing_entao.gpt create mode 100644 test/erros/syn_missing_entao.msg create mode 100644 test/erros/syn_missing_faca.gpt create mode 100644 test/erros/syn_missing_faca.msg create mode 100644 test/erros/syn_missing_fim_func.gpt create mode 100644 test/erros/syn_missing_fim_func.msg create mode 100644 test/erros/syn_missing_fimse.gpt create mode 100644 test/erros/syn_missing_fimse.msg create mode 100644 test/erros/syn_missing_paren.gpt create mode 100644 test/erros/syn_missing_paren.msg create mode 100644 test/erros/syn_missing_semicolon.gpt create mode 100644 test/erros/syn_missing_semicolon.msg create mode 100644 test/erros/syn_missing_semicolon_algoritmo.gpt create mode 100644 test/erros/syn_missing_semicolon_algoritmo.msg create mode 100644 test/erros/syn_no_algoritmo.gpt create mode 100644 test/erros/syn_no_algoritmo.msg create mode 100644 test/erros/syn_only_comment.gpt create mode 100644 test/erros/syn_only_comment.msg create mode 100644 test/erros/syn_scalar_plural_type.gpt create mode 100644 test/erros/syn_scalar_plural_type.msg create mode 100644 test/erros/syn_stray_operator.gpt create mode 100644 test/erros/syn_stray_operator.msg create mode 100644 test/erros/syn_two_algoritmos.gpt create mode 100644 test/erros/syn_two_algoritmos.msg create mode 100644 test/erros/syn_unbalanced_paren.gpt create mode 100644 test/erros/syn_unbalanced_paren.msg create mode 100644 test/erros/syn_unterminated_comment.gpt create mode 100644 test/erros/syn_unterminated_comment.msg create mode 100644 test/erros/syn_unterminated_string.gpt create mode 100644 test/erros/syn_unterminated_string.msg create mode 100644 test/erros/syn_wrong_end.gpt create mode 100644 test/erros/syn_wrong_end.msg create mode 100644 test/erros/undeclared_func.gpt create mode 100644 test/erros/undeclared_func.msg create mode 100644 test/erros/undeclared_var.gpt create mode 100644 test/erros/undeclared_var.msg create mode 100644 test/erros/undeclared_var_expr.gpt create mode 100644 test/erros/undeclared_var_expr.msg create mode 100644 test/erros/use_func_as_var.gpt create mode 100644 test/erros/use_func_as_var.msg create mode 100644 test/erros/var_and_func_same_name.gpt create mode 100644 test/erros/var_and_func_same_name.msg create mode 100644 test/erros/void_func_in_expr.gpt create mode 100644 test/erros/void_func_in_expr.msg create mode 100644 test/tester.codigo create mode 100644 test/tester.saida create mode 100644 test/tester.saida.c create mode 100644 test/tester.saida.nativo diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 25a8c2e4..cb0dd364 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,10 @@ repos: rev: v6.0.0 hooks: - id: trailing-whitespace + # expected test outputs are compared byte by byte + exclude: ^test/(casos/|erros/|tester\.) - id: end-of-file-fixer + exclude: ^test/(casos/|erros/|tester\.) - id: check-merge-conflict - id: check-added-large-files @@ -12,3 +15,4 @@ repos: hooks: - id: clang-format files: \.(cpp|cc|cxx|c|h|hpp)$ + exclude: ^test/(casos/|erros/|tester\.) diff --git a/AGENTS.md b/AGENTS.md index 8744f55c..1ac11e63 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,9 @@ continuar compatível com GNU/Linux e Windows/MSYS2. - `src/modules/x86/`: gerador de assembly x86 e trechos de runtime. - `src/modules/c_translator/`: tradutor de Portugol para C. - `lib/base.gpt`: biblioteca padrão da linguagem. -- `test/`: programa de regressão `tester.gpt` e `run_test.sh`. +- `test/`: `run_test.sh`, o programa `tester.gpt`, os casos de regressão em + `casos/` (programas com saída esperada) e `erros/` (programas inválidos com + a mensagem esperada). - `exemplos/`: programas de exemplo. - `doc/`: páginas de manual e fonte LaTeX do manual. - `packages/win_setup/`: empacotamento e recursos do instalador Windows. @@ -34,9 +36,12 @@ make -j$(nproc) bash test/run_test.sh ``` -O teste requer `src/gpt` já compilado. Ele verifica interpretação, compilação -nativa, geração de assembly e, quando disponível, montagem com NASM. Em hosts -que não são x86, a execução do binário nativo é pulada intencionalmente. +O teste requer `src/gpt` já compilado. Ele executa `test/tester.gpt` e cada +programa de `test/casos/` nos três modos (interpretação, binário nativo e +tradução para C compilada com `gcc`), comparando stdout e código de saída com +os arquivos `.saida`/`.codigo`, e verifica que cada programa de `test/erros/` +é rejeitado com a mensagem em `.msg`. Em hosts que não são x86, a execução do +binário nativo é pulada intencionalmente. Para uma verificação rápida e manual: @@ -57,7 +62,9 @@ sem alterar o sistema, use `make install DESTDIR="$PWD/release"`. `clang-format` a C/C++ e também verifica espaços finais, conflitos e arquivos grandes. - Ao alterar comportamento da linguagem, adicione ou ajuste um caso em - `test/tester.gpt` (ou crie um teste específico) e execute o script de testes. + `test/casos/` ou `test/erros/` (ou em `test/tester.gpt`) e execute o script + de testes. Os três modos de execução devem produzir a mesma saída; use + `NOME.saida.nativo` ou `NOME.saida.c` apenas para divergências conhecidas. - Ao alterar opções da CLI, atualize a ajuda em `src/GPT.cpp` e a documentação aplicável. - Preserve os avisos de licença/copyright existentes nos arquivos C++ que forem diff --git a/CHANGELOG.md b/CHANGELOG.md index d64884c8..53e52dca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ Todas as mudanças relevantes do **GPT (GPortugol)** organizadas por release. Este arquivo foi consolidado a partir do ChangeLog histórico (CVS/SVN). +## [Unreleased] + +### Adicionado + +- Suíte de regressão em `test/casos/` e `test/erros/`: `test/run_test.sh` + compara a saída dos três modos de execução com as saídas esperadas e as + mensagens de erro de compilação. + ## [1.2.0] - 2026-01-06 ### Adicionado diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2013a11a..d2ce2986 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,9 +26,10 @@ bash test/run_test.sh ``` O projeto requer ANTLR 2.x, PCRE2, Autotools, um compilador C++ e NASM. O -script de testes verifica interpretação, compilação nativa, geração de assembly -e, quando possível, montagem com NASM. Em máquinas que não são x86, a execução -do binário nativo é pulada. +script de testes executa os programas de `test/casos/` no interpretador, como +binário nativo e como tradução para C, comparando as saídas com as esperadas, +e verifica as mensagens de erro dos programas de `test/erros/`. Em máquinas que +não são x86, a execução do binário nativo é pulada. ## Fazendo uma alteração @@ -68,9 +69,12 @@ módulos de tradução, interpretação e x86. ### Testes e exemplos -Adicione casos de regressão em `test/tester.gpt` quando for adequado, ou crie um -teste específico em `test/`. Para alterações que afetem o comportamento da -linguagem, cubra tanto o comportamento esperado quanto o caso que antes falhava. +Adicione casos de regressão em `test/casos/` (programa `.gpt`, entrada +`.entrada` opcional, saída esperada `.saida` e código de saída `.codigo`) ou em +`test/erros/` (programa `.gpt` e mensagem esperada `.msg`), ou em +`test/tester.gpt` quando for adequado. Para alterações que afetem o +comportamento da linguagem, cubra tanto o comportamento esperado quanto o caso +que antes falhava. Você pode testar manualmente um exemplo compilado: diff --git a/HACKING.md b/HACKING.md index ba69dc70..25bfd21a 100644 --- a/HACKING.md +++ b/HACKING.md @@ -46,6 +46,14 @@ make -j$(nproc) ### 3. Testar no Debian/Ubuntu +A suíte de regressão compara a saída do interpretador, do binário nativo e da +tradução para C com as saídas esperadas em `test/casos/`, e as mensagens de +erro com `test/erros/`: + +```shell +bash test/run_test.sh +``` + #### Interpretador no Debian/Ubuntu ```shell diff --git a/src/modules/GPTDisplay.cpp b/src/modules/GPTDisplay.cpp index a6696c7f..f490e68a 100644 --- a/src/modules/GPTDisplay.cpp +++ b/src/modules/GPTDisplay.cpp @@ -26,6 +26,7 @@ #endif #include +#include using namespace std; @@ -58,11 +59,10 @@ string GPTDisplay::toLatin1(const string &str) { string GPTDisplay::toOEM(const string &str) { #ifdef WIN32 - string ret; - char buffer[str.length()]; - CharToOem(toLatin1(str.c_str()).c_str(), buffer); - ret = buffer; - return ret; + string latin1 = toLatin1(str); + vector buffer(latin1.length() + 1); + CharToOem(latin1.c_str(), buffer.data()); + return string(buffer.data()); #else return str; #endif diff --git a/src/modules/x86/asm_win32.h b/src/modules/x86/asm_win32.h index 1a01f850..7e97cbee 100644 --- a/src/modules/x86/asm_win32.h +++ b/src/modules/x86/asm_win32.h @@ -821,7 +821,8 @@ _lib << "print:\n" "\n" " %define handle ebp-4\n" " %define length ebp-8 \n" - " begin 8\n" + " %define written ebp-12\n" + " begin 12\n" " wcall GetStdHandle, STD_OUTPUT_HANDLE\n" " mov [handle], eax\n" "\n" @@ -830,13 +831,15 @@ _lib << "print:\n" " clargs 1\n" " mov [length], eax\n" "\n" - " wcall WriteConsoleA, [handle], [string], [length], 0, 0\n" + " lea eax, [written]\n" + " wcall WriteFile, [handle], [string], [length], eax, 0\n" "\n" " return\n" " %undef STD_OUTPUT_HANDLE\n" " %undef string\n" " %undef handle\n" " %undef length\n" + " %undef written\n" "\n" "readline:\n" " %define STD_INPUT_HANDLE -10\n" @@ -878,7 +881,7 @@ _lib << "\n" "\n" "IMPORT___ kernel32, \\\n" " GetStdHandle, \"GetStdHandle\",0, \\\n" - " WriteConsoleA, \"WriteConsoleA\", 0, \\\n" + " WriteFile, \"WriteFile\", 0, \\\n" " ExitProcess, \"ExitProcess\", 0, \\\n" " ReadConsoleA , \"ReadConsoleA\",0\n" " \n" diff --git a/test/casos/_multifile_lib.gpt b/test/casos/_multifile_lib.gpt new file mode 100644 index 00000000..ceac410d --- /dev/null +++ b/test/casos/_multifile_lib.gpt @@ -0,0 +1,4 @@ +função dobro(n: inteiro): inteiro +início + retorne n * 2; +fim diff --git a/test/casos/arith.gpt b/test/casos/arith.gpt new file mode 100644 index 00000000..1095547f --- /dev/null +++ b/test/casos/arith.gpt @@ -0,0 +1,28 @@ +algoritmo arith; +variáveis + a, b : inteiro; + r, s : real; +fim-variáveis +início + a := 7; b := 2; + imprima(a + b, " ", a - b, " ", a * b, " ", a / b, " ", a % b); + imprima(-a, " ", +a, " ", -(a + b) * 2); + imprima(2 + 3 * 4, " ", (2 + 3) * 4, " ", 10 - 4 - 3, " ", 100 / 10 / 5); + imprima(-7 % 3, " ", 7 % -3, " ", -7 / 2); + r := 7.5; s := 2; + imprima(r + s, " ", r - s, " ", r * s, " ", r / s); + imprima(r / 3, " ", 1.0 / 3.0, " ", 2.0 / 3.0, " ", 1.005, " ", 1.449, " ", 250.0); + imprima(a / 2.0, " ", 1 / 3, " ", 1.0 / 3); + a := 3.99; imprima(a); + r := 5; imprima(r); + a := 2147483647; imprima(a); a := a + 1; imprima(a); + a := -2147483648; imprima(a); + imprima(1000000 * 1000); + a := 5 | 2; imprima(a); a := 6 & 3; imprima(a); a := 6 ^ 3; imprima(a); a := ~5; imprima(a); + imprima(5 | 2 & 3, " ", 5 ^ 1 | 8); + r := 0.1 + 0.2; imprima(r); + r := -0.5; imprima(r, " ", -r); + r := 2.5 * 2; a := r; imprima(a); + a := 10; r := a / 4; imprima(r); + r := a / 4.0; imprima(r); +fim diff --git a/test/casos/arith.saida b/test/casos/arith.saida new file mode 100644 index 00000000..3b216a54 --- /dev/null +++ b/test/casos/arith.saida @@ -0,0 +1,23 @@ +9 5 14 3 1 +-7 7 -18 +14 20 3 2 +-1 1 -3 +9.50 5.50 15.00 3.75 +2.50 0.33 0.67 1.00 1.45 250.00 +3.50 0 0.33 +3 +5.00 +2147483647 +-2147483648 +-2 +1000000000 +7 +2 +5 +-6 +7 12 +0.30 +-0.50 0.50 +5 +2.00 +2.50 diff --git a/test/casos/arith.saida.c b/test/casos/arith.saida.c new file mode 100644 index 00000000..934b1afd --- /dev/null +++ b/test/casos/arith.saida.c @@ -0,0 +1,23 @@ +9 5 14 3 1 +-7 7 -18 +14 20 3 2 +-1 1 -3 +9.50 5.50 15.00 3.75 +2.50 0.33 0.67 1.00 1.45 250.00 +3.50 0 0.33 +3 +5.00 +2147483647 +-2147483648 +-2147483648 +1000000000 +7 +2 +5 +-6 +7 12 +0.30 +-0.50 0.50 +5 +2.00 +2.50 diff --git a/test/casos/arith.saida.nativo b/test/casos/arith.saida.nativo new file mode 100644 index 00000000..3eeef619 --- /dev/null +++ b/test/casos/arith.saida.nativo @@ -0,0 +1,23 @@ +9 5 14 3 1 +-7 7 -18 +14 20 3 2 +0 1 2147483644 +9.50 5.50 15.00 3.75 +2.50 0.33 0.67 1.00 1.45 250.00 +3.50 0 0.33 +3 +5.00 +2147483647 +-2147483648 +-2147483648 +1000000000 +7 +2 +5 +-6 +7 12 +0.30 +0.50 0.50 +5 +2.00 +2.50 diff --git a/test/casos/array_oob.codigo b/test/casos/array_oob.codigo new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/test/casos/array_oob.codigo @@ -0,0 +1 @@ +1 diff --git a/test/casos/array_oob.codigo.c b/test/casos/array_oob.codigo.c new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/test/casos/array_oob.codigo.c @@ -0,0 +1 @@ +0 diff --git a/test/casos/array_oob.codigo.nativo b/test/casos/array_oob.codigo.nativo new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/test/casos/array_oob.codigo.nativo @@ -0,0 +1 @@ +0 diff --git a/test/casos/array_oob.gpt b/test/casos/array_oob.gpt new file mode 100644 index 00000000..da16d3d8 --- /dev/null +++ b/test/casos/array_oob.gpt @@ -0,0 +1,13 @@ +algoritmo array_oob; +variáveis + v : matriz[3] de inteiros; + i : inteiro; +fim-variáveis +início + i := 5; + imprima("antes"); + v[i] := 1; + imprima(v[i]); + imprima(v[-1]); + imprima("depois"); +fim diff --git a/test/casos/array_oob.saida b/test/casos/array_oob.saida new file mode 100644 index 00000000..9ee5a417 --- /dev/null +++ b/test/casos/array_oob.saida @@ -0,0 +1 @@ +antes diff --git a/test/casos/array_oob.saida.c b/test/casos/array_oob.saida.c new file mode 100644 index 00000000..e61ccd6f --- /dev/null +++ b/test/casos/array_oob.saida.c @@ -0,0 +1,4 @@ +antes +1 +0 +depois diff --git a/test/casos/array_oob.saida.nativo b/test/casos/array_oob.saida.nativo new file mode 100644 index 00000000..38a23c04 --- /dev/null +++ b/test/casos/array_oob.saida.nativo @@ -0,0 +1,4 @@ +antes +1 +3039593 + diff --git a/test/casos/arrays.gpt b/test/casos/arrays.gpt new file mode 100644 index 00000000..720eb876 --- /dev/null +++ b/test/casos/arrays.gpt @@ -0,0 +1,62 @@ +algoritmo arrays; +variáveis + v : matriz[5] de inteiros; + m : matriz[3][3] de inteiros; + c : matriz[2][2][2] de inteiros; + rs : matriz[3] de reais; + cs : matriz[3] de caracteres; + ss : matriz[2] de literais; + ls : matriz[2] de lógicos; + i, j, k : inteiro; +fim-variáveis +início + imprima("inicial: ", v[0], " ", rs[0], " ", cs[0], " [", ss[0], "] ", ls[0]); + para i de 0 até 4 faça v[i] := i * i; fim-para + para i de 0 até 4 faça imprima(v[i]); fim-para + imprima(v[1+1], " ", v[v[1]], " ", v[4-4]); + para i de 0 até 2 faça + para j de 0 até 2 faça + m[i][j] := i * 3 + j; + fim-para + fim-para + para i de 0 até 2 faça imprima(m[i][0], " ", m[i][1], " ", m[i][2]); fim-para + para i de 0 até 1 faça para j de 0 até 1 faça para k de 0 até 1 faça + c[i][j][k] := i * 4 + j * 2 + k; + fim-para fim-para fim-para + imprima(c[1][1][1], " ", c[0][1][0], " ", c[1][0][1]); + rs[0] := 1.5; rs[1] := rs[0] * 2; rs[2] := 7; + imprima(rs[0], " ", rs[1], " ", rs[2]); + cs[0] := 'x'; cs[1] := 'y'; cs[2] := cs[0]; + imprima(cs[0], cs[1], cs[2]); + ss[0] := "olá"; ss[1] := ss[0]; + imprima(ss[0], " ", ss[1]); + ls[0] := verdadeiro; ls[1] := não ls[0]; + imprima(ls[0], " ", ls[1]); + v[m[0][1]] := 77; + imprima(v[1]); + i := 2; + v[i] := v[i] + v[i-1]; + imprima(v[2]); + m[1][1] := m[0][0] + m[2][2]; + imprima(m[1][1]); + imprima(v[0] + v[1] * 2 - m[1][2]); + preenche(v); + imprima(v[0], " ", v[4]); + imprima(soma_m(m)); + v[0] := 3.7; imprima(v[0]); + rs[1] := 2; imprima(rs[1]); +fim + +função preenche(a: matriz[5] de inteiros) + i : inteiro; +início + para i de 0 até 4 faça a[i] := -i; fim-para +fim + +função soma_m(a: matriz[3][3] de inteiros): inteiro + i, j, s : inteiro; +início + s := 0; + para i de 0 até 2 faça para j de 0 até 2 faça s := s + a[i][j]; fim-para fim-para + retorne s; +fim diff --git a/test/casos/arrays.pular b/test/casos/arrays.pular new file mode 100644 index 00000000..8e1a5599 --- /dev/null +++ b/test/casos/arrays.pular @@ -0,0 +1 @@ +windows diff --git a/test/casos/arrays.saida b/test/casos/arrays.saida new file mode 100644 index 0000000000000000000000000000000000000000..ea74fb6f775101235fbd7ee8f8ecb846cf2b6021 GIT binary patch literal 147 zcmXZUK?=e!6og^dbBbB&ro5M=P1>u7i(o4RLIV}09;avVVkY3`XEyVtHQiIp6NS== z@WktRedThw@e%X0K%j6Kp#vP10;x5ybnG$EGr-f-tz9p)&G0qYKRZhP9&EvT+2%Me VX)Ax$djv&*y0M8B7g(6~`~eVFB8C6} literal 0 HcmV?d00001 diff --git a/test/casos/arrays.saida.nativo b/test/casos/arrays.saida.nativo new file mode 100644 index 00000000..d388e119 --- /dev/null +++ b/test/casos/arrays.saida.nativo @@ -0,0 +1,23 @@ +inicial: 0 0.00 [(nulo)] falso +0 +1 +4 +9 +16 +4 1 0 +0 1 2 +3 4 5 +6 7 8 +7 2 5 +1.50 3.00 7.00 +xyx +olá olá +verdadeiro falso +77 +81 +8 +149 +0 16 +40 +3 +2.00 diff --git a/test/casos/big_loop.gpt b/test/casos/big_loop.gpt new file mode 100644 index 00000000..e1386df0 --- /dev/null +++ b/test/casos/big_loop.gpt @@ -0,0 +1,16 @@ +algoritmo big_loop; +variáveis + i, s : inteiro; + r : real; +fim-variáveis +início + s := 0; + para i de 1 até 100000 faça s := s + i; fim-para + imprima(s); + r := 0; + para i de 1 até 1000 faça r := r + 0.001; fim-para + imprima(r); + i := 0; + enquanto i < 200000 faça i := i + 1; fim-enquanto + imprima(i); +fim diff --git a/test/casos/big_loop.saida b/test/casos/big_loop.saida new file mode 100644 index 00000000..ca6c1854 --- /dev/null +++ b/test/casos/big_loop.saida @@ -0,0 +1,3 @@ +705082704 +1.00 +200000 diff --git a/test/casos/big_loop.saida.nativo b/test/casos/big_loop.saida.nativo new file mode 100644 index 00000000..67cd8e8e --- /dev/null +++ b/test/casos/big_loop.saida.nativo @@ -0,0 +1,3 @@ +705082704 +0.010 +200000 diff --git a/test/casos/case_ident.gpt b/test/casos/case_ident.gpt new file mode 100644 index 00000000..04670b8a --- /dev/null +++ b/test/casos/case_ident.gpt @@ -0,0 +1,9 @@ +algoritmo case_ident; +variáveis + abc : inteiro; + ABC : inteiro; +fim-variáveis +início + abc := 1; ABC := 2; + imprima(abc, " ", ABC); +fim diff --git a/test/casos/case_ident.saida b/test/casos/case_ident.saida new file mode 100644 index 00000000..8d04f961 --- /dev/null +++ b/test/casos/case_ident.saida @@ -0,0 +1 @@ +1 2 diff --git a/test/casos/chars.gpt b/test/casos/chars.gpt new file mode 100644 index 00000000..269e7706 --- /dev/null +++ b/test/casos/chars.gpt @@ -0,0 +1,21 @@ +algoritmo chars; +variáveis + c : caractere; + i : inteiro; + s : literal; +fim-variáveis +início + c := 'a'; + para i de 0 até 5 faça + imprima(c); + c := c + 1; + fim-para + c := '0'; i := c; imprima(i); + c := ' '; imprima("[", c, "]"); + c := '\t'; imprima("[", c, "]"); + c := 65; imprima(c); + c := 'A' + 32; imprima(c); + imprima('a' = 97, " ", 'a' < 100); + s := "x"; c := 'x'; imprima(s = "x", " ", c = 'x'); + imprima(c + 0); +fim diff --git a/test/casos/chars.saida b/test/casos/chars.saida new file mode 100644 index 00000000..7eacc4c4 --- /dev/null +++ b/test/casos/chars.saida @@ -0,0 +1,14 @@ +a +b +c +d +e +f +48 +[ ] +[ ] +A +a +verdadeiro verdadeiro +verdadeiro verdadeiro +120 diff --git a/test/casos/chars.saida.nativo b/test/casos/chars.saida.nativo new file mode 100644 index 00000000..f4241900 --- /dev/null +++ b/test/casos/chars.saida.nativo @@ -0,0 +1,14 @@ +a +b +c +d +e +f +48 +[ ] +[t] +A +a +verdadeiro verdadeiro +verdadeiro verdadeiro +120 diff --git a/test/casos/control.gpt b/test/casos/control.gpt new file mode 100644 index 00000000..ec70c738 --- /dev/null +++ b/test/casos/control.gpt @@ -0,0 +1,66 @@ +algoritmo control; +variáveis + i, j, n, soma : inteiro; + r : real; +fim-variáveis +início + i := 5; + se i > 3 então imprima("maior"); senão imprima("menor"); fim-se + se i < 3 então imprima("menor"); senão imprima("maior"); fim-se + se i = 5 então + se i > 10 então imprima("a"); senão + se i > 4 então imprima("b"); fim-se + fim-se + fim-se + se falso então imprima("nunca"); fim-se + se verdadeiro então fim-se + se i > 0 então senão imprima("x"); fim-se + i := 0; + enquanto i < 5 faça + imprima("enquanto ", i); + i := i + 1; + fim-enquanto + imprima("depois: ", i); + enquanto falso faça imprima("nunca"); fim-enquanto + i := 0; + repita + imprima("repita ", i); + i := i + 1; + até i >= 3; + repita imprima("uma vez"); até verdadeiro; + para i de 1 até 5 faça imprima("para ", i); fim-para + imprima("i apos para: ", i); + para i de 5 até 1 passo -1 faça imprima("desc ", i); fim-para + imprima("i apos desc: ", i); + para i de 0 até 10 passo 3 faça imprima("passo3 ", i); fim-para + imprima("i apos passo3: ", i); + para i de 10 até 0 passo -4 faça imprima("passo-4 ", i); fim-para + para i de 0 até 10 passo +2 faça imprima("passo+2 ", i); fim-para + para i de 5 até 1 faça imprima("nao deveria: ", i); fim-para + imprima("i apos vazio: ", i); + para i de 1 até 5 passo -1 faça imprima("nao deveria2: ", i); fim-para + para i de 3 até 3 faça imprima("uma vez ", i); fim-para + para i de 1 até 10 faça + se i = 4 então i := 100; fim-se + imprima("break ", i); + fim-para + imprima("i apos break: ", i); + soma := 0; + para i de 1 até 3 faça + para j de 1 até 3 faça + soma := soma + i * j; + fim-para + fim-para + imprima("soma ", soma); + n := 4; + para i de n-2 até n*2 faça imprima("expr ", i); fim-para + i := 0; + enquanto i < 10 faça + i := i + 1; + se i % 2 = 0 então + imprima("par ", i); + senão + se i % 3 = 0 então imprima("mult3 ", i); senão imprima("outro ", i); fim-se + fim-se + fim-enquanto +fim diff --git a/test/casos/control.saida b/test/casos/control.saida new file mode 100644 index 00000000..4d5011b0 --- /dev/null +++ b/test/casos/control.saida @@ -0,0 +1,64 @@ +maior +maior +b +enquanto 0 +enquanto 1 +enquanto 2 +enquanto 3 +enquanto 4 +depois: 5 +repita 0 +repita 1 +repita 2 +uma vez +para 1 +para 2 +para 3 +para 4 +para 5 +i apos para: 5 +desc 5 +desc 4 +desc 3 +desc 2 +desc 1 +i apos desc: 1 +passo3 0 +passo3 3 +passo3 6 +passo3 9 +i apos passo3: 10 +passo-4 10 +passo-4 6 +passo-4 2 +passo+2 0 +passo+2 2 +passo+2 4 +passo+2 6 +passo+2 8 +passo+2 10 +i apos vazio: 1 +uma vez 3 +break 1 +break 2 +break 3 +break 100 +i apos break: 10 +soma 36 +expr 2 +expr 3 +expr 4 +expr 5 +expr 6 +expr 7 +expr 8 +outro 1 +par 2 +mult3 3 +par 4 +outro 5 +par 6 +outro 7 +par 8 +mult3 9 +par 10 diff --git a/test/casos/divzero.codigo b/test/casos/divzero.codigo new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/test/casos/divzero.codigo @@ -0,0 +1 @@ +1 diff --git a/test/casos/divzero.codigo.c b/test/casos/divzero.codigo.c new file mode 100644 index 00000000..7296f257 --- /dev/null +++ b/test/casos/divzero.codigo.c @@ -0,0 +1 @@ +136 diff --git a/test/casos/divzero.codigo.nativo b/test/casos/divzero.codigo.nativo new file mode 100644 index 00000000..7296f257 --- /dev/null +++ b/test/casos/divzero.codigo.nativo @@ -0,0 +1 @@ +136 diff --git a/test/casos/divzero.gpt b/test/casos/divzero.gpt new file mode 100644 index 00000000..32f5f9ea --- /dev/null +++ b/test/casos/divzero.gpt @@ -0,0 +1,10 @@ +algoritmo divzero; +variáveis + a, b : inteiro; +fim-variáveis +início + a := 1; b := 0; + imprima("antes"); + imprima(a / b); + imprima("depois"); +fim diff --git a/test/casos/divzero.pular b/test/casos/divzero.pular new file mode 100644 index 00000000..8e1a5599 --- /dev/null +++ b/test/casos/divzero.pular @@ -0,0 +1 @@ +windows diff --git a/test/casos/divzero.saida b/test/casos/divzero.saida new file mode 100644 index 00000000..9ee5a417 --- /dev/null +++ b/test/casos/divzero.saida @@ -0,0 +1 @@ +antes diff --git a/test/casos/divzero.saida.c b/test/casos/divzero.saida.c new file mode 100644 index 00000000..e69de29b diff --git a/test/casos/divzero_real.codigo b/test/casos/divzero_real.codigo new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/test/casos/divzero_real.codigo @@ -0,0 +1 @@ +1 diff --git a/test/casos/divzero_real.codigo.c b/test/casos/divzero_real.codigo.c new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/test/casos/divzero_real.codigo.c @@ -0,0 +1 @@ +0 diff --git a/test/casos/divzero_real.codigo.nativo b/test/casos/divzero_real.codigo.nativo new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/test/casos/divzero_real.codigo.nativo @@ -0,0 +1 @@ +0 diff --git a/test/casos/divzero_real.gpt b/test/casos/divzero_real.gpt new file mode 100644 index 00000000..0e89a90c --- /dev/null +++ b/test/casos/divzero_real.gpt @@ -0,0 +1,10 @@ +algoritmo divzero_real; +variáveis + a, b : real; +fim-variáveis +início + a := 1; b := 0; + imprima(a / b); + imprima(-a / b); + imprima("depois"); +fim diff --git a/test/casos/divzero_real.pular b/test/casos/divzero_real.pular new file mode 100644 index 00000000..8e1a5599 --- /dev/null +++ b/test/casos/divzero_real.pular @@ -0,0 +1 @@ +windows diff --git a/test/casos/divzero_real.saida b/test/casos/divzero_real.saida new file mode 100644 index 00000000..e69de29b diff --git a/test/casos/divzero_real.saida.c b/test/casos/divzero_real.saida.c new file mode 100644 index 00000000..54c2f9e6 --- /dev/null +++ b/test/casos/divzero_real.saida.c @@ -0,0 +1,3 @@ +inf +-inf +depois diff --git a/test/casos/divzero_real.saida.nativo b/test/casos/divzero_real.saida.nativo new file mode 100644 index 00000000..48ae793f --- /dev/null +++ b/test/casos/divzero_real.saida.nativo @@ -0,0 +1,3 @@ +1.00 +-1.00 +depois diff --git a/test/casos/exitcode.codigo b/test/casos/exitcode.codigo new file mode 100644 index 00000000..7f8f011e --- /dev/null +++ b/test/casos/exitcode.codigo @@ -0,0 +1 @@ +7 diff --git a/test/casos/exitcode.gpt b/test/casos/exitcode.gpt new file mode 100644 index 00000000..6aca757a --- /dev/null +++ b/test/casos/exitcode.gpt @@ -0,0 +1,6 @@ +algoritmo exitcode; +início + imprima("antes"); + retorne 7; + imprima("depois"); +fim diff --git a/test/casos/exitcode.saida b/test/casos/exitcode.saida new file mode 100644 index 00000000..9ee5a417 --- /dev/null +++ b/test/casos/exitcode.saida @@ -0,0 +1 @@ +antes diff --git a/test/casos/exitcode_default.gpt b/test/casos/exitcode_default.gpt new file mode 100644 index 00000000..db35b102 --- /dev/null +++ b/test/casos/exitcode_default.gpt @@ -0,0 +1,4 @@ +algoritmo exitcode_default; +início + imprima("nada"); +fim diff --git a/test/casos/exitcode_default.saida b/test/casos/exitcode_default.saida new file mode 100644 index 00000000..1fa16846 --- /dev/null +++ b/test/casos/exitcode_default.saida @@ -0,0 +1 @@ +nada diff --git a/test/casos/exitcode_expr.codigo b/test/casos/exitcode_expr.codigo new file mode 100644 index 00000000..7f8f011e --- /dev/null +++ b/test/casos/exitcode_expr.codigo @@ -0,0 +1 @@ +7 diff --git a/test/casos/exitcode_expr.gpt b/test/casos/exitcode_expr.gpt new file mode 100644 index 00000000..c7849bcd --- /dev/null +++ b/test/casos/exitcode_expr.gpt @@ -0,0 +1,8 @@ +algoritmo exitcode_expr; +variáveis + a : inteiro; +fim-variáveis +início + a := 3; + retorne a * 2 + 1; +fim diff --git a/test/casos/exitcode_expr.saida b/test/casos/exitcode_expr.saida new file mode 100644 index 00000000..e69de29b diff --git a/test/casos/fizzbuzz.gpt b/test/casos/fizzbuzz.gpt new file mode 100644 index 00000000..a07b6ad3 --- /dev/null +++ b/test/casos/fizzbuzz.gpt @@ -0,0 +1,23 @@ +algoritmo fizzbuzz; + +variáveis + i : inteiro; +fim-variáveis + +início + para i de 1 até 15 faça + se i % 15 = 0 então + imprima("FizzBuzz"); + senão + se i % 3 = 0 então + imprima("Fizz"); + senão + se i % 5 = 0 então + imprima("Buzz"); + senão + imprima(i); + fim-se + fim-se + fim-se + fim-para +fim diff --git a/test/casos/fizzbuzz.saida b/test/casos/fizzbuzz.saida new file mode 100644 index 00000000..0a934f21 --- /dev/null +++ b/test/casos/fizzbuzz.saida @@ -0,0 +1,15 @@ +1 +2 +Fizz +4 +Buzz +Fizz +7 +8 +Fizz +Buzz +11 +Fizz +13 +14 +FizzBuzz diff --git a/test/casos/funcs.gpt b/test/casos/funcs.gpt new file mode 100644 index 00000000..976db6fc --- /dev/null +++ b/test/casos/funcs.gpt @@ -0,0 +1,180 @@ +algoritmo funcs; +variáveis + g : inteiro; + v : matriz[3] de inteiros; +fim-variáveis +início + g := 10; + imprima(fatorial(5), " ", fib(10), " ", soma(2, 3)); + imprima(media(3.0, 4.0), " ", media(3, 4)); + imprima(eh_par(4), " ", eh_par(7)); + imprima(maior_char('a', 'b'), " ", concat_nome("ab")); + sem_retorno(); + imprima("global antes: ", g); + altera_global(); + imprima("global depois: ", g); + sombra(); + imprima("global apos sombra: ", g); + v[0] := 1; v[1] := 2; v[2] := 3; + imprima(soma_vetor(v)); + altera_vetor(v); + imprima("vetor apos funcao: ", v[0], " ", v[1], " ", v[2]); + imprima(retorno_cedo(5), " ", retorno_cedo(-5)); + imprima(retorno_loop(3)); + imprima(ackermann(2, 3)); + imprima(soma(fatorial(3), fib(5))); + imprima(real_para_int(3.9), " ", int_para_real(3)); + imprima(retorna_logico(), " ", retorna_char(), " ", retorna_str()); + imprima(param_real(5), " ", param_int(5.9)); + imprima(muitos(1, 2.5, 'c', "str", verdadeiro)); + imprima(local_nao_inicializada()); + imprima(local_nao_inicializada()); + vazia(); + retorne 0; +fim + +função fatorial(n: inteiro): inteiro +início + se n <= 1 então retorne 1; fim-se + retorne n * fatorial(n - 1); +fim + +função fib(n: inteiro): inteiro +início + se n < 2 então retorne n; fim-se + retorne fib(n-1) + fib(n-2); +fim + +função soma(a: inteiro, b: inteiro): inteiro +início + retorne a + b; +fim + +função media(a: real, b: real): real +início + retorne (a + b) / 2; +fim + +função eh_par(n: inteiro): lógico +início + retorne n % 2 = 0; +fim + +função maior_char(a: caractere, b: caractere): caractere +início + se a > b então retorne a; fim-se + retorne b; +fim + +função concat_nome(s: literal): literal +início + retorne s; +fim + +função sem_retorno() +início + imprima("sem retorno chamada"); +fim + +função altera_global() +início + g := g + 5; +fim + +função sombra() + g : inteiro; +início + g := 999; + imprima("local g: ", g); +fim + +função soma_vetor(m: matriz[3] de inteiros): inteiro + i, s : inteiro; +início + s := 0; + para i de 0 até 2 faça s := s + m[i]; fim-para + retorne s; +fim + +função altera_vetor(m: matriz[3] de inteiros) +início + m[0] := 100; +fim + +função retorno_cedo(n: inteiro): inteiro +início + se n > 0 então + retorne 1; + fim-se + imprima("negativo"); + retorne -1; +fim + +função retorno_loop(n: inteiro): inteiro + i : inteiro; +início + para i de 0 até 100 faça + se i = n então retorne i * 10; fim-se + fim-para + retorne -1; +fim + +função ackermann(m: inteiro, n: inteiro): inteiro +início + se m = 0 então retorne n + 1; fim-se + se n = 0 então retorne ackermann(m - 1, 1); fim-se + retorne ackermann(m - 1, ackermann(m, n - 1)); +fim + +função real_para_int(r: real): inteiro +início + retorne r; +fim + +função int_para_real(i: inteiro): real +início + retorne i; +fim + +função retorna_logico(): lógico +início + retorne verdadeiro; +fim + +função retorna_char(): caractere +início + retorne 'q'; +fim + +função retorna_str(): literal +início + retorne "olá"; +fim + +função param_real(r: real): real +início + retorne r / 2; +fim + +função param_int(i: inteiro): inteiro +início + retorne i; +fim + +função muitos(a: inteiro, b: real, c: caractere, d: literal, ee: lógico): literal +início + imprima(a, " ", b, " ", c, " ", d, " ", ee); + retorne d; +fim + +função local_nao_inicializada(): inteiro + x : inteiro; +início + x := x + 1; + retorne x; +fim + +função vazia() +início +fim + diff --git a/test/casos/funcs.saida b/test/casos/funcs.saida new file mode 100644 index 00000000..b27fbdc9 --- /dev/null +++ b/test/casos/funcs.saida @@ -0,0 +1,23 @@ +120 55 5 +3.50 3.50 +verdadeiro falso +b ab +sem retorno chamada +global antes: 10 +global depois: 15 +local g: 999 +global apos sombra: 15 +6 +vetor apos funcao: 1 2 3 +negativo +1 -1 +30 +9 +11 +3 3.00 +verdadeiro q olá +2.50 5 +1 2.50 c str verdadeiro +str +1 +1 diff --git a/test/casos/invertervetor.gpt b/test/casos/invertervetor.gpt new file mode 100644 index 00000000..33211d44 --- /dev/null +++ b/test/casos/invertervetor.gpt @@ -0,0 +1,32 @@ +algoritmo inverterVetor; + +variáveis + a: matriz[10] de inteiros; + i, indice_fim, temporario: inteiro; +fim-variáveis + +início + // Inicializa o vetor + para i de 0 até 9 faça + a[i] := i + 1; + fim-para + + imprima("Antes: "); + para i de 0 até 9 faça + imprima(a[i], " "); + fim-para + imprima("\n"); + + // Inversão in-place usando só um 'para' até a metade + indice_fim := 9; + para i de 0 até 4 faça + temporario := a[i]; + a[i] := a[indice_fim - i]; + a[indice_fim - i] := temporario; + fim-para + + imprima("Depois: "); + para i de 0 até 9 faça + imprima(a[i], " "); + fim-para +fim diff --git a/test/casos/invertervetor.saida b/test/casos/invertervetor.saida new file mode 100644 index 00000000..f0df10fe --- /dev/null +++ b/test/casos/invertervetor.saida @@ -0,0 +1,24 @@ +Antes: +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 + + +Depois: +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 diff --git a/test/casos/leia.entrada b/test/casos/leia.entrada new file mode 100644 index 00000000..abf6bfb0 --- /dev/null +++ b/test/casos/leia.entrada @@ -0,0 +1,19 @@ +123 +123 456 +abc +123s +2.5 +7 +olá mundo + +z +falso +0 +falso 12wtc +0 umdois3 +verdadeiro +1 +7 +1 +2 +0 diff --git a/test/casos/leia.gpt b/test/casos/leia.gpt new file mode 100644 index 00000000..2edd174a --- /dev/null +++ b/test/casos/leia.gpt @@ -0,0 +1,30 @@ +algoritmo leia_teste; +variáveis + i : inteiro; + r : real; + s : literal; + c : caractere; + l : lógico; + v : matriz[3] de inteiros; +fim-variáveis +início + i := leia(); imprima("i=", i); + i := leia(); imprima("i=", i); + i := leia(); imprima("i=", i); + i := leia(); imprima("i=", i); + r := leia(); imprima("r=", r); + r := leia(); imprima("r=", r); + s := leia(); imprima("s=[", s, "]"); + s := leia(); imprima("s=[", s, "]"); + c := leia(); imprima("c=", c); + l := leia(); imprima("l=", l); + l := leia(); imprima("l=", l); + l := leia(); imprima("l=", l); + l := leia(); imprima("l=", l); + l := leia(); imprima("l=", l); + v[leia()] := 42; imprima(v[0], " ", v[1], " ", v[2]); + i := leia(); se i = 7 então imprima("sete"); senão imprima("nao sete"); fim-se + i := leia(); enquanto i <> 0 faça imprima("loop"); i := leia(); fim-enquanto + i := leia(); imprima("eof i=", i); + s := leia(); imprima("eof s=[", s, "]"); +fim diff --git a/test/casos/leia.pular b/test/casos/leia.pular new file mode 100644 index 00000000..c9bb575b --- /dev/null +++ b/test/casos/leia.pular @@ -0,0 +1 @@ +nativo diff --git a/test/casos/leia.saida b/test/casos/leia.saida new file mode 100644 index 00000000..83a6fa7b --- /dev/null +++ b/test/casos/leia.saida @@ -0,0 +1,20 @@ +i=123 +i=123 +i=0 +i=123 +r=2.50 +r=7.00 +s=[olá mundo] +s=[(nulo)] +c=z +l=falso +l=falso +l=verdadeiro +l=verdadeiro +l=verdadeiro +0 42 0 +sete +loop +loop +eof i=0 +eof s=[(nulo)] diff --git a/test/casos/leia.saida.c b/test/casos/leia.saida.c new file mode 100644 index 00000000..30199315 --- /dev/null +++ b/test/casos/leia.saida.c @@ -0,0 +1,18 @@ +i=123 +i=123 +i=456 +i=0 +r=0.00 +r=0.00 +s=[abc] +s=[123s] +c=2 +l=verdadeiro +l=verdadeiro +l=verdadeiro +l=verdadeiro +l=verdadeiro +42 0 0 +nao sete +eof i=0 +eof s=[falso] diff --git a/test/casos/lexical.gpt b/test/casos/lexical.gpt new file mode 100644 index 00000000..b3f7871d --- /dev/null +++ b/test/casos/lexical.gpt @@ -0,0 +1,25 @@ +// comentário de linha +/* comentário + de bloco */ +algoritmo lexical; // comentário após +variáveis + x_1, numero, Maiuscula : inteiro; /* inline */ + _sub : real; +fim-variáveis +início + x_1 := 1; numero := 2; Maiuscula := 3; _sub := 4; + imprima(x_1, numero, Maiuscula, _sub); + imprima(/* dentro */ 5); + imprima("// não é comentário", " ", "/* nem isso */"); + imprima(1+2,3-4,5*6); + imprima( 7 ); + imprima( + 8, + 9 + ); + imprima(010, " ", 0, " ", 00); + imprima(1.0, " ", 10.50, " ", 0.0); + imprima('\n'); + imprima("linha1\nlinha2"); + imprima("fim-variáveis não é keyword aqui"); +fim diff --git a/test/casos/lexical.saida b/test/casos/lexical.saida new file mode 100644 index 00000000..7148a977 --- /dev/null +++ b/test/casos/lexical.saida @@ -0,0 +1,13 @@ +1234.00 +5 +// não é comentário /* nem isso */ +3-130 +7 +89 +10 0 0 +1.00 10.50 0.00 + + +linha1 +linha2 +fim-variáveis não é keyword aqui diff --git a/test/casos/lexical.saida.c b/test/casos/lexical.saida.c new file mode 100644 index 00000000..1ad1cc22 --- /dev/null +++ b/test/casos/lexical.saida.c @@ -0,0 +1,13 @@ +1234.00 +5 +// não é comentário /* nem isso */ +3-130 +7 +89 +8 0 0 +1.00 10.50 0.00 + + +linha1 +linha2 +fim-variáveis não é keyword aqui diff --git a/test/casos/logic.gpt b/test/casos/logic.gpt new file mode 100644 index 00000000..5a84da6b --- /dev/null +++ b/test/casos/logic.gpt @@ -0,0 +1,31 @@ +algoritmo logic; +variáveis + a, b : inteiro; + l, m : lógico; + c, d : caractere; + s, t : literal; + r : real; +fim-variáveis +início + a := 3; b := 5; + imprima(a < b, " ", a > b, " ", a <= b, " ", a >= b, " ", a = b, " ", a <> b); + imprima(a = 3, " ", 3 = a, " ", a <> 3); + l := verdadeiro; m := falso; + imprima(l, " ", m, " ", l e m, " ", l ou m, " ", não l, " ", não m); + imprima(l = m, " ", l <> m, " ", l = verdadeiro, " ", m = falso); + imprima(não (a < b), " ", não a < b); + imprima(a < b e b < 10, " ", a > b ou b = 5, " ", a < b ou b < 1 e falso); + imprima(verdadeiro ou falso e falso); + c := 'a'; d := 'b'; + imprima(c, " ", d, " ", c = d, " ", c <> d, " ", c < d, " ", c = 'a'); + s := "abc"; t := "abd"; + imprima(s, " ", t, " ", s = t, " ", s <> t, " ", s = "abc"); + r := 3.0; + imprima(r = a, " ", r = 3, " ", r < 3.5, " ", r >= 3, " ", a = r); + imprima(1 < 2 = verdadeiro); + l := a < b; imprima(l); + l := 1; imprima(l); + l := 0; imprima(l); + a := verdadeiro; imprima(a); + a := falso; imprima(a); +fim diff --git a/test/casos/logic.saida b/test/casos/logic.saida new file mode 100644 index 00000000..58001950 --- /dev/null +++ b/test/casos/logic.saida @@ -0,0 +1,16 @@ +verdadeiro falso verdadeiro falso falso verdadeiro +verdadeiro verdadeiro falso +verdadeiro falso falso verdadeiro falso verdadeiro +falso verdadeiro verdadeiro verdadeiro +falso verdadeiro +verdadeiro verdadeiro verdadeiro +verdadeiro +a b falso verdadeiro verdadeiro verdadeiro +abc abd falso verdadeiro verdadeiro +verdadeiro verdadeiro verdadeiro verdadeiro verdadeiro +verdadeiro +verdadeiro +verdadeiro +falso +1 +0 diff --git a/test/casos/main_after_funcs.gpt b/test/casos/main_after_funcs.gpt new file mode 100644 index 00000000..03dee827 --- /dev/null +++ b/test/casos/main_after_funcs.gpt @@ -0,0 +1,17 @@ +algoritmo main_after_funcs; +variáveis + x : inteiro; +fim-variáveis +início + x := dobro(21); + imprima(x); + imprima(triplo(x)); +fim +função dobro(n: inteiro): inteiro +início + retorne n * 2; +fim +função triplo(n: inteiro): inteiro +início + retorne dobro(n) + n; +fim diff --git a/test/casos/main_after_funcs.saida b/test/casos/main_after_funcs.saida new file mode 100644 index 00000000..a307d9e8 --- /dev/null +++ b/test/casos/main_after_funcs.saida @@ -0,0 +1,2 @@ +42 +126 diff --git a/test/casos/modzero.codigo b/test/casos/modzero.codigo new file mode 100644 index 00000000..7296f257 --- /dev/null +++ b/test/casos/modzero.codigo @@ -0,0 +1 @@ +136 diff --git a/test/casos/modzero.gpt b/test/casos/modzero.gpt new file mode 100644 index 00000000..2e329b51 --- /dev/null +++ b/test/casos/modzero.gpt @@ -0,0 +1,9 @@ +algoritmo modzero; +variáveis + a, b : inteiro; +fim-variáveis +início + a := 1; b := 0; + imprima(a % b); + imprima("depois"); +fim diff --git a/test/casos/modzero.pular b/test/casos/modzero.pular new file mode 100644 index 00000000..8e1a5599 --- /dev/null +++ b/test/casos/modzero.pular @@ -0,0 +1 @@ +windows diff --git a/test/casos/modzero.saida b/test/casos/modzero.saida new file mode 100644 index 00000000..e69de29b diff --git a/test/casos/multifile_main.args b/test/casos/multifile_main.args new file mode 100644 index 00000000..ed906ced --- /dev/null +++ b/test/casos/multifile_main.args @@ -0,0 +1 @@ +_multifile_lib.gpt ../../lib/base.gpt diff --git a/test/casos/multifile_main.gpt b/test/casos/multifile_main.gpt new file mode 100644 index 00000000..cd417cd6 --- /dev/null +++ b/test/casos/multifile_main.gpt @@ -0,0 +1,5 @@ +algoritmo multifile; +início + imprima(dobro(4)); + imprima(arredonda(2.6), " ", absoluto(-3.5), " ", potencia(2, 10), " ", raiz_quadrada(16)); +fim diff --git a/test/casos/multifile_main.saida b/test/casos/multifile_main.saida new file mode 100644 index 00000000..128b3aaa --- /dev/null +++ b/test/casos/multifile_main.saida @@ -0,0 +1,2 @@ +8 +8.00 3.50 1024.00 4.00 diff --git a/test/casos/multifile_main.saida.c b/test/casos/multifile_main.saida.c new file mode 100644 index 00000000..c073ca4e --- /dev/null +++ b/test/casos/multifile_main.saida.c @@ -0,0 +1,2 @@ +8 +0.00 3.50 1024.00 4.00 diff --git a/test/casos/multifile_main.saida.nativo b/test/casos/multifile_main.saida.nativo new file mode 100644 index 00000000..c073ca4e --- /dev/null +++ b/test/casos/multifile_main.saida.nativo @@ -0,0 +1,2 @@ +8 +0.00 3.50 1024.00 4.00 diff --git a/test/casos/novars.gpt b/test/casos/novars.gpt new file mode 100644 index 00000000..e43ed126 --- /dev/null +++ b/test/casos/novars.gpt @@ -0,0 +1,4 @@ +algoritmo novars; +início + imprima("sem variáveis"); +fim diff --git a/test/casos/novars.saida b/test/casos/novars.saida new file mode 100644 index 00000000..2bf7b444 --- /dev/null +++ b/test/casos/novars.saida @@ -0,0 +1 @@ +sem variáveis diff --git a/test/casos/olamundo.gpt b/test/casos/olamundo.gpt new file mode 100644 index 00000000..30713138 --- /dev/null +++ b/test/casos/olamundo.gpt @@ -0,0 +1,5 @@ +algoritmo olamundo; + +início + imprima("Olá Mundo!"); +fim diff --git a/test/casos/olamundo.saida b/test/casos/olamundo.saida new file mode 100644 index 00000000..a6425e39 --- /dev/null +++ b/test/casos/olamundo.saida @@ -0,0 +1 @@ +Olá Mundo! diff --git a/test/casos/precedence.gpt b/test/casos/precedence.gpt new file mode 100644 index 00000000..ff646ccf --- /dev/null +++ b/test/casos/precedence.gpt @@ -0,0 +1,28 @@ +algoritmo precedence; +variáveis + a, b, c : inteiro; + l : lógico; +fim-variáveis +início + a := 2; b := 3; c := 4; + imprima(a + b * c, " ", (a + b) * c, " ", a * b + c, " ", a - b - c, " ", a - (b - c)); + imprima(a / b * c, " ", a * b / c, " ", 20 / 4 / 2, " ", 20 / (4 / 2)); + imprima(a + b % c, " ", (a + b) % c, " ", 10 % 4 % 3, " ", 2 * 3 % 4); + imprima(-a * b, " ", -(a * b), " ", - a + b, " ", -(a + b)); + imprima(a < b = verdadeiro, " ", (a < b) = verdadeiro); + imprima(a = 2 e b = 3, " ", a = 2 ou b = 9 e falso, " ", (a = 2 ou b = 9) e falso); + imprima(não a = 2, " ", não (a = 2), " ", não falso e falso, " ", não (falso e falso)); + imprima(a + b = 5, " ", a = 5 - b, " ", a + b > c e c > a); + imprima(1 | 2 ^ 3 & 4, " ", (1 | 2) ^ (3 & 4), " ", 1 | (2 ^ (3 & 4))); + imprima(6 & 3 = 2, " ", (6 & 3) = 2); + imprima(~0, " ", ~(~5), " ", -(-5), " ", +(-5), " ", -(+5)); + imprima(2 * -3, " ", 2 + -3, " ", 2 - -3, " ", -2 * -3); + imprima(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10); + imprima(((((1 + 2))))); + imprima(a * (b + (c - (a + b)))); + imprima(verdadeiro ou falso e falso ou falso); + imprima(falso e verdadeiro ou verdadeiro); + imprima(1 < 2 e 2 < 3 e 3 < 4); + imprima(1 <> 2 e não 2 = 3); + imprima(10 - 2 * 3 + 4 / 2 % 3); +fim diff --git a/test/casos/precedence.saida b/test/casos/precedence.saida new file mode 100644 index 00000000..80c9cb8d --- /dev/null +++ b/test/casos/precedence.saida @@ -0,0 +1,20 @@ +14 20 10 -5 3 +0 1 2 10 +5 1 2 2 +-6 -6 1 -5 +verdadeiro verdadeiro +verdadeiro verdadeiro falso +falso falso falso verdadeiro +verdadeiro verdadeiro verdadeiro +3 3 3 +0 verdadeiro +-1 5 5 -5 -5 +-6 -1 5 6 +55 +3 +4 +verdadeiro +verdadeiro +verdadeiro +falso +6 diff --git a/test/casos/real_format.gpt b/test/casos/real_format.gpt new file mode 100644 index 00000000..ec83a35a --- /dev/null +++ b/test/casos/real_format.gpt @@ -0,0 +1,31 @@ +algoritmo real_format; +variáveis + r : real; + i : inteiro; +fim-variáveis +início + r := 0; imprima(r); + r := 1; imprima(r); + r := 1.1; imprima(r); + r := 1.15; imprima(r); + r := 1.25; imprima(r); + r := 1.35; imprima(r); + r := 2.675; imprima(r); + r := 99.999; imprima(r); + r := -1.005; imprima(r); + r := 1000000; imprima(r); + r := 12345678.9; imprima(r); + imprima(5 / 2, " ", 5.0 / 2, " ", 5 / 2.0, " ", 5 * 1.0 / 2); + imprima(7 % 3 * 1.0); + i := 5 / 2; imprima(i); + i := 5 / 2.0; imprima(i); + i := -5 / 2; imprima(i); + i := -2.5; imprima(i); + i := 2.5; imprima(i); + i := 3.5; imprima(i); + i := -3.5; imprima(i); + i := 0.9999; imprima(i); + imprima(1.5 + 1, " ", 1 + 1.5, " ", 3 * 0.5, " ", 2 - 0.5); + imprima(3.0 = 3, " ", 3.1 > 3, " ", 2.99 < 3); + imprima(10 % 3); +fim diff --git a/test/casos/real_format.saida b/test/casos/real_format.saida new file mode 100644 index 00000000..bbdd0374 --- /dev/null +++ b/test/casos/real_format.saida @@ -0,0 +1,24 @@ +0.00 +1.00 +1.10 +1.15 +1.25 +1.35 +2.67 +100.00 +-1.00 +1000000.00 +12345679.00 +2 2.50 2.50 2.50 +1.00 +2 +2 +-2 +-2 +2 +3 +-3 +0 +2.50 2.50 1.50 1.50 +verdadeiro verdadeiro verdadeiro +1 diff --git a/test/casos/real_format.saida.c b/test/casos/real_format.saida.c new file mode 100644 index 00000000..eacd825d --- /dev/null +++ b/test/casos/real_format.saida.c @@ -0,0 +1,24 @@ +0.00 +1.00 +1.10 +1.15 +1.25 +1.35 +2.67 +100.00 +-1.00 +1000000.00 +12345678.90 +2 2.50 2.50 2.50 +1.00 +2 +2 +-2 +-2 +2 +3 +-3 +0 +2.50 2.50 1.50 1.50 +verdadeiro verdadeiro verdadeiro +1 diff --git a/test/casos/real_format.saida.nativo b/test/casos/real_format.saida.nativo new file mode 100644 index 00000000..c0a1c8f5 --- /dev/null +++ b/test/casos/real_format.saida.nativo @@ -0,0 +1,24 @@ +0.00 +1.00 +1.10 +1.15 +1.25 +1.35 +2.67 +99.010 +-1.00 +1000000.00 +12345679.00 +2 2.50 2.50 2.50 +1.00 +2 +2 +2147483645 +-2 +2 +3 +-3 +0 +2.50 2.50 1.50 1.50 +verdadeiro verdadeiro verdadeiro +1 diff --git a/test/casos/scoping.gpt b/test/casos/scoping.gpt new file mode 100644 index 00000000..ffd495e9 --- /dev/null +++ b/test/casos/scoping.gpt @@ -0,0 +1,31 @@ +algoritmo scoping; +variáveis + x, y : inteiro; +fim-variáveis +início + x := 1; y := 2; + f(10); + imprima(x, " ", y); + g(); + imprima(x, " ", y); + imprima(h(5), " ", x); +fim +função f(x: inteiro) +início + x := x + 1; + y := y + x; + imprima("f: ", x, " ", y); +fim +função g() + y : inteiro; +início + y := 100; + x := x + 1; + imprima("g: ", x, " ", y); +fim +função h(a: inteiro): inteiro + x : inteiro; +início + x := a * 2; + retorne x; +fim diff --git a/test/casos/scoping.saida b/test/casos/scoping.saida new file mode 100644 index 00000000..96761391 --- /dev/null +++ b/test/casos/scoping.saida @@ -0,0 +1,5 @@ +f: 11 13 +1 13 +g: 2 100 +2 13 +10 2 diff --git a/test/casos/stmt_forms.gpt b/test/casos/stmt_forms.gpt new file mode 100644 index 00000000..b49d38be --- /dev/null +++ b/test/casos/stmt_forms.gpt @@ -0,0 +1,23 @@ +algoritmo stmt_forms; +variáveis + a : inteiro; +fim-variáveis +início + a := 1; + imprima(a); + se a = 1 então + fim-se + enquanto falso faça + fim-enquanto + para a de 1 até 0 faça + fim-para + repita + até verdadeiro; + imprima("ok"); + f(); + f(); +fim +função f() +início + imprima("f"); +fim diff --git a/test/casos/stmt_forms.saida b/test/casos/stmt_forms.saida new file mode 100644 index 00000000..bef8768b --- /dev/null +++ b/test/casos/stmt_forms.saida @@ -0,0 +1,4 @@ +1 +ok +f +f diff --git a/test/casos/string_in_func.gpt b/test/casos/string_in_func.gpt new file mode 100644 index 00000000..4f56446f --- /dev/null +++ b/test/casos/string_in_func.gpt @@ -0,0 +1,28 @@ +algoritmo string_in_func; +variáveis + s : literal; + m : matriz[2] de literais; +fim-variáveis +início + s := "global"; + m[0] := "m0"; m[1] := "m1"; + mostra(s); + mostra(m[1]); + mostra("direto"); + s := devolve("x"); + imprima(s); + imprima(devolve(devolve("y"))); + imprima(tam("abc")); +fim +função mostra(t: literal) +início + imprima("[", t, "]"); +fim +função devolve(t: literal): literal +início + retorne t; +fim +função tam(t: literal): inteiro +início + retorne 3; +fim diff --git a/test/casos/string_in_func.saida b/test/casos/string_in_func.saida new file mode 100644 index 00000000..f2224baa --- /dev/null +++ b/test/casos/string_in_func.saida @@ -0,0 +1,6 @@ +[global] +[m1] +[direto] +x +y +3 diff --git a/test/casos/strings.gpt b/test/casos/strings.gpt new file mode 100644 index 00000000..603c02e9 --- /dev/null +++ b/test/casos/strings.gpt @@ -0,0 +1,33 @@ +algoritmo strings; +variáveis + s : literal; + c : caractere; + i : inteiro; + r : real; +fim-variáveis +início + imprima("Olá, mundo! ação, coração, ÀÉÍÓÚ àéíóú ç Ç ñ"); + imprima("tab\taqui", " ", "nova\nlinha", " ", "aspas \" duplas", " ", "barra \\ invertida"); + imprima("aspas ' simples", " ", 'x', " ", '\'', " ", '\\'); + imprima(""); + imprima("a", "b", "c", 1, 2.5, verdadeiro, 'z'); + imprima(1, " ", 2, " ", 3); + s := "texto com espaços e tabs"; + imprima(s); + s := ""; imprima("[", s, "]"); + s := "ção"; imprima(s); + c := 'a'; imprima(c); + i := 65; c := i; imprima(c); + c := 'A'; i := c; imprima(i); + c := 'A' + 1; imprima(c); + i := 'a' + 1; imprima(i); + imprima('a' < 'b', " ", 'a' + 'b'); + imprima("número: ", 42, ", real: ", 3.14159, ", lógico: ", falso); + r := 1234567.891; imprima(r); + r := 0.001; imprima(r); + r := -0.004; imprima(r); + r := 123456789012.0; imprima(r); + imprima(3.14159265358979); + imprima(100, " ", -100, " ", 0); + imprima("fim"); +fim diff --git a/test/casos/strings.saida b/test/casos/strings.saida new file mode 100644 index 00000000..ef904617 --- /dev/null +++ b/test/casos/strings.saida @@ -0,0 +1,24 @@ +Olá, mundo! ação, coração, ÀÉÍÓÚ àéíóú ç Ç ñ +tab aqui nova +linha aspas " duplas barra \ invertida +aspas ' simples x ' \ +(nulo) +abc12.50verdadeiroz +1 2 3 +texto com espaços e tabs +[(nulo)] +ção +a +A +65 +B +98 +verdadeiro 195 +número: 42, real: 3.14, lógico: falso +1234567.88 +0.00 +-0.00 +123456790528.00 +3.14 +100 -100 0 +fim diff --git a/test/casos/strings.saida.c b/test/casos/strings.saida.c new file mode 100644 index 00000000..e78f1904 --- /dev/null +++ b/test/casos/strings.saida.c @@ -0,0 +1,24 @@ +Olá, mundo! ação, coração, ÀÉÍÓÚ àéíóú ç Ç ñ +tab aqui nova +linha aspas " duplas barra \ invertida +aspas ' simples x ' \ +(nulo) +abc12.50verdadeiroz +1 2 3 +texto com espaços e tabs +[(nulo)] +ção +a +A +65 +B +98 +verdadeiro à +número: 42, real: 3.14, lógico: falso +1234567.89 +0.00 +-0.00 +123456789012.00 +3.14 +100 -100 0 +fim diff --git a/test/casos/strings.saida.nativo b/test/casos/strings.saida.nativo new file mode 100644 index 00000000..551614d3 --- /dev/null +++ b/test/casos/strings.saida.nativo @@ -0,0 +1,24 @@ +Olá, mundo! ação, coração, ÀÉÍÓÚ àéíóú ç Ç ñ +tabtaqui nova +linha aspas " duplas barra \ invertida +aspas ' simples x ' \ +(nulo) +abc12.50verdadeiroz +1 2 3 +texto com espaços e tabs +[(nulo)] +ção +a +A +65 +B +98 +verdadeiro à +número: 42, real: 3.14, lógico: falso +1234567.88 +0.00 +0.00 +28.74 +3.14 +100 -100 0 +fim diff --git a/test/erros/and_symbol.gpt b/test/erros/and_symbol.gpt new file mode 100644 index 00000000..d86a3d63 --- /dev/null +++ b/test/erros/and_symbol.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + l : lógico; +fim-variáveis +início + l := verdadeiro && falso; + l := verdadeiro || falso; +fim diff --git a/test/erros/and_symbol.msg b/test/erros/and_symbol.msg new file mode 100644 index 00000000..3c31b4f2 --- /dev/null +++ b/test/erros/and_symbol.msg @@ -0,0 +1,2 @@ +and_symbol.gpt:6 - Esperando expressão, encontrado & após "&". +and_symbol.gpt:7 - Esperando expressão, encontrado | após "|". diff --git a/test/erros/assign_char_to_str.gpt b/test/erros/assign_char_to_str.gpt new file mode 100644 index 00000000..1ad5a979 --- /dev/null +++ b/test/erros/assign_char_to_str.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + s : literal; +fim-variáveis +início + s := 'z'; +fim diff --git a/test/erros/assign_char_to_str.msg b/test/erros/assign_char_to_str.msg new file mode 100644 index 00000000..d0d7ca28 --- /dev/null +++ b/test/erros/assign_char_to_str.msg @@ -0,0 +1 @@ +assign_char_to_str.gpt:6 - Variável "s" não pode receber valores do tipo 'caractere'. diff --git a/test/erros/assign_int_to_str.gpt b/test/erros/assign_int_to_str.gpt new file mode 100644 index 00000000..4c5d44d3 --- /dev/null +++ b/test/erros/assign_int_to_str.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + s : literal; +fim-variáveis +início + s := 5; +fim diff --git a/test/erros/assign_int_to_str.msg b/test/erros/assign_int_to_str.msg new file mode 100644 index 00000000..d04ed23f --- /dev/null +++ b/test/erros/assign_int_to_str.msg @@ -0,0 +1 @@ +assign_int_to_str.gpt:6 - Variável "s" não pode receber valores do tipo 'inteiro'. diff --git a/test/erros/assign_matrix_to_matrix.gpt b/test/erros/assign_matrix_to_matrix.gpt new file mode 100644 index 00000000..8332be85 --- /dev/null +++ b/test/erros/assign_matrix_to_matrix.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + m1 : matriz[2] de inteiros; + m2 : matriz[2] de inteiros; +fim-variáveis +início + m1 := m2; +fim diff --git a/test/erros/assign_matrix_to_matrix.msg b/test/erros/assign_matrix_to_matrix.msg new file mode 100644 index 00000000..e49e5540 --- /dev/null +++ b/test/erros/assign_matrix_to_matrix.msg @@ -0,0 +1 @@ +assign_matrix_to_matrix.gpt:7 - Faltando indicar subscrito da matriz/conjunto "m1". diff --git a/test/erros/assign_str_to_char.gpt b/test/erros/assign_str_to_char.gpt new file mode 100644 index 00000000..9c3b09b6 --- /dev/null +++ b/test/erros/assign_str_to_char.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + c : caractere; +fim-variáveis +início + c := "y"; +fim diff --git a/test/erros/assign_str_to_char.msg b/test/erros/assign_str_to_char.msg new file mode 100644 index 00000000..840151a0 --- /dev/null +++ b/test/erros/assign_str_to_char.msg @@ -0,0 +1 @@ +assign_str_to_char.gpt:6 - Variável "c" não pode receber valores do tipo 'literal'. diff --git a/test/erros/assign_str_to_int.gpt b/test/erros/assign_str_to_int.gpt new file mode 100644 index 00000000..c3c570a4 --- /dev/null +++ b/test/erros/assign_str_to_int.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := "texto"; +fim diff --git a/test/erros/assign_str_to_int.msg b/test/erros/assign_str_to_int.msg new file mode 100644 index 00000000..018a4b2f --- /dev/null +++ b/test/erros/assign_str_to_int.msg @@ -0,0 +1 @@ +assign_str_to_int.gpt:6 - Variável "a" não pode receber valores do tipo 'literal'. diff --git a/test/erros/assign_str_to_logico.gpt b/test/erros/assign_str_to_logico.gpt new file mode 100644 index 00000000..9d0d8722 --- /dev/null +++ b/test/erros/assign_str_to_logico.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + l : lógico; +fim-variáveis +início + l := "verdadeiro"; +fim diff --git a/test/erros/assign_str_to_logico.msg b/test/erros/assign_str_to_logico.msg new file mode 100644 index 00000000..17e9de00 --- /dev/null +++ b/test/erros/assign_str_to_logico.msg @@ -0,0 +1 @@ +assign_str_to_logico.gpt:6 - Variável "l" não pode receber valores do tipo 'literal'. diff --git a/test/erros/assign_str_to_real.gpt b/test/erros/assign_str_to_real.gpt new file mode 100644 index 00000000..b0926659 --- /dev/null +++ b/test/erros/assign_str_to_real.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + r : real; +fim-variáveis +início + r := "1.5"; +fim diff --git a/test/erros/assign_str_to_real.msg b/test/erros/assign_str_to_real.msg new file mode 100644 index 00000000..be0ca2cf --- /dev/null +++ b/test/erros/assign_str_to_real.msg @@ -0,0 +1 @@ +assign_str_to_real.gpt:6 - Variável "r" não pode receber valores do tipo 'literal'. diff --git a/test/erros/assign_to_func.gpt b/test/erros/assign_to_func.gpt new file mode 100644 index 00000000..56c64a6e --- /dev/null +++ b/test/erros/assign_to_func.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +início + f := 1; +fim +função f(): inteiro +início + retorne 1; +fim diff --git a/test/erros/assign_to_func.msg b/test/erros/assign_to_func.msg new file mode 100644 index 00000000..69e668dc --- /dev/null +++ b/test/erros/assign_to_func.msg @@ -0,0 +1 @@ +assign_to_func.gpt:3 - Faltando abrir parêntesis após função "f". diff --git a/test/erros/bitor_on_real.gpt b/test/erros/bitor_on_real.gpt new file mode 100644 index 00000000..57dfc3d9 --- /dev/null +++ b/test/erros/bitor_on_real.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + r : real; +fim-variáveis +início + r := 1.5 | 2; +fim diff --git a/test/erros/bitor_on_real.msg b/test/erros/bitor_on_real.msg new file mode 100644 index 00000000..ce41ff91 --- /dev/null +++ b/test/erros/bitor_on_real.msg @@ -0,0 +1,2 @@ +bitor_on_real.gpt:6 - Operador "|" só pode ser usado com termos númericos não-reais. +bitor_on_real.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/bnot_on_real.gpt b/test/erros/bnot_on_real.gpt new file mode 100644 index 00000000..6e1d0052 --- /dev/null +++ b/test/erros/bnot_on_real.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + r : real; +fim-variáveis +início + r := ~1.5; +fim diff --git a/test/erros/bnot_on_real.msg b/test/erros/bnot_on_real.msg new file mode 100644 index 00000000..91edbcb4 --- /dev/null +++ b/test/erros/bnot_on_real.msg @@ -0,0 +1,2 @@ +bnot_on_real.gpt:6 - Operador unário "~" deve ser usado em termos numéricos inteiros e compatíveis. +bnot_on_real.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/char_plus_str.gpt b/test/erros/char_plus_str.gpt new file mode 100644 index 00000000..b9c1b1d0 --- /dev/null +++ b/test/erros/char_plus_str.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + s : literal; +fim-variáveis +início + s := 'a' + "b"; +fim diff --git a/test/erros/char_plus_str.msg b/test/erros/char_plus_str.msg new file mode 100644 index 00000000..e89bc9b6 --- /dev/null +++ b/test/erros/char_plus_str.msg @@ -0,0 +1,2 @@ +char_plus_str.gpt:6 - Operador "+" só pode ser usado com termos numéricos. +char_plus_str.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/double_unary.gpt b/test/erros/double_unary.gpt new file mode 100644 index 00000000..64592142 --- /dev/null +++ b/test/erros/double_unary.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := - -5; + a := ~ ~5; +fim diff --git a/test/erros/double_unary.msg b/test/erros/double_unary.msg new file mode 100644 index 00000000..c2037897 --- /dev/null +++ b/test/erros/double_unary.msg @@ -0,0 +1 @@ +double_unary.gpt:7 - Esperando ';', encontrado ~. diff --git a/test/erros/empty_stmt.gpt b/test/erros/empty_stmt.gpt new file mode 100644 index 00000000..dc8526bc --- /dev/null +++ b/test/erros/empty_stmt.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := 1;; +fim diff --git a/test/erros/empty_stmt.msg b/test/erros/empty_stmt.msg new file mode 100644 index 00000000..39bffd84 --- /dev/null +++ b/test/erros/empty_stmt.msg @@ -0,0 +1 @@ +empty_stmt.gpt:6 - Esperando "fim" ou comando válido, encontrado ;. diff --git a/test/erros/exp_literal.gpt b/test/erros/exp_literal.gpt new file mode 100644 index 00000000..c2af67cd --- /dev/null +++ b/test/erros/exp_literal.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + r : real; +fim-variáveis +início + r := 1e10; +fim diff --git a/test/erros/exp_literal.msg b/test/erros/exp_literal.msg new file mode 100644 index 00000000..6194f0c9 --- /dev/null +++ b/test/erros/exp_literal.msg @@ -0,0 +1 @@ +exp_literal.gpt:6 - Esperando ';', encontrado "e10". diff --git a/test/erros/fcall_matrix_to_scalar.gpt b/test/erros/fcall_matrix_to_scalar.gpt new file mode 100644 index 00000000..1a9d5069 --- /dev/null +++ b/test/erros/fcall_matrix_to_scalar.gpt @@ -0,0 +1,10 @@ +algoritmo erro; +variáveis + m : matriz[2] de inteiros; +fim-variáveis +início + f(m); +fim +função f(a: inteiro) +início +fim diff --git a/test/erros/fcall_matrix_to_scalar.msg b/test/erros/fcall_matrix_to_scalar.msg new file mode 100644 index 00000000..3df9a9a8 --- /dev/null +++ b/test/erros/fcall_matrix_to_scalar.msg @@ -0,0 +1 @@ +fcall_matrix_to_scalar.gpt:6 - Argumento 1 da função "f" deve ser do tipo "inteiro". diff --git a/test/erros/fcall_matrix_wrong_dims.gpt b/test/erros/fcall_matrix_wrong_dims.gpt new file mode 100644 index 00000000..6c8ba5d3 --- /dev/null +++ b/test/erros/fcall_matrix_wrong_dims.gpt @@ -0,0 +1,10 @@ +algoritmo erro; +variáveis + m : matriz[2][2] de inteiros; +fim-variáveis +início + f(m); +fim +função f(a: matriz[2] de inteiros) +início +fim diff --git a/test/erros/fcall_matrix_wrong_dims.msg b/test/erros/fcall_matrix_wrong_dims.msg new file mode 100644 index 00000000..3b618d35 --- /dev/null +++ b/test/erros/fcall_matrix_wrong_dims.msg @@ -0,0 +1 @@ +fcall_matrix_wrong_dims.gpt:6 - Argumento 1 da função "f" deve ser do tipo "inteiro[2]". diff --git a/test/erros/fcall_scalar_to_matrix.gpt b/test/erros/fcall_scalar_to_matrix.gpt new file mode 100644 index 00000000..d65be4e6 --- /dev/null +++ b/test/erros/fcall_scalar_to_matrix.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +início + f(1); +fim +função f(a: matriz[2] de inteiros) +início +fim diff --git a/test/erros/fcall_scalar_to_matrix.msg b/test/erros/fcall_scalar_to_matrix.msg new file mode 100644 index 00000000..6492fadb --- /dev/null +++ b/test/erros/fcall_scalar_to_matrix.msg @@ -0,0 +1 @@ +fcall_scalar_to_matrix.gpt:3 - Argumento 1 da função "f" deve ser do tipo "inteiro[2]". diff --git a/test/erros/fcall_too_few_args.gpt b/test/erros/fcall_too_few_args.gpt new file mode 100644 index 00000000..04e4a072 --- /dev/null +++ b/test/erros/fcall_too_few_args.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +início + f(1); +fim +função f(a: inteiro, b: inteiro) +início +fim diff --git a/test/erros/fcall_too_few_args.msg b/test/erros/fcall_too_few_args.msg new file mode 100644 index 00000000..317b03be --- /dev/null +++ b/test/erros/fcall_too_few_args.msg @@ -0,0 +1 @@ +fcall_too_few_args.gpt:3 - Número de argumentos diferem do número de parâmetros da função "f". diff --git a/test/erros/fcall_too_many_args.gpt b/test/erros/fcall_too_many_args.gpt new file mode 100644 index 00000000..6a6d7f60 --- /dev/null +++ b/test/erros/fcall_too_many_args.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +início + f(1, 2); +fim +função f(a: inteiro) +início +fim diff --git a/test/erros/fcall_too_many_args.msg b/test/erros/fcall_too_many_args.msg new file mode 100644 index 00000000..8670b840 --- /dev/null +++ b/test/erros/fcall_too_many_args.msg @@ -0,0 +1 @@ +fcall_too_many_args.gpt:3 - Número de argumentos diferem do número de parâmetros da função "f". diff --git a/test/erros/fcall_wrong_arg_type.gpt b/test/erros/fcall_wrong_arg_type.gpt new file mode 100644 index 00000000..42e51c05 --- /dev/null +++ b/test/erros/fcall_wrong_arg_type.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +início + f("x"); +fim +função f(a: inteiro) +início +fim diff --git a/test/erros/fcall_wrong_arg_type.msg b/test/erros/fcall_wrong_arg_type.msg new file mode 100644 index 00000000..0d5b53c8 --- /dev/null +++ b/test/erros/fcall_wrong_arg_type.msg @@ -0,0 +1 @@ +fcall_wrong_arg_type.gpt:3 - Argumento 1 da função "f" deve ser do tipo "inteiro". diff --git a/test/erros/ident_accent.gpt b/test/erros/ident_accent.gpt new file mode 100644 index 00000000..e2658c73 --- /dev/null +++ b/test/erros/ident_accent.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + número : inteiro; +fim-variáveis +início + número := 1; +fim diff --git a/test/erros/ident_accent.msg b/test/erros/ident_accent.msg new file mode 100644 index 00000000..56a10b84 --- /dev/null +++ b/test/erros/ident_accent.msg @@ -0,0 +1,2 @@ +ident_accent.gpt:3 - Identificador "número" não pode ter caracteres especiais.. +ident_accent.gpt:6 - Identificador "número" não pode ter caracteres especiais.. diff --git a/test/erros/imprima_matrix.gpt b/test/erros/imprima_matrix.gpt new file mode 100644 index 00000000..69674690 --- /dev/null +++ b/test/erros/imprima_matrix.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + m1 : matriz[2] de inteiros; +fim-variáveis +início + imprima(m1); +fim diff --git a/test/erros/imprima_matrix.msg b/test/erros/imprima_matrix.msg new file mode 100644 index 00000000..59d5794c --- /dev/null +++ b/test/erros/imprima_matrix.msg @@ -0,0 +1 @@ +imprima_matrix.gpt:6 - Argumento 1 da função "imprima" não pode ser matriz/conjunto. diff --git a/test/erros/imprima_no_args.gpt b/test/erros/imprima_no_args.gpt new file mode 100644 index 00000000..f3abfafc --- /dev/null +++ b/test/erros/imprima_no_args.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + imprima(); +fim diff --git a/test/erros/imprima_no_args.msg b/test/erros/imprima_no_args.msg new file mode 100644 index 00000000..23773006 --- /dev/null +++ b/test/erros/imprima_no_args.msg @@ -0,0 +1 @@ +imprima_no_args.gpt:3 - Pelo menos um argumento deve ser passado para a função "imprima". diff --git a/test/erros/keywords_no_accents.gpt b/test/erros/keywords_no_accents.gpt new file mode 100644 index 00000000..83380371 --- /dev/null +++ b/test/erros/keywords_no_accents.gpt @@ -0,0 +1,17 @@ +algoritmo sem_acentos; +variaveis + a : inteiro; + l : logico; +fim-variaveis +inicio + a := 1; + se a = 1 entao imprima("um"); senao imprima("outro"); fim-se + enquanto a < 3 faca a := a + 1; fim-enquanto + para a de 1 ate 2 faca imprima(a); fim-para + l := nao falso; imprima(l); + imprima(f(2)); +fim +funcao f(x: inteiro): inteiro +inicio + retorne x * 2; +fim diff --git a/test/erros/keywords_no_accents.msg b/test/erros/keywords_no_accents.msg new file mode 100644 index 00000000..d5232d38 --- /dev/null +++ b/test/erros/keywords_no_accents.msg @@ -0,0 +1 @@ +keywords_no_accents.gpt:2 - Esperando "variáveis" ou "início" após declaração de algoritmo, encontrado "variaveis". diff --git a/test/erros/keywords_upper.gpt b/test/erros/keywords_upper.gpt new file mode 100644 index 00000000..c3233dd3 --- /dev/null +++ b/test/erros/keywords_upper.gpt @@ -0,0 +1,10 @@ +ALGORITMO upper; +VARIÁVEIS + a : INTEIRO; +FIM-VARIÁVEIS +INÍCIO + a := 1; + SE a = 1 ENTÃO imprima("um"); SENÃO imprima("outro"); FIM-SE + Enquanto a < 3 Faça a := a + 1; Fim-Enquanto + imprima(a, " ", VERDADEIRO, " ", Falso, " ", NÃO falso, " ", verdadeiro E verdadeiro, " ", falso OU verdadeiro); +FIM diff --git a/test/erros/keywords_upper.msg b/test/erros/keywords_upper.msg new file mode 100644 index 00000000..2d9b4a88 --- /dev/null +++ b/test/erros/keywords_upper.msg @@ -0,0 +1,10 @@ +keywords_upper.gpt:1 - Esperando "algoritmo", encontrado "ALGORITMO". +keywords_upper.gpt:2 - Identificador "VARIÁVEIS" não pode ter caracteres especiais.. +keywords_upper.gpt:4 - Identificador "FIM" não pode ter caracteres especiais.. +keywords_upper.gpt:4 - Identificador "VARIÁVEIS" não pode ter caracteres especiais.. +keywords_upper.gpt:5 - Identificador "INÍCIO" não pode ter caracteres especiais.. +keywords_upper.gpt:7 - Identificador "ENTÃO" não pode ter caracteres especiais.. +keywords_upper.gpt:7 - Identificador "SENÃO" não pode ter caracteres especiais.. +keywords_upper.gpt:8 - Identificador "Faça" não pode ter caracteres especiais.. +keywords_upper.gpt:9 - Identificador "NÃO" não pode ter caracteres especiais.. +keywords_upper.gpt:11 - Esperando "variáveis" ou "início" após declaração de algoritmo, encontrado fim de arquivo (EOF). diff --git a/test/erros/leia_as_stmt.gpt b/test/erros/leia_as_stmt.gpt new file mode 100644 index 00000000..cb89ddac --- /dev/null +++ b/test/erros/leia_as_stmt.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + leia(); +fim diff --git a/test/erros/leia_as_stmt.msg b/test/erros/leia_as_stmt.msg new file mode 100644 index 00000000..5377cd7b --- /dev/null +++ b/test/erros/leia_as_stmt.msg @@ -0,0 +1 @@ +Erro interno: tipo nao suportado (x86::translateFuncLeia). diff --git a/test/erros/leia_in_cond.gpt b/test/erros/leia_in_cond.gpt new file mode 100644 index 00000000..f87b3968 --- /dev/null +++ b/test/erros/leia_in_cond.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + se leia() = 7 então imprima("sete"); fim-se +fim diff --git a/test/erros/leia_in_cond.msg b/test/erros/leia_in_cond.msg new file mode 100644 index 00000000..d92f4072 --- /dev/null +++ b/test/erros/leia_in_cond.msg @@ -0,0 +1 @@ +leia_in_cond.gpt:3 - Função interna "leia" não pode participar de expressão. diff --git a/test/erros/leia_in_expr.gpt b/test/erros/leia_in_expr.gpt new file mode 100644 index 00000000..da6c4e74 --- /dev/null +++ b/test/erros/leia_in_expr.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + a, b : inteiro; +fim-variáveis +início + b := 1; + a := b + leia(); +fim diff --git a/test/erros/leia_in_expr.msg b/test/erros/leia_in_expr.msg new file mode 100644 index 00000000..3e75dfcb --- /dev/null +++ b/test/erros/leia_in_expr.msg @@ -0,0 +1,2 @@ +leia_in_expr.gpt:7 - Função interna "leia" não pode participar de expressão. +leia_in_expr.gpt:7 - Expressão não retorna resultado para variável. diff --git a/test/erros/leia_with_args.gpt b/test/erros/leia_with_args.gpt new file mode 100644 index 00000000..bfd99f85 --- /dev/null +++ b/test/erros/leia_with_args.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := leia(1); +fim diff --git a/test/erros/leia_with_args.msg b/test/erros/leia_with_args.msg new file mode 100644 index 00000000..7d318f43 --- /dev/null +++ b/test/erros/leia_with_args.msg @@ -0,0 +1 @@ +leia_with_args.gpt:6 - Número de argumentos diferem do número de parâmetros da função "leia". diff --git a/test/erros/main_retorne_vazio.gpt b/test/erros/main_retorne_vazio.gpt new file mode 100644 index 00000000..824f329f --- /dev/null +++ b/test/erros/main_retorne_vazio.gpt @@ -0,0 +1,6 @@ +algoritmo retorne_vazio; +início + imprima("a"); + retorne; + imprima("b"); +fim diff --git a/test/erros/main_retorne_vazio.msg b/test/erros/main_retorne_vazio.msg new file mode 100644 index 00000000..81a28e00 --- /dev/null +++ b/test/erros/main_retorne_vazio.msg @@ -0,0 +1 @@ +main_retorne_vazio.gpt:4 - Valor de retorno do bloco principal deve ser compatível com o tipo inteiro. diff --git a/test/erros/main_return_logico.gpt b/test/erros/main_return_logico.gpt new file mode 100644 index 00000000..c09a440d --- /dev/null +++ b/test/erros/main_return_logico.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + retorne verdadeiro; +fim diff --git a/test/erros/main_return_logico.msg b/test/erros/main_return_logico.msg new file mode 100644 index 00000000..d3ba8050 --- /dev/null +++ b/test/erros/main_return_logico.msg @@ -0,0 +1 @@ +main_return_logico.gpt:3 - Valor de retorno do bloco principal deve ser compatível com o tipo inteiro. diff --git a/test/erros/main_return_str.gpt b/test/erros/main_return_str.gpt new file mode 100644 index 00000000..08b2423c --- /dev/null +++ b/test/erros/main_return_str.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + retorne "x"; +fim diff --git a/test/erros/main_return_str.msg b/test/erros/main_return_str.msg new file mode 100644 index 00000000..3c487f49 --- /dev/null +++ b/test/erros/main_return_str.msg @@ -0,0 +1 @@ +main_return_str.gpt:3 - Valor de retorno do bloco principal deve ser compatível com o tipo inteiro. diff --git a/test/erros/matrix_dim_zero.gpt b/test/erros/matrix_dim_zero.gpt new file mode 100644 index 00000000..78a24b11 --- /dev/null +++ b/test/erros/matrix_dim_zero.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + m : matriz[0] de inteiros; +fim-variáveis +início + m[0] := 1; +fim diff --git a/test/erros/matrix_dim_zero.msg b/test/erros/matrix_dim_zero.msg new file mode 100644 index 00000000..d5e7164e --- /dev/null +++ b/test/erros/matrix_dim_zero.msg @@ -0,0 +1 @@ +matrix_dim_zero.gpt:3 - Dimensões de matrizes/conjuntos não podem ter tamanho 0. diff --git a/test/erros/matrix_in_expr.gpt b/test/erros/matrix_in_expr.gpt new file mode 100644 index 00000000..70468417 --- /dev/null +++ b/test/erros/matrix_in_expr.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + m : matriz[2] de inteiros; + a : inteiro; +fim-variáveis +início + a := m + 1; +fim diff --git a/test/erros/matrix_in_expr.msg b/test/erros/matrix_in_expr.msg new file mode 100644 index 00000000..86e732ac --- /dev/null +++ b/test/erros/matrix_in_expr.msg @@ -0,0 +1,2 @@ +matrix_in_expr.gpt:7 - Operador "+" só pode ser usado com termos numéricos. +matrix_in_expr.gpt:7 - Expressão não retorna resultado para variável. diff --git a/test/erros/matrix_missing_subscript.gpt b/test/erros/matrix_missing_subscript.gpt new file mode 100644 index 00000000..0c2e6cd8 --- /dev/null +++ b/test/erros/matrix_missing_subscript.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + m : matriz[2][2] de inteiros; +fim-variáveis +início + m[0] := 1; +fim diff --git a/test/erros/matrix_missing_subscript.msg b/test/erros/matrix_missing_subscript.msg new file mode 100644 index 00000000..6bd807af --- /dev/null +++ b/test/erros/matrix_missing_subscript.msg @@ -0,0 +1 @@ +matrix_missing_subscript.gpt:6 - Matriz/conjunto "m" possui 2 dimensões. Use 2 subscrito(s). diff --git a/test/erros/matrix_too_many_subscripts.gpt b/test/erros/matrix_too_many_subscripts.gpt new file mode 100644 index 00000000..1de0149e --- /dev/null +++ b/test/erros/matrix_too_many_subscripts.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + m : matriz[2] de inteiros; +fim-variáveis +início + m[0][0] := 1; +fim diff --git a/test/erros/matrix_too_many_subscripts.msg b/test/erros/matrix_too_many_subscripts.msg new file mode 100644 index 00000000..9c0c7c00 --- /dev/null +++ b/test/erros/matrix_too_many_subscripts.msg @@ -0,0 +1 @@ +matrix_too_many_subscripts.gpt:6 - Matriz/conjunto "m" possui 1 dimensão. Use 1 subscrito(s). diff --git a/test/erros/minus_on_str.gpt b/test/erros/minus_on_str.gpt new file mode 100644 index 00000000..01a3e660 --- /dev/null +++ b/test/erros/minus_on_str.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + s : literal; +fim-variáveis +início + s := -"a"; +fim diff --git a/test/erros/minus_on_str.msg b/test/erros/minus_on_str.msg new file mode 100644 index 00000000..f8f4fab3 --- /dev/null +++ b/test/erros/minus_on_str.msg @@ -0,0 +1,2 @@ +minus_on_str.gpt:6 - Operador unário "-" deve ser usado em termos numéricos. +minus_on_str.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/mod_on_real.gpt b/test/erros/mod_on_real.gpt new file mode 100644 index 00000000..430004d2 --- /dev/null +++ b/test/erros/mod_on_real.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + r : real; +fim-variáveis +início + r := 5.5 % 2; +fim diff --git a/test/erros/mod_on_real.msg b/test/erros/mod_on_real.msg new file mode 100644 index 00000000..506252c2 --- /dev/null +++ b/test/erros/mod_on_real.msg @@ -0,0 +1,2 @@ +mod_on_real.gpt:6 - Operador "%" só pode ser usado com termos numéricos inteiros e compatíveis. +mod_on_real.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/para_logico_ate.gpt b/test/erros/para_logico_ate.gpt new file mode 100644 index 00000000..5bbc466c --- /dev/null +++ b/test/erros/para_logico_ate.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + i : inteiro; +fim-variáveis +início + para i de 1 até verdadeiro faça imprima(i); fim-para +fim diff --git a/test/erros/para_logico_ate.msg b/test/erros/para_logico_ate.msg new file mode 100644 index 00000000..9aef9ab7 --- /dev/null +++ b/test/erros/para_logico_ate.msg @@ -0,0 +1 @@ +para_logico_ate.gpt:6 - Expressão "até" deve ser do tipo inteiro. diff --git a/test/erros/para_logico_var.gpt b/test/erros/para_logico_var.gpt new file mode 100644 index 00000000..bb5616ed --- /dev/null +++ b/test/erros/para_logico_var.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + l : lógico; +fim-variáveis +início + para l de 1 até 3 faça imprima(l); fim-para +fim diff --git a/test/erros/para_logico_var.msg b/test/erros/para_logico_var.msg new file mode 100644 index 00000000..252a0e7b --- /dev/null +++ b/test/erros/para_logico_var.msg @@ -0,0 +1 @@ +para_logico_var.gpt:6 - Expressão "l" deve ser do tipo inteiro. diff --git a/test/erros/para_passo_real.gpt b/test/erros/para_passo_real.gpt new file mode 100644 index 00000000..d3f6d70e --- /dev/null +++ b/test/erros/para_passo_real.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + i : inteiro; +fim-variáveis +início + para i de 1 até 3 passo 1.5 faça imprima(i); fim-para +fim diff --git a/test/erros/para_passo_real.msg b/test/erros/para_passo_real.msg new file mode 100644 index 00000000..3bdbc74c --- /dev/null +++ b/test/erros/para_passo_real.msg @@ -0,0 +1 @@ +para_passo_real.gpt:6 - Esperando número inteiro após "passo". diff --git a/test/erros/para_passo_var.gpt b/test/erros/para_passo_var.gpt new file mode 100644 index 00000000..69e5911d --- /dev/null +++ b/test/erros/para_passo_var.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + i, p : inteiro; +fim-variáveis +início + p := 1; + para i de 1 até 3 passo p faça imprima(i); fim-para +fim diff --git a/test/erros/para_passo_var.msg b/test/erros/para_passo_var.msg new file mode 100644 index 00000000..2254c776 --- /dev/null +++ b/test/erros/para_passo_var.msg @@ -0,0 +1 @@ +para_passo_var.gpt:7 - Esperando número inteiro após "passo". diff --git a/test/erros/para_passo_zero.gpt b/test/erros/para_passo_zero.gpt new file mode 100644 index 00000000..6fc95171 --- /dev/null +++ b/test/erros/para_passo_zero.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + i : inteiro; +fim-variáveis +início + para i de 1 até 3 passo 0 faça imprima(i); fim-para +fim diff --git a/test/erros/para_passo_zero.msg b/test/erros/para_passo_zero.msg new file mode 100644 index 00000000..4d597fe9 --- /dev/null +++ b/test/erros/para_passo_zero.msg @@ -0,0 +1 @@ +para_passo_zero.gpt:6 - Passo com valor "0" não é permitido. diff --git a/test/erros/para_real_bounds.gpt b/test/erros/para_real_bounds.gpt new file mode 100644 index 00000000..37112544 --- /dev/null +++ b/test/erros/para_real_bounds.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + i : inteiro; +fim-variáveis +início + para i de 1.5 até 3.7 faça imprima(i); fim-para +fim diff --git a/test/erros/para_real_bounds.msg b/test/erros/para_real_bounds.msg new file mode 100644 index 00000000..cc51da43 --- /dev/null +++ b/test/erros/para_real_bounds.msg @@ -0,0 +1,2 @@ +para_real_bounds.gpt:6 - Expressão "de" deve ser do tipo inteiro. +para_real_bounds.gpt:6 - Expressão "até" deve ser do tipo inteiro. diff --git a/test/erros/para_real_var.gpt b/test/erros/para_real_var.gpt new file mode 100644 index 00000000..fa491a7f --- /dev/null +++ b/test/erros/para_real_var.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + r : real; +fim-variáveis +início + para r de 1 até 3 faça imprima(r); fim-para +fim diff --git a/test/erros/para_real_var.msg b/test/erros/para_real_var.msg new file mode 100644 index 00000000..6b699ef1 --- /dev/null +++ b/test/erros/para_real_var.msg @@ -0,0 +1 @@ +para_real_var.gpt:6 - Expressão "r" deve ser do tipo inteiro. diff --git a/test/erros/para_str_bounds.gpt b/test/erros/para_str_bounds.gpt new file mode 100644 index 00000000..f2af6229 --- /dev/null +++ b/test/erros/para_str_bounds.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + i : inteiro; +fim-variáveis +início + para i de "a" até "z" faça imprima(i); fim-para +fim diff --git a/test/erros/para_str_bounds.msg b/test/erros/para_str_bounds.msg new file mode 100644 index 00000000..1d6b5f4e --- /dev/null +++ b/test/erros/para_str_bounds.msg @@ -0,0 +1,2 @@ +para_str_bounds.gpt:6 - Expressão "de" deve ser do tipo inteiro. +para_str_bounds.gpt:6 - Expressão "até" deve ser do tipo inteiro. diff --git a/test/erros/para_str_var.gpt b/test/erros/para_str_var.gpt new file mode 100644 index 00000000..9abb4749 --- /dev/null +++ b/test/erros/para_str_var.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + s : literal; +fim-variáveis +início + para s de 1 até 3 faça imprima(s); fim-para +fim diff --git a/test/erros/para_str_var.msg b/test/erros/para_str_var.msg new file mode 100644 index 00000000..42d29700 --- /dev/null +++ b/test/erros/para_str_var.msg @@ -0,0 +1 @@ +para_str_var.gpt:6 - Expressão "s" deve ser do tipo inteiro. diff --git a/test/erros/param_duplicate.gpt b/test/erros/param_duplicate.gpt new file mode 100644 index 00000000..db133146 --- /dev/null +++ b/test/erros/param_duplicate.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +início + f(1, 2); +fim +função f(a: inteiro, a: inteiro) +início +fim diff --git a/test/erros/param_duplicate.msg b/test/erros/param_duplicate.msg new file mode 100644 index 00000000..88fed2cf --- /dev/null +++ b/test/erros/param_duplicate.msg @@ -0,0 +1 @@ +param_duplicate.gpt:5 - Variável/função redeclarada: "a". diff --git a/test/erros/param_redeclared_local.gpt b/test/erros/param_redeclared_local.gpt new file mode 100644 index 00000000..5991fbd8 --- /dev/null +++ b/test/erros/param_redeclared_local.gpt @@ -0,0 +1,9 @@ +algoritmo erro; +início + f(1); +fim +função f(a: inteiro) + a : inteiro; +início + a := 1; +fim diff --git a/test/erros/param_redeclared_local.msg b/test/erros/param_redeclared_local.msg new file mode 100644 index 00000000..1a486b19 --- /dev/null +++ b/test/erros/param_redeclared_local.msg @@ -0,0 +1 @@ +param_redeclared_local.gpt:6 - Variável/função redeclarada: "a". diff --git a/test/erros/redeclared_func.gpt b/test/erros/redeclared_func.gpt new file mode 100644 index 00000000..309fc8bd --- /dev/null +++ b/test/erros/redeclared_func.gpt @@ -0,0 +1,10 @@ +algoritmo erro; +início + f(); +fim +função f() +início +fim +função f() +início +fim diff --git a/test/erros/redeclared_func.msg b/test/erros/redeclared_func.msg new file mode 100644 index 00000000..1e14b471 --- /dev/null +++ b/test/erros/redeclared_func.msg @@ -0,0 +1 @@ +redeclared_func.gpt:8 - Variável/função redeclarada: "f". diff --git a/test/erros/redeclared_var.gpt b/test/erros/redeclared_var.gpt new file mode 100644 index 00000000..cdd066e6 --- /dev/null +++ b/test/erros/redeclared_var.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + a : inteiro; + a : real; +fim-variáveis +início + a := 1; +fim diff --git a/test/erros/redeclared_var.msg b/test/erros/redeclared_var.msg new file mode 100644 index 00000000..14701aee --- /dev/null +++ b/test/erros/redeclared_var.msg @@ -0,0 +1 @@ +redeclared_var.gpt:4 - Variável/função redeclarada: "a". diff --git a/test/erros/redeclared_var_sameline.gpt b/test/erros/redeclared_var_sameline.gpt new file mode 100644 index 00000000..9b6675db --- /dev/null +++ b/test/erros/redeclared_var_sameline.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a, a : inteiro; +fim-variáveis +início + a := 1; +fim diff --git a/test/erros/redeclared_var_sameline.msg b/test/erros/redeclared_var_sameline.msg new file mode 100644 index 00000000..ff01c22d --- /dev/null +++ b/test/erros/redeclared_var_sameline.msg @@ -0,0 +1 @@ +redeclared_var_sameline.gpt:3 - Variável/função redeclarada: "a". diff --git a/test/erros/return_type_mismatch.gpt b/test/erros/return_type_mismatch.gpt new file mode 100644 index 00000000..21f19f47 --- /dev/null +++ b/test/erros/return_type_mismatch.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +início + imprima(f()); +fim +função f(): inteiro +início + retorne "x"; +fim diff --git a/test/erros/return_type_mismatch.msg b/test/erros/return_type_mismatch.msg new file mode 100644 index 00000000..c9463b7e --- /dev/null +++ b/test/erros/return_type_mismatch.msg @@ -0,0 +1 @@ +return_type_mismatch.gpt:7 - Expressão de retorno deve ser compatível com o tipo "inteiro". diff --git a/test/erros/return_value_in_void.gpt b/test/erros/return_value_in_void.gpt new file mode 100644 index 00000000..86027d07 --- /dev/null +++ b/test/erros/return_value_in_void.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +início + f(); +fim +função f() +início + retorne 1; +fim diff --git a/test/erros/return_value_in_void.msg b/test/erros/return_value_in_void.msg new file mode 100644 index 00000000..22f0019a --- /dev/null +++ b/test/erros/return_value_in_void.msg @@ -0,0 +1 @@ +return_value_in_void.gpt:7 - Função não tem tipo de retorno.. diff --git a/test/erros/sem_multiple_errors.gpt b/test/erros/sem_multiple_errors.gpt new file mode 100644 index 00000000..dc60d869 --- /dev/null +++ b/test/erros/sem_multiple_errors.gpt @@ -0,0 +1,10 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := "x"; + b := 1; + c := 2; + se 1 então fim-se +fim diff --git a/test/erros/sem_multiple_errors.msg b/test/erros/sem_multiple_errors.msg new file mode 100644 index 00000000..98944048 --- /dev/null +++ b/test/erros/sem_multiple_errors.msg @@ -0,0 +1,5 @@ +sem_multiple_errors.gpt:6 - Variável "a" não pode receber valores do tipo 'literal'. +sem_multiple_errors.gpt:7 - Variável "b" não foi declarada. +sem_multiple_errors.gpt:7 - Variável "b" não pode receber valores do tipo 'inteiro'. +sem_multiple_errors.gpt:8 - Variável "c" não foi declarada. +sem_multiple_errors.gpt:8 - Variável "c" não pode receber valores do tipo 'inteiro'. diff --git a/test/erros/str_eq_int.gpt b/test/erros/str_eq_int.gpt new file mode 100644 index 00000000..c76b94e7 --- /dev/null +++ b/test/erros/str_eq_int.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + l : lógico; +fim-variáveis +início + l := "1" = 1; +fim diff --git a/test/erros/str_eq_int.msg b/test/erros/str_eq_int.msg new file mode 100644 index 00000000..90bd2b68 --- /dev/null +++ b/test/erros/str_eq_int.msg @@ -0,0 +1,2 @@ +str_eq_int.gpt:6 - Operador "=" não pode ser usado em expressões no formato 'literal = inteiro'. +str_eq_int.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/str_plus_int.gpt b/test/erros/str_plus_int.gpt new file mode 100644 index 00000000..f01d85f4 --- /dev/null +++ b/test/erros/str_plus_int.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + s : literal; +fim-variáveis +início + s := "a" + 1; +fim diff --git a/test/erros/str_plus_int.msg b/test/erros/str_plus_int.msg new file mode 100644 index 00000000..cec14cd9 --- /dev/null +++ b/test/erros/str_plus_int.msg @@ -0,0 +1,2 @@ +str_plus_int.gpt:6 - Operador "+" só pode ser usado com termos numéricos. +str_plus_int.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/str_plus_str.gpt b/test/erros/str_plus_str.gpt new file mode 100644 index 00000000..b4299f5e --- /dev/null +++ b/test/erros/str_plus_str.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + s : literal; +fim-variáveis +início + s := "a" + "b"; +fim diff --git a/test/erros/str_plus_str.msg b/test/erros/str_plus_str.msg new file mode 100644 index 00000000..d114aca8 --- /dev/null +++ b/test/erros/str_plus_str.msg @@ -0,0 +1,2 @@ +str_plus_str.gpt:6 - Operador "+" só pode ser usado com termos numéricos. +str_plus_str.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/subscript_on_scalar.gpt b/test/erros/subscript_on_scalar.gpt new file mode 100644 index 00000000..53f5a4b6 --- /dev/null +++ b/test/erros/subscript_on_scalar.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a[0] := 1; +fim diff --git a/test/erros/subscript_on_scalar.msg b/test/erros/subscript_on_scalar.msg new file mode 100644 index 00000000..5fc3166e --- /dev/null +++ b/test/erros/subscript_on_scalar.msg @@ -0,0 +1 @@ +subscript_on_scalar.gpt:6 - Variável "a" não é uma matriz/conjunto. diff --git a/test/erros/subscript_real.gpt b/test/erros/subscript_real.gpt new file mode 100644 index 00000000..dd75b765 --- /dev/null +++ b/test/erros/subscript_real.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + m : matriz[2] de inteiros; +fim-variáveis +início + m[1.5] := 1; +fim diff --git a/test/erros/subscript_real.msg b/test/erros/subscript_real.msg new file mode 100644 index 00000000..331fb44f --- /dev/null +++ b/test/erros/subscript_real.msg @@ -0,0 +1 @@ +subscript_real.gpt:6 - Subscritos da matriz/conjunto "m" devem ser valores numéricos inteiros ou equivalente. diff --git a/test/erros/subscript_str.gpt b/test/erros/subscript_str.gpt new file mode 100644 index 00000000..b720dd25 --- /dev/null +++ b/test/erros/subscript_str.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + m : matriz[2] de inteiros; +fim-variáveis +início + m["a"] := 1; +fim diff --git a/test/erros/subscript_str.msg b/test/erros/subscript_str.msg new file mode 100644 index 00000000..416dc623 --- /dev/null +++ b/test/erros/subscript_str.msg @@ -0,0 +1 @@ +subscript_str.gpt:6 - Subscritos da matriz/conjunto "m" devem ser valores numéricos inteiros ou equivalente. diff --git a/test/erros/syn_assign_eq.gpt b/test/erros/syn_assign_eq.gpt new file mode 100644 index 00000000..c3de22c4 --- /dev/null +++ b/test/erros/syn_assign_eq.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a = 1; +fim diff --git a/test/erros/syn_assign_eq.msg b/test/erros/syn_assign_eq.msg new file mode 100644 index 00000000..fbde4edf --- /dev/null +++ b/test/erros/syn_assign_eq.msg @@ -0,0 +1 @@ +syn_assign_eq.gpt:6 - Esperando "fim" ou comando válido, encontrado "a". diff --git a/test/erros/syn_bad_char.gpt b/test/erros/syn_bad_char.gpt new file mode 100644 index 00000000..1961511c --- /dev/null +++ b/test/erros/syn_bad_char.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + imprima(1 @ 2); +fim diff --git a/test/erros/syn_bad_char.msg b/test/erros/syn_bad_char.msg new file mode 100644 index 00000000..26b8143b --- /dev/null +++ b/test/erros/syn_bad_char.msg @@ -0,0 +1,2 @@ +syn_bad_char.gpt:3 - Caractere inválido: "@". +syn_bad_char.gpt:3 - Esperando ')', encontrado 2. diff --git a/test/erros/syn_bad_ident.gpt b/test/erros/syn_bad_ident.gpt new file mode 100644 index 00000000..1b40f55d --- /dev/null +++ b/test/erros/syn_bad_ident.gpt @@ -0,0 +1,6 @@ +algoritmo erro; +variáveis + 1a : inteiro; +fim-variáveis +início +fim diff --git a/test/erros/syn_bad_ident.msg b/test/erros/syn_bad_ident.msg new file mode 100644 index 00000000..b9ae0a77 --- /dev/null +++ b/test/erros/syn_bad_ident.msg @@ -0,0 +1 @@ +syn_bad_ident.gpt:2 - Esperando uma variável após "variáveis". diff --git a/test/erros/syn_bad_real.gpt b/test/erros/syn_bad_real.gpt new file mode 100644 index 00000000..2dcd35d7 --- /dev/null +++ b/test/erros/syn_bad_real.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + r : real; +fim-variáveis +início + r := 1.; +fim diff --git a/test/erros/syn_bad_real.msg b/test/erros/syn_bad_real.msg new file mode 100644 index 00000000..b0b1974e --- /dev/null +++ b/test/erros/syn_bad_real.msg @@ -0,0 +1,3 @@ +syn_bad_real.gpt:6 - Caractere inválido: "1". +syn_bad_real.gpt:6 - Caractere inválido: ".". +syn_bad_real.gpt:6 - Esperando expressão, encontrado ; após ":=". diff --git a/test/erros/syn_char_multi.gpt b/test/erros/syn_char_multi.gpt new file mode 100644 index 00000000..a48c1f81 --- /dev/null +++ b/test/erros/syn_char_multi.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + c : caractere; +fim-variáveis +início + c := 'ab'; +fim diff --git a/test/erros/syn_char_multi.msg b/test/erros/syn_char_multi.msg new file mode 100644 index 00000000..9c5d502b --- /dev/null +++ b/test/erros/syn_char_multi.msg @@ -0,0 +1,2 @@ +syn_char_multi.gpt:6 - Faltando fechar aspas. +syn_char_multi.gpt:6 - Faltando fechar aspas. diff --git a/test/erros/syn_dangling_senao.gpt b/test/erros/syn_dangling_senao.gpt new file mode 100644 index 00000000..31641148 --- /dev/null +++ b/test/erros/syn_dangling_senao.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + senão imprima(1); +fim diff --git a/test/erros/syn_dangling_senao.msg b/test/erros/syn_dangling_senao.msg new file mode 100644 index 00000000..fb71523d --- /dev/null +++ b/test/erros/syn_dangling_senao.msg @@ -0,0 +1 @@ +syn_dangling_senao.gpt:3 - Esperando "fim" ou comando válido, encontrado a palavra-chave "senão". diff --git a/test/erros/syn_empty_file.gpt b/test/erros/syn_empty_file.gpt new file mode 100644 index 00000000..e69de29b diff --git a/test/erros/syn_empty_file.msg b/test/erros/syn_empty_file.msg new file mode 100644 index 00000000..0fda19b4 --- /dev/null +++ b/test/erros/syn_empty_file.msg @@ -0,0 +1,2 @@ +syn_empty_file.gpt:1 - Esperando "algoritmo", encontrado fim de arquivo (EOF). +syn_empty_file.gpt:1 - Esperando "variáveis" ou "início" após declaração de algoritmo, encontrado fim de arquivo (EOF). diff --git a/test/erros/syn_empty_vars.gpt b/test/erros/syn_empty_vars.gpt new file mode 100644 index 00000000..2d61da77 --- /dev/null +++ b/test/erros/syn_empty_vars.gpt @@ -0,0 +1,5 @@ +algoritmo erro; +variáveis +fim-variáveis +início +fim diff --git a/test/erros/syn_empty_vars.msg b/test/erros/syn_empty_vars.msg new file mode 100644 index 00000000..8eb15820 --- /dev/null +++ b/test/erros/syn_empty_vars.msg @@ -0,0 +1 @@ +syn_empty_vars.gpt:2 - Esperando uma variável após "variáveis". diff --git a/test/erros/syn_extra_after_fim.gpt b/test/erros/syn_extra_after_fim.gpt new file mode 100644 index 00000000..2780a61b --- /dev/null +++ b/test/erros/syn_extra_after_fim.gpt @@ -0,0 +1,5 @@ +algoritmo erro; +início + imprima(1); +fim +imprima(2); diff --git a/test/erros/syn_extra_after_fim.msg b/test/erros/syn_extra_after_fim.msg new file mode 100644 index 00000000..acca3d7d --- /dev/null +++ b/test/erros/syn_extra_after_fim.msg @@ -0,0 +1 @@ +syn_extra_after_fim.gpt:5 - Esperando fim de arquivo (EOF) ou "função", encontrado "imprima". diff --git a/test/erros/syn_fcall_missing_paren.gpt b/test/erros/syn_fcall_missing_paren.gpt new file mode 100644 index 00000000..9ea1ddf2 --- /dev/null +++ b/test/erros/syn_fcall_missing_paren.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +início + f; +fim +função f() +início +fim diff --git a/test/erros/syn_fcall_missing_paren.msg b/test/erros/syn_fcall_missing_paren.msg new file mode 100644 index 00000000..ff911c20 --- /dev/null +++ b/test/erros/syn_fcall_missing_paren.msg @@ -0,0 +1 @@ +syn_fcall_missing_paren.gpt:3 - Esperando "fim" ou comando válido, encontrado "f". diff --git a/test/erros/syn_func_before_main.gpt b/test/erros/syn_func_before_main.gpt new file mode 100644 index 00000000..e7a4e82d --- /dev/null +++ b/test/erros/syn_func_before_main.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +função f() +início +fim +início + f(); +fim diff --git a/test/erros/syn_func_before_main.msg b/test/erros/syn_func_before_main.msg new file mode 100644 index 00000000..a59d3cb8 --- /dev/null +++ b/test/erros/syn_func_before_main.msg @@ -0,0 +1 @@ +syn_func_before_main.gpt:2 - Esperando "variáveis" ou "início" após declaração de algoritmo, encontrado a palavra-chave "função". diff --git a/test/erros/syn_func_missing_type_after_colon.gpt b/test/erros/syn_func_missing_type_after_colon.gpt new file mode 100644 index 00000000..bf6b2e3a --- /dev/null +++ b/test/erros/syn_func_missing_type_after_colon.gpt @@ -0,0 +1,6 @@ +algoritmo erro; +início +fim +função f(): +início +fim diff --git a/test/erros/syn_func_missing_type_after_colon.msg b/test/erros/syn_func_missing_type_after_colon.msg new file mode 100644 index 00000000..0bb3ddef --- /dev/null +++ b/test/erros/syn_func_missing_type_after_colon.msg @@ -0,0 +1 @@ +syn_func_missing_type_after_colon.gpt:4 - Esperando um tipo (inteiro, literal,...) após ":". diff --git a/test/erros/syn_keyword_as_ident.gpt b/test/erros/syn_keyword_as_ident.gpt new file mode 100644 index 00000000..fa261a0e --- /dev/null +++ b/test/erros/syn_keyword_as_ident.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + se : inteiro; +fim-variáveis +início + se := 1; +fim diff --git a/test/erros/syn_keyword_as_ident.msg b/test/erros/syn_keyword_as_ident.msg new file mode 100644 index 00000000..03e8b716 --- /dev/null +++ b/test/erros/syn_keyword_as_ident.msg @@ -0,0 +1,3 @@ +syn_keyword_as_ident.gpt:2 - Esperando uma variável após "variáveis". +syn_keyword_as_ident.gpt:6 - Esperando expressão, encontrado := após "se". +syn_keyword_as_ident.gpt:6 - Esperando "então", encontrado ;. diff --git a/test/erros/syn_local_var_in_main.gpt b/test/erros/syn_local_var_in_main.gpt new file mode 100644 index 00000000..c4793b92 --- /dev/null +++ b/test/erros/syn_local_var_in_main.gpt @@ -0,0 +1,5 @@ +algoritmo erro; +início + a : inteiro; + a := 1; +fim diff --git a/test/erros/syn_local_var_in_main.msg b/test/erros/syn_local_var_in_main.msg new file mode 100644 index 00000000..f70e3652 --- /dev/null +++ b/test/erros/syn_local_var_in_main.msg @@ -0,0 +1 @@ +syn_local_var_in_main.gpt:3 - Esperando "fim" ou comando válido, encontrado "a". diff --git a/test/erros/syn_matrix_singular_type.gpt b/test/erros/syn_matrix_singular_type.gpt new file mode 100644 index 00000000..672332c3 --- /dev/null +++ b/test/erros/syn_matrix_singular_type.gpt @@ -0,0 +1,6 @@ +algoritmo erro; +variáveis + m : matriz[2] de inteiro; +fim-variáveis +início +fim diff --git a/test/erros/syn_matrix_singular_type.msg b/test/erros/syn_matrix_singular_type.msg new file mode 100644 index 00000000..13863d2c --- /dev/null +++ b/test/erros/syn_matrix_singular_type.msg @@ -0,0 +1 @@ +syn_matrix_singular_type.gpt:3 - Esperando um tipo de conjunto/matriz (inteiros, literais,...), encontrado a palavra-chave "inteiro". diff --git a/test/erros/syn_matrix_var_dim.gpt b/test/erros/syn_matrix_var_dim.gpt new file mode 100644 index 00000000..fe6c587a --- /dev/null +++ b/test/erros/syn_matrix_var_dim.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + n : inteiro; + m : matriz[n] de inteiros; +fim-variáveis +início +fim diff --git a/test/erros/syn_matrix_var_dim.msg b/test/erros/syn_matrix_var_dim.msg new file mode 100644 index 00000000..5220bdcb --- /dev/null +++ b/test/erros/syn_matrix_var_dim.msg @@ -0,0 +1 @@ +syn_matrix_var_dim.gpt:4 - Esperando número inteiro após "[". diff --git a/test/erros/syn_missing_colon_decl.gpt b/test/erros/syn_missing_colon_decl.gpt new file mode 100644 index 00000000..8117b638 --- /dev/null +++ b/test/erros/syn_missing_colon_decl.gpt @@ -0,0 +1,6 @@ +algoritmo erro; +variáveis + a inteiro; +fim-variáveis +início +fim diff --git a/test/erros/syn_missing_colon_decl.msg b/test/erros/syn_missing_colon_decl.msg new file mode 100644 index 00000000..65334c8f --- /dev/null +++ b/test/erros/syn_missing_colon_decl.msg @@ -0,0 +1 @@ +syn_missing_colon_decl.gpt:3 - Esperando ':', encontrado a palavra-chave "inteiro". diff --git a/test/erros/syn_missing_comma_decl.gpt b/test/erros/syn_missing_comma_decl.gpt new file mode 100644 index 00000000..5d574653 --- /dev/null +++ b/test/erros/syn_missing_comma_decl.gpt @@ -0,0 +1,6 @@ +algoritmo erro; +variáveis + a b : inteiro; +fim-variáveis +início +fim diff --git a/test/erros/syn_missing_comma_decl.msg b/test/erros/syn_missing_comma_decl.msg new file mode 100644 index 00000000..95f51d1c --- /dev/null +++ b/test/erros/syn_missing_comma_decl.msg @@ -0,0 +1 @@ +syn_missing_comma_decl.gpt:3 - Esperando ':', encontrado "b". diff --git a/test/erros/syn_missing_entao.gpt b/test/erros/syn_missing_entao.gpt new file mode 100644 index 00000000..627454c9 --- /dev/null +++ b/test/erros/syn_missing_entao.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + se verdadeiro imprima(1); fim-se +fim diff --git a/test/erros/syn_missing_entao.msg b/test/erros/syn_missing_entao.msg new file mode 100644 index 00000000..e8245004 --- /dev/null +++ b/test/erros/syn_missing_entao.msg @@ -0,0 +1,2 @@ +syn_missing_entao.gpt:3 - Esperando "então", encontrado "imprima". +syn_missing_entao.gpt:3 - Esperando "fim" ou comando válido, encontrado a palavra-chave "fim-se". diff --git a/test/erros/syn_missing_faca.gpt b/test/erros/syn_missing_faca.gpt new file mode 100644 index 00000000..73539028 --- /dev/null +++ b/test/erros/syn_missing_faca.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + i : inteiro; +fim-variáveis +início + enquanto i < 1 i := 1; fim-enquanto +fim diff --git a/test/erros/syn_missing_faca.msg b/test/erros/syn_missing_faca.msg new file mode 100644 index 00000000..e374ba7a --- /dev/null +++ b/test/erros/syn_missing_faca.msg @@ -0,0 +1,2 @@ +syn_missing_faca.gpt:6 - Esperando "faça", encontrado "i". +syn_missing_faca.gpt:6 - Esperando "fim" ou comando válido, encontrado a palavra-chave "fim-enquanto". diff --git a/test/erros/syn_missing_fim_func.gpt b/test/erros/syn_missing_fim_func.gpt new file mode 100644 index 00000000..6c31d925 --- /dev/null +++ b/test/erros/syn_missing_fim_func.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +início + f(); +fim +função f() +início + imprima(1); diff --git a/test/erros/syn_missing_fim_func.msg b/test/erros/syn_missing_fim_func.msg new file mode 100644 index 00000000..191b28f5 --- /dev/null +++ b/test/erros/syn_missing_fim_func.msg @@ -0,0 +1 @@ +syn_missing_fim_func.gpt:8 - Esperando "fim" ou comando válido, encontrado fim de arquivo (EOF). diff --git a/test/erros/syn_missing_fimse.gpt b/test/erros/syn_missing_fimse.gpt new file mode 100644 index 00000000..4e08a618 --- /dev/null +++ b/test/erros/syn_missing_fimse.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + se verdadeiro então imprima("x"); +fim diff --git a/test/erros/syn_missing_fimse.msg b/test/erros/syn_missing_fimse.msg new file mode 100644 index 00000000..c5a27a75 --- /dev/null +++ b/test/erros/syn_missing_fimse.msg @@ -0,0 +1 @@ +syn_missing_fimse.gpt:3 - Esperando "fim-se" ou comando válido após "então". diff --git a/test/erros/syn_missing_paren.gpt b/test/erros/syn_missing_paren.gpt new file mode 100644 index 00000000..80834c38 --- /dev/null +++ b/test/erros/syn_missing_paren.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + imprima(1; +fim diff --git a/test/erros/syn_missing_paren.msg b/test/erros/syn_missing_paren.msg new file mode 100644 index 00000000..214d0d6a --- /dev/null +++ b/test/erros/syn_missing_paren.msg @@ -0,0 +1 @@ +syn_missing_paren.gpt:3 - Esperando ')', encontrado ;. diff --git a/test/erros/syn_missing_semicolon.gpt b/test/erros/syn_missing_semicolon.gpt new file mode 100644 index 00000000..c7717276 --- /dev/null +++ b/test/erros/syn_missing_semicolon.gpt @@ -0,0 +1,8 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := 1 + imprima(a); +fim diff --git a/test/erros/syn_missing_semicolon.msg b/test/erros/syn_missing_semicolon.msg new file mode 100644 index 00000000..c8ec2d30 --- /dev/null +++ b/test/erros/syn_missing_semicolon.msg @@ -0,0 +1 @@ +syn_missing_semicolon.gpt:6 - Esperando ';' após "1". diff --git a/test/erros/syn_missing_semicolon_algoritmo.gpt b/test/erros/syn_missing_semicolon_algoritmo.gpt new file mode 100644 index 00000000..b29a35d7 --- /dev/null +++ b/test/erros/syn_missing_semicolon_algoritmo.gpt @@ -0,0 +1,4 @@ +algoritmo erro +início + imprima(1); +fim diff --git a/test/erros/syn_missing_semicolon_algoritmo.msg b/test/erros/syn_missing_semicolon_algoritmo.msg new file mode 100644 index 00000000..917913ed --- /dev/null +++ b/test/erros/syn_missing_semicolon_algoritmo.msg @@ -0,0 +1 @@ +syn_missing_semicolon_algoritmo.gpt:1 - Esperando ';' após "erro". diff --git a/test/erros/syn_no_algoritmo.gpt b/test/erros/syn_no_algoritmo.gpt new file mode 100644 index 00000000..915ad8f8 --- /dev/null +++ b/test/erros/syn_no_algoritmo.gpt @@ -0,0 +1,3 @@ +início + imprima(1); +fim diff --git a/test/erros/syn_no_algoritmo.msg b/test/erros/syn_no_algoritmo.msg new file mode 100644 index 00000000..da0f92d7 --- /dev/null +++ b/test/erros/syn_no_algoritmo.msg @@ -0,0 +1 @@ +syn_no_algoritmo.gpt:1 - Esperando "algoritmo", encontrado a palavra-chave "início". diff --git a/test/erros/syn_only_comment.gpt b/test/erros/syn_only_comment.gpt new file mode 100644 index 00000000..0e8b492e --- /dev/null +++ b/test/erros/syn_only_comment.gpt @@ -0,0 +1 @@ +/* nada */ diff --git a/test/erros/syn_only_comment.msg b/test/erros/syn_only_comment.msg new file mode 100644 index 00000000..a8a205d3 --- /dev/null +++ b/test/erros/syn_only_comment.msg @@ -0,0 +1,2 @@ +syn_only_comment.gpt:2 - Esperando "algoritmo", encontrado fim de arquivo (EOF). +syn_only_comment.gpt:2 - Esperando "variáveis" ou "início" após declaração de algoritmo, encontrado fim de arquivo (EOF). diff --git a/test/erros/syn_scalar_plural_type.gpt b/test/erros/syn_scalar_plural_type.gpt new file mode 100644 index 00000000..2b56f5f5 --- /dev/null +++ b/test/erros/syn_scalar_plural_type.gpt @@ -0,0 +1,6 @@ +algoritmo erro; +variáveis + a : inteiros; +fim-variáveis +início +fim diff --git a/test/erros/syn_scalar_plural_type.msg b/test/erros/syn_scalar_plural_type.msg new file mode 100644 index 00000000..f452484a --- /dev/null +++ b/test/erros/syn_scalar_plural_type.msg @@ -0,0 +1 @@ +syn_scalar_plural_type.gpt:3 - Esperando um tipo (inteiro, literal,...), encontrado a palavra-chave "inteiros". diff --git a/test/erros/syn_stray_operator.gpt b/test/erros/syn_stray_operator.gpt new file mode 100644 index 00000000..daaaa20c --- /dev/null +++ b/test/erros/syn_stray_operator.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := 1 + ; +fim diff --git a/test/erros/syn_stray_operator.msg b/test/erros/syn_stray_operator.msg new file mode 100644 index 00000000..1d2a815f --- /dev/null +++ b/test/erros/syn_stray_operator.msg @@ -0,0 +1 @@ +syn_stray_operator.gpt:6 - Esperando expressão, encontrado ; após "+". diff --git a/test/erros/syn_two_algoritmos.gpt b/test/erros/syn_two_algoritmos.gpt new file mode 100644 index 00000000..6a20c64b --- /dev/null +++ b/test/erros/syn_two_algoritmos.gpt @@ -0,0 +1,6 @@ +algoritmo erro; +início +fim +algoritmo f; +início +fim diff --git a/test/erros/syn_two_algoritmos.msg b/test/erros/syn_two_algoritmos.msg new file mode 100644 index 00000000..3cd5b33f --- /dev/null +++ b/test/erros/syn_two_algoritmos.msg @@ -0,0 +1 @@ +syn_two_algoritmos.gpt:4 - Esperando fim de arquivo (EOF) ou "função", encontrado a palavra-chave "algoritmo". diff --git a/test/erros/syn_unbalanced_paren.gpt b/test/erros/syn_unbalanced_paren.gpt new file mode 100644 index 00000000..47f47618 --- /dev/null +++ b/test/erros/syn_unbalanced_paren.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := (1 + 2; +fim diff --git a/test/erros/syn_unbalanced_paren.msg b/test/erros/syn_unbalanced_paren.msg new file mode 100644 index 00000000..0211bdf4 --- /dev/null +++ b/test/erros/syn_unbalanced_paren.msg @@ -0,0 +1 @@ +syn_unbalanced_paren.gpt:6 - Esperando ')', encontrado ;. diff --git a/test/erros/syn_unterminated_comment.gpt b/test/erros/syn_unterminated_comment.gpt new file mode 100644 index 00000000..2ef72f86 --- /dev/null +++ b/test/erros/syn_unterminated_comment.gpt @@ -0,0 +1,5 @@ +algoritmo erro; +início + /* aberto + imprima(1); +fim diff --git a/test/erros/syn_unterminated_comment.msg b/test/erros/syn_unterminated_comment.msg new file mode 100644 index 00000000..e580f4ad --- /dev/null +++ b/test/erros/syn_unterminated_comment.msg @@ -0,0 +1,2 @@ +syn_unterminated_comment.gpt:6 - AVISO: comentário iniciado na linha 3 não termina com "*/".. +syn_unterminated_comment.gpt:6 - Esperando "fim" ou comando válido, encontrado fim de arquivo (EOF). diff --git a/test/erros/syn_unterminated_string.gpt b/test/erros/syn_unterminated_string.gpt new file mode 100644 index 00000000..0e26568c --- /dev/null +++ b/test/erros/syn_unterminated_string.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + imprima("abc); +fim diff --git a/test/erros/syn_unterminated_string.msg b/test/erros/syn_unterminated_string.msg new file mode 100644 index 00000000..f682b95d --- /dev/null +++ b/test/erros/syn_unterminated_string.msg @@ -0,0 +1 @@ +syn_unterminated_string.gpt:3 - Faltando fechar aspas. diff --git a/test/erros/syn_wrong_end.gpt b/test/erros/syn_wrong_end.gpt new file mode 100644 index 00000000..b11471c6 --- /dev/null +++ b/test/erros/syn_wrong_end.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + se verdadeiro então imprima(1); fim-enquanto +fim diff --git a/test/erros/syn_wrong_end.msg b/test/erros/syn_wrong_end.msg new file mode 100644 index 00000000..067bfaa5 --- /dev/null +++ b/test/erros/syn_wrong_end.msg @@ -0,0 +1,2 @@ +syn_wrong_end.gpt:3 - Esperando "fim-se" ou comando válido, encontrado a palavra-chave "fim-enquanto". +syn_wrong_end.gpt:3 - Esperando "fim" ou comando válido, encontrado a palavra-chave "fim-enquanto". diff --git a/test/erros/undeclared_func.gpt b/test/erros/undeclared_func.gpt new file mode 100644 index 00000000..e1f8198e --- /dev/null +++ b/test/erros/undeclared_func.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + foo(1); +fim diff --git a/test/erros/undeclared_func.msg b/test/erros/undeclared_func.msg new file mode 100644 index 00000000..872361b4 --- /dev/null +++ b/test/erros/undeclared_func.msg @@ -0,0 +1 @@ +undeclared_func.gpt:3 - Função "foo" não foi declarada. diff --git a/test/erros/undeclared_var.gpt b/test/erros/undeclared_var.gpt new file mode 100644 index 00000000..3f03166b --- /dev/null +++ b/test/erros/undeclared_var.gpt @@ -0,0 +1,4 @@ +algoritmo erro; +início + x := 1; +fim diff --git a/test/erros/undeclared_var.msg b/test/erros/undeclared_var.msg new file mode 100644 index 00000000..10501e8c --- /dev/null +++ b/test/erros/undeclared_var.msg @@ -0,0 +1,2 @@ +undeclared_var.gpt:3 - Variável "x" não foi declarada. +undeclared_var.gpt:3 - Variável "x" não pode receber valores do tipo 'inteiro'. diff --git a/test/erros/undeclared_var_expr.gpt b/test/erros/undeclared_var_expr.gpt new file mode 100644 index 00000000..18a8954b --- /dev/null +++ b/test/erros/undeclared_var_expr.gpt @@ -0,0 +1,7 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := y + 1; +fim diff --git a/test/erros/undeclared_var_expr.msg b/test/erros/undeclared_var_expr.msg new file mode 100644 index 00000000..549e8f01 --- /dev/null +++ b/test/erros/undeclared_var_expr.msg @@ -0,0 +1,3 @@ +undeclared_var_expr.gpt:6 - Variável "y" não foi declarada. +undeclared_var_expr.gpt:6 - Operador "+" só pode ser usado com termos numéricos. +undeclared_var_expr.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/erros/use_func_as_var.gpt b/test/erros/use_func_as_var.gpt new file mode 100644 index 00000000..b6caf134 --- /dev/null +++ b/test/erros/use_func_as_var.gpt @@ -0,0 +1,11 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := f; +fim +função f(): inteiro +início + retorne 1; +fim diff --git a/test/erros/use_func_as_var.msg b/test/erros/use_func_as_var.msg new file mode 100644 index 00000000..6a0c0dd4 --- /dev/null +++ b/test/erros/use_func_as_var.msg @@ -0,0 +1 @@ +use_func_as_var.gpt:6 - Faltando abrir parêntesis após função "f". diff --git a/test/erros/var_and_func_same_name.gpt b/test/erros/var_and_func_same_name.gpt new file mode 100644 index 00000000..0dd26b36 --- /dev/null +++ b/test/erros/var_and_func_same_name.gpt @@ -0,0 +1,10 @@ +algoritmo erro; +variáveis + f : inteiro; +fim-variáveis +início + f := 1; +fim +função f() +início +fim diff --git a/test/erros/var_and_func_same_name.msg b/test/erros/var_and_func_same_name.msg new file mode 100644 index 00000000..824fcb0e --- /dev/null +++ b/test/erros/var_and_func_same_name.msg @@ -0,0 +1 @@ +var_and_func_same_name.gpt:8 - Variável/função redeclarada: "f". diff --git a/test/erros/void_func_in_expr.gpt b/test/erros/void_func_in_expr.gpt new file mode 100644 index 00000000..f97eea13 --- /dev/null +++ b/test/erros/void_func_in_expr.gpt @@ -0,0 +1,10 @@ +algoritmo erro; +variáveis + a : inteiro; +fim-variáveis +início + a := f(); +fim +função f() +início +fim diff --git a/test/erros/void_func_in_expr.msg b/test/erros/void_func_in_expr.msg new file mode 100644 index 00000000..64b821c1 --- /dev/null +++ b/test/erros/void_func_in_expr.msg @@ -0,0 +1 @@ +void_func_in_expr.gpt:6 - Expressão não retorna resultado para variável. diff --git a/test/run_test.sh b/test/run_test.sh index 454bd086..66c8f975 100755 --- a/test/run_test.sh +++ b/test/run_test.sh @@ -1,113 +1,263 @@ #!/bin/bash +# +# GPT regression suite. +# +# test/tester.gpt self-checking program (must exit with code 42) +# test/casos/ valid programs, run in the three modes: +# NAME.gpt source +# NAME.entrada stdin (optional) +# NAME.args extra command line files +# (optional, relative to casos/) +# NAME.saida expected stdout (interpreter) +# NAME.saida.nativo expected stdout of the native +# binary, when it differs +# NAME.saida.c same for the C translation +# NAME.codigo[.nativo|.c] exit code (default: 0) +# NAME.pular modes to skip ("interp", "nativo", +# "c"), or "windows" to skip the +# whole case on Windows +# test/erros/ invalid programs: +# NAME.gpt source +# NAME.msg expected stderr of "gpt -s" +# +# Files whose name starts with "_" are helpers and are not run. -# Get the directory of this script SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" GPT="$SCRIPT_DIR/../src/gpt" +TMP="${TMPDIR:-/tmp}/gpt_test_$$" -# Track failures FAILURES=0 +PASSED=0 -# Check if gpt binary exists if [ ! -f "$GPT" ]; then echo "ERRO: gpt binário não encontrado em $GPT" echo "Execute 'make' primeiro." exit 1 fi -# Detect architecture +mkdir -p "$TMP" +trap 'rm -rf "$TMP"' EXIT + +# Detect architecture / platform ARCH=$(uname -m) CAN_EXEC_X86=0 - if [ "$ARCH" = "i686" ] || [ "$ARCH" = "x86_64" ]; then CAN_EXEC_X86=1 fi -cd "$SCRIPT_DIR" || exit 1 +ON_WINDOWS=0 +case "$(uname -o 2>/dev/null)" in + Msys | Cygwin) ON_WINDOWS=1 ;; +esac -echo "========================================" -echo "Testando a interpretação (-i)" -echo "========================================" -$GPT -i tester.gpt -RESULT=$? -echo "Código de saída: $RESULT" -if [ $RESULT -eq 42 ]; then - echo "✓ Interpretação OK" +HAVE_GCC=0 +if command -v gcc &>/dev/null; then + HAVE_GCC=1 +fi + +if command -v timeout &>/dev/null; then + TIMEOUT="timeout 60" else - echo "✗ Interpretação FALHOU (esperado: 42)" - FAILURES=$((FAILURES + 1)) + TIMEOUT="" fi -echo "" -echo "========================================" -echo "Testando a compilação nativa (-o)" -echo "========================================" -$GPT -o tester_bin tester.gpt -if $GPT -o tester_bin tester.gpt; then - echo "✓ Compilação OK" - if [ $CAN_EXEC_X86 -eq 1 ]; then - ./tester_bin - RESULT=$? - echo "Código de saída: $RESULT" - if [ $RESULT -eq 42 ]; then - echo "✓ Execução OK" +ok() { + echo "✓ $1" + PASSED=$((PASSED + 1)) +} + +fail() { + echo "✗ $1" + FAILURES=$((FAILURES + 1)) +} + +# check +check() { + local desc="$1" got="$2" rc="$3" exp="$4" exp_rc="$5" + local want_rc=0 + if [ -f "$exp_rc" ]; then + want_rc=$(tr -d '[:space:]' <"$exp_rc") + fi + if [ "$rc" != "$want_rc" ]; then + fail "$desc: código de saída $rc (esperado: $want_rc)" + return + fi + got=$(norm "$got") + exp=$(norm "$exp") + if ! cmp -s "$got" "$exp"; then + fail "$desc: saída diferente da esperada" + diff "$exp" "$got" | head -20 + return + fi + ok "$desc" +} + +# On Windows both git (autocrlf) and MinGW programs produce CRLF while the +# native binaries write LF, and gpt converts accented characters of its +# messages to the OEM code page (CP437 on the CI runner), where ã, õ and the +# accented capitals other than É do not exist and become the plain letter: +# fold those, then compare without carriage returns and non-ASCII bytes. +norm() { + if [ $ON_WINDOWS -eq 1 ]; then + sed 's/ã/a/g; s/õ/o/g; s/[ÁÀÂÃ]/A/g; s/Ê/E/g; s/Í/I/g; s/[ÓÔÕ]/O/g; s/Ú/U/g' <"$1" | + tr -d '\r\200-\377' >"$TMP/$(basename "$1").lf" + echo "$TMP/$(basename "$1").lf" + else + echo "$1" + fi +} + +# expected file specific to the mode, when there is one +expected_for() { + local base="$1" ext="$2" mode="$3" + if [ -f "$base.$ext.$mode" ]; then + echo "$base.$ext.$mode" + else + echo "$base.$ext" + fi +} + +skip_mode() { + local base="$1" mode="$2" + [ -f "$base.pular" ] || return 1 + if [ $ON_WINDOWS -eq 1 ] && grep -qw "windows" "$base.pular"; then + return 0 + fi + grep -qw "$mode" "$base.pular" +} + +# run_caso <.gpt file> +run_caso() { + local src="$1" base="$2" + local name + name=$(basename "$src" .gpt) + local dir + dir=$(dirname "$src") + local stdin=/dev/null + [ -f "$base.entrada" ] && stdin="$base.entrada" + local extra="" + if [ -f "$base.args" ]; then + for a in $(cat "$base.args"); do + extra="$extra $dir/$a" + done + fi + + # interpretador + if ! skip_mode "$base" "interp"; then + $TIMEOUT "$GPT" -i "$src" $extra <"$stdin" >"$TMP/$name.i.out" 2>"$TMP/$name.i.err" + check "$name (-i)" "$TMP/$name.i.out" $? \ + "$(expected_for "$base" saida interp)" "$(expected_for "$base" codigo interp)" + fi + + # binário nativo + if ! skip_mode "$base" "nativo"; then + if $TIMEOUT "$GPT" -o "$TMP/$name.bin" "$src" $extra >"$TMP/$name.o.build" 2>&1; then + if [ $CAN_EXEC_X86 -eq 1 ]; then + $TIMEOUT "$TMP/$name.bin" <"$stdin" >"$TMP/$name.o.out" 2>"$TMP/$name.o.err" + check "$name (-o)" "$TMP/$name.o.out" $? \ + "$(expected_for "$base" saida nativo)" "$(expected_for "$base" codigo nativo)" + else + echo "⚠ $name (-o): execução pulada (arquitetura $ARCH)" + fi else - echo "✗ Execução FALHOU (esperado: 42)" - FAILURES=$((FAILURES + 1)) + fail "$name (-o): compilação falhou" + head -5 "$TMP/$name.o.build" fi - else - echo "⚠ Pulando execução (arquitetura $ARCH, binário x86)" fi - rm -f tester_bin -else - echo "✗ Compilação FALHOU" - FAILURES=$((FAILURES + 1)) -fi -echo "" + + # tradução para C + if ! skip_mode "$base" "c"; then + # Every translated program carries leia_literal(), which calls the + # POSIX getline() that MinGW-w64 lacks, so on Windows the generated C + # neither compiles nor links. + if [ $ON_WINDOWS -eq 1 ] || [ $HAVE_GCC -eq 0 ]; then + if $TIMEOUT "$GPT" -t "$TMP/$name.c" "$src" $extra >"$TMP/$name.t.build" 2>&1; then + ok "$name (-t): tradução gerada (compilação do C pulada nesta plataforma)" + else + fail "$name (-t): tradução falhou" + fi + elif ! $TIMEOUT "$GPT" -t "$TMP/$name.c" "$src" $extra >"$TMP/$name.t.build" 2>&1; then + fail "$name (-t): tradução falhou" + head -5 "$TMP/$name.t.build" + elif ! gcc -w -o "$TMP/$name.cbin" "$TMP/$name.c" >"$TMP/$name.gcc" 2>&1; then + fail "$name (-t): C gerado não compila" + head -5 "$TMP/$name.gcc" + else + $TIMEOUT "$TMP/$name.cbin" <"$stdin" >"$TMP/$name.t.out" 2>"$TMP/$name.t.err" + check "$name (-t)" "$TMP/$name.t.out" $? \ + "$(expected_for "$base" saida c)" "$(expected_for "$base" codigo c)" + fi + fi +} echo "========================================" -echo "Testando geração de assembly (-s)" +echo "tester.gpt" echo "========================================" -$GPT -s tester.asm tester.gpt -if $GPT -s tester.asm tester.gpt && [ -f tester.asm ]; then - echo "✓ Geração de assembly OK" - # Check if we can assemble it +cd "$SCRIPT_DIR" || exit 1 +run_caso "$SCRIPT_DIR/tester.gpt" "$SCRIPT_DIR/tester" + +if $TIMEOUT "$GPT" -s "$TMP/tester.asm" tester.gpt >/dev/null 2>&1 && [ -f "$TMP/tester.asm" ]; then + ok "tester.gpt (-s): geração de assembly" if command -v nasm &>/dev/null; then - nasm -O1 -fbin -o tester_asm_bin tester.asm 2>/dev/null - if nasm -O1 -fbin -o tester_asm_bin tester.asm 2>/dev/null; then - echo "✓ Assembly com NASM OK" - rm -f tester_asm_bin + NASM_FORMAT=bin + [ $ON_WINDOWS -eq 1 ] && NASM_FORMAT=win32 + if nasm -O1 -f $NASM_FORMAT -o "$TMP/tester_asm_bin" "$TMP/tester.asm" >"$TMP/tester.nasm" 2>&1; then + ok "tester.gpt (-s): montagem com NASM" else - echo "⚠ NASM falhou ao montar (pode ser normal em ARM)" + fail "tester.gpt (-s): montagem com NASM falhou" + head -5 "$TMP/tester.nasm" fi else - echo "⚠ NASM não encontrado" + echo "⚠ tester.gpt (-s): montagem pulada (NASM não encontrado)" fi - rm -f tester.asm else - echo "✗ Geração de assembly FALHOU" - FAILURES=$((FAILURES + 1)) + fail "tester.gpt (-s): geração de assembly" fi echo "" echo "========================================" -echo "Testando tradução para C (-t)" +echo "Casos de regressão (test/casos)" echo "========================================" -$GPT -t tester.c tester.gpt 2>&1 -if $GPT -t tester.c tester.gpt && [ -f tester.c ]; then - echo "✓ Tradução para C OK" - rm -f tester.c -else - echo "⚠ Tradução para C não implementada (ANTLR4 migration pending)" -fi +for src in "$SCRIPT_DIR"/casos/*.gpt; do + name=$(basename "$src" .gpt) + case "$name" in _*) continue ;; esac + run_caso "$src" "$SCRIPT_DIR/casos/$name" +done +echo "" + +echo "========================================" +echo "Erros de compilação (test/erros)" +echo "========================================" +# run from erros/ so that messages carry only the file name +cd "$SCRIPT_DIR/erros" || exit 1 +for src in *.gpt; do + name=$(basename "$src" .gpt) + case "$name" in _*) continue ;; esac + $TIMEOUT "$GPT" -s "$TMP/$name.asm" "$src" "$TMP/$name.e.out" 2>"$TMP/$name.e.err" + rc=$? + if [ $rc -eq 0 ]; then + fail "$name: programa inválido foi aceito" + elif [ $rc -ge 128 ]; then + fail "$name: gpt abortou (código $rc)" + tail -3 "$TMP/$name.e.err" + elif ! cmp -s "$(norm "$TMP/$name.e.err")" "$(norm "$name.msg")"; then + fail "$name: mensagem diferente da esperada" + diff "$(norm "$name.msg")" "$(norm "$TMP/$name.e.err")" | head -10 + else + ok "$name" + fi +done +cd "$SCRIPT_DIR" || exit 1 echo "" echo "========================================" echo "Resumo dos testes" echo "========================================" +echo "$PASSED verificação(ões) passou(aram)" if [ $FAILURES -eq 0 ]; then echo "✓ Todos os testes passaram!" exit 0 else - echo "✗ $FAILURES teste(s) falhou(aram)" + echo "✗ $FAILURES verificação(ões) falhou(aram)" exit 1 fi diff --git a/test/tester.codigo b/test/tester.codigo new file mode 100644 index 00000000..d81cc071 --- /dev/null +++ b/test/tester.codigo @@ -0,0 +1 @@ +42 diff --git a/test/tester.saida b/test/tester.saida new file mode 100644 index 00000000..83c39f01 --- /dev/null +++ b/test/tester.saida @@ -0,0 +1 @@ +Verifique se o resultado de 'echo $?' é 42 diff --git a/test/tester.saida.c b/test/tester.saida.c new file mode 100644 index 00000000..312a7559 --- /dev/null +++ b/test/tester.saida.c @@ -0,0 +1,5 @@ +testar_expr_aritm: 6.6 + 5.3 <> 11.9 +testar_expr_aritm: (6.6 + 5.3)/2 <> 5.95 +testar_expr_aritm: 0.6 + 0.3 <> 0.9 +testar_expr_aritm: (0.6 + 0.3)/2 <> 0.45 +Verifique se o resultado de 'echo $?' é 42 diff --git a/test/tester.saida.nativo b/test/tester.saida.nativo new file mode 100644 index 00000000..8bf8c7aa --- /dev/null +++ b/test/tester.saida.nativo @@ -0,0 +1,6 @@ +testar_expr_aritm: 0.6 + 0.3 <> 0.9 +testar_expr_aritm: (0.6 + 0.3)/2 <> 0.45 +testar_expr_aritm: 0.6 + 0.8 <> 1.4 +testar_expr_aritm: (0.6 + 0.8)/2 <> 0.7 +ERRO: '\t' <> 9 +Verifique se o resultado de 'echo $?' é 42 From 4a16bde7c9b66762d7bb4eacb2e1a078a8c32184 Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Sat, 26 Sep 2026 14:46:37 -0300 Subject: [PATCH 08/11] Report -i and -o failures through the exit code gpt exited 0 after two kinds of failure. GPT::interpret() returned 0 when prologue() failed, so gpt -i printed a syntax or semantic error and still reported success. The x86 backend emits 32-bit assembly for a flat nasm binary without consulting the host, and the nasm call was tested only for -1, which system() returns when it cannot start a shell: off x86, gpt -o wrote an image that cannot run, and without nasm the shell complained and gpt exited 0 again. Now -i returns EXIT_FAILURE, -o refuses off x86 and points at -t, and any non-zero nasm status is an error. The -h help, both man pages and the LaTeX manual note the -o restriction; run_test.sh skips the per-case -o runs off x86 and covers the three refusals, each requiring exit code 1 and gpt's own diagnostic on stderr, so a gpt that never started or crashed cannot pass. The host check is a compile-time macro, so it describes the machine gpt was built for, which is the one it runs on in every native build this project ships; it holds for i386 and amd64 and fails for arm64, armhf, riscv64, s390x and ppc64el. -s keeps working everywhere, since emitting x86 assembly for another machine is legitimate. An algorithm that ends with 1 still looks like a refusal to the caller, which can read stderr to tell them apart. The nasm refusal is checked with a nasm that exits 1 rather than a missing one, because emptying PATH on Windows also hides the MinGW DLLs gpt.exe loads from /mingw64/bin, where nasm.exe lives; both reach the same system() != 0 branch. The refusal off x86 never runs in CI, which builds only on x86_64; it was exercised with an arm64 build under qemu-aarch64. --- doc/man/gpt.1 | 4 +++ doc/man/pt_BR/gpt.1 | 4 +++ doc/manual/manual.tex | 6 ++-- src/GPT.cpp | 26 +++++++++++++--- test/run_test.sh | 69 ++++++++++++++++++++++++++++++++++++------- 5 files changed, 93 insertions(+), 16 deletions(-) diff --git a/doc/man/gpt.1 b/doc/man/gpt.1 index d9031491..e3ccfb9c 100644 --- a/doc/man/gpt.1 +++ b/doc/man/gpt.1 @@ -64,6 +64,10 @@ Shows tips in the error report. .BI \-o " output_file" Compile the source code and save the resulting binary with the name .I output_file. +The generated code is 32-bit x86, so this option only works on x86 machines; +elsewhere, use +.B \-t +and compile the C code with the system compiler. .br .ns .TP diff --git a/doc/man/pt_BR/gpt.1 b/doc/man/pt_BR/gpt.1 index ee0ecfee..64b05ff5 100644 --- a/doc/man/pt_BR/gpt.1 +++ b/doc/man/pt_BR/gpt.1 @@ -69,6 +69,10 @@ Mostra dicas no relatório de erros. .BI \-o " arq_saída" Compila o algoritmo e salva o arquivo executável com o nome .I arq_saída. +O código gerado é x86 de 32 bits, então esta opção só funciona em máquinas x86; +nas demais, use +.B \-t +e compile o código C com o compilador do sistema. .br .ns .TP diff --git a/doc/manual/manual.tex b/doc/manual/manual.tex index 1714c3f2..bc46866e 100644 --- a/doc/manual/manual.tex +++ b/doc/manual/manual.tex @@ -1305,7 +1305,7 @@ \section{Opções gerais} Opções: -v mostra versão do programa -h mostra esse texto - -o compila e salva executável como + -o compila e salva executável como (só em x86) -t salva o código em linguagem C como -s salva o código em linguagem assembly como -i interpreta @@ -1322,7 +1322,9 @@ \section{Opções gerais} \item h: exibe todas as opções suportadas pelo programa ``gpt''; \item o : Ao compilar um algoritmo, salva o executável com o nome de \textit{}. Se essa opção for omitida na compilação, o nome do - algoritmo será usado para criar o arquivo executável. + algoritmo será usado para criar o arquivo executável. O código gerado é + x86 de 32 bits, então essa opção só funciona em máquinas x86; nas demais, + use a opção t e compile o código C com o compilador do sistema. \item t : Traduz o algoritmo para C, salva o código fonte com o nome de \textit{}; \item s : Compila o algoritmo mas não cria código executável. Salva o diff --git a/src/GPT.cpp b/src/GPT.cpp index 6c9c3515..b20adcd0 100644 --- a/src/GPT.cpp +++ b/src/GPT.cpp @@ -34,11 +34,19 @@ #include #include +#include #include #include #include #include +// The native backend emits 32-bit x86 assembly and NASM turns it into a flat +// binary, so -o only yields something runnable when gpt itself runs on x86. +#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || \ + defined(_M_X64) +#define GPT_HOST_X86 1 +#endif + GPT *GPT::_self = 0; GPT::GPT() @@ -87,7 +95,7 @@ void GPT::showHelp() { "Opções:\n" " -v mostra versão do programa\n" " -h mostra esse texto\n" - " -o compila e salva programa como \n" + " -o compila e salva programa como (só em x86)\n" " -t salva o código em linguagem C como \n" " -s salva o código em linguagem Assembly como \n" " -i interpreta o algoritmo\n" @@ -153,6 +161,15 @@ bool GPT::compile(const list &ifnames, bool genBinary) { bool success = false; stringstream s; +#ifndef GPT_HOST_X86 + if (genBinary) { + s << PACKAGE << ": a geração de executável só funciona em máquinas x86. " + << "Use -t para traduzir o algoritmo para C." << endl; + GPTDisplay::self()->showError(s); + return false; + } +#endif + if (!prologue(ifnames)) { return false; } @@ -199,8 +216,9 @@ bool GPT::compile(const list &ifnames, bool genBinary) { stringstream cmd; cmd << "nasm -O1 -fbin -o \"" << ofname << "\" " << ftmpname; - if (system(cmd.str().c_str()) == -1) { - s << PACKAGE << ": não foi possível invocar o nasm." << endl; + if (system(cmd.str().c_str()) != 0) { + s << PACKAGE << ": não foi possível montar o programa com o nasm." + << endl; GPTDisplay::self()->showError(s); goto bail; } @@ -267,7 +285,7 @@ bool GPT::translate2C(const list &ifnames) { int GPT::interpret(const list &ifnames, const string &host, int port) { if (!prologue(ifnames)) { - return 0; + return EXIT_FAILURE; } InterpreterWalker interpreter(_stable, host, port); diff --git a/test/run_test.sh b/test/run_test.sh index 66c8f975..4c104223 100755 --- a/test/run_test.sh +++ b/test/run_test.sh @@ -41,9 +41,11 @@ trap 'rm -rf "$TMP"' EXIT # Detect architecture / platform ARCH=$(uname -m) CAN_EXEC_X86=0 -if [ "$ARCH" = "i686" ] || [ "$ARCH" = "x86_64" ]; then +case "$ARCH" in +i?86 | x86_64 | amd64) CAN_EXEC_X86=1 -fi + ;; +esac ON_WINDOWS=0 case "$(uname -o 2>/dev/null)" in @@ -151,14 +153,12 @@ run_caso() { # binário nativo if ! skip_mode "$base" "nativo"; then - if $TIMEOUT "$GPT" -o "$TMP/$name.bin" "$src" $extra >"$TMP/$name.o.build" 2>&1; then - if [ $CAN_EXEC_X86 -eq 1 ]; then - $TIMEOUT "$TMP/$name.bin" <"$stdin" >"$TMP/$name.o.out" 2>"$TMP/$name.o.err" - check "$name (-o)" "$TMP/$name.o.out" $? \ - "$(expected_for "$base" saida nativo)" "$(expected_for "$base" codigo nativo)" - else - echo "⚠ $name (-o): execução pulada (arquitetura $ARCH)" - fi + if [ $CAN_EXEC_X86 -eq 0 ]; then + echo "⚠ $name (-o): pulado (gpt recusa -o na arquitetura $ARCH)" + elif $TIMEOUT "$GPT" -o "$TMP/$name.bin" "$src" $extra >"$TMP/$name.o.build" 2>&1; then + $TIMEOUT "$TMP/$name.bin" <"$stdin" >"$TMP/$name.o.out" 2>"$TMP/$name.o.err" + check "$name (-o)" "$TMP/$name.o.out" $? \ + "$(expected_for "$base" saida nativo)" "$(expected_for "$base" codigo nativo)" else fail "$name (-o): compilação falhou" head -5 "$TMP/$name.o.build" @@ -250,6 +250,55 @@ done cd "$SCRIPT_DIR" || exit 1 echo "" +echo "========================================" +echo "Recusas (código de saída 1)" +echo "========================================" +# The refusal checks grep ASCII-only fragments of gpt's diagnostics: on +# Windows, gpt converts stderr to the OEM code page before writing it. +if [ $CAN_EXEC_X86 -eq 1 ]; then + # Hiding nasm by emptying PATH also hides the MinGW DLLs that gpt.exe + # loads from /mingw64/bin, where HACKING.md installs nasm, so a failing + # nasm goes first in PATH instead: cmd.exe runs the .bat, sh the script. + mkdir -p "$TMP/nasm_falso" + printf '#!/bin/sh\nexit 1\n' >"$TMP/nasm_falso/nasm" + printf '@exit /b 1\r\n' >"$TMP/nasm_falso/nasm.bat" + chmod +x "$TMP/nasm_falso/nasm" + ERRO=$(PATH="$TMP/nasm_falso:$PATH" $TIMEOUT "$GPT" -o "$TMP/recusa.bin" tester.gpt 2>&1 >/dev/null) + RESULT=$? + if [ $RESULT -eq 1 ] && grep -q "montar o programa com o nasm" <<<"$ERRO"; then + ok "-o com o nasm falhando" + else + fail "-o com o nasm falhando: código $RESULT (esperado: 1 e o diagnóstico do gpt)" + echo "$ERRO" + fi +else + ERRO=$($TIMEOUT "$GPT" -o "$TMP/recusa.bin" tester.gpt 2>&1 >/dev/null) + RESULT=$? + if [ $RESULT -eq 1 ] && grep -q "Use -t para traduzir" <<<"$ERRO"; then + ok "-o na arquitetura $ARCH" + else + fail "-o na arquitetura $ARCH: código $RESULT (esperado: 1 e o diagnóstico do gpt)" + echo "$ERRO" + fi +fi + +cat >"$TMP/erro_sintaxe.gpt" <<'EOF' +algoritmo erro_sintaxe; + +início + isso nao e um comando +fim +EOF +ERRO=$(cd "$TMP" && $TIMEOUT "$GPT" -i erro_sintaxe.gpt 2>&1 /dev/null) +RESULT=$? +if [ $RESULT -eq 1 ] && grep -q "^erro_sintaxe.gpt:4 " <<<"$ERRO"; then + ok "-i com erro de sintaxe" +else + fail "-i com erro de sintaxe: código $RESULT (esperado: 1 e o erro da linha 4)" + echo "$ERRO" +fi +echo "" + echo "========================================" echo "Resumo dos testes" echo "========================================" From d299f8a3bcd2d826be3e3ba70e0f618be504d4cf Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Sun, 27 Sep 2026 14:26:44 -0300 Subject: [PATCH 09/11] Add Dependabot version updates for GitHub Actions The workflows reference actions by floating major tags and nothing watches for new releases, so every action except msys2/setup-msys2 is now one or more majors behind: build.yml still runs actions/cache@v3, and release.yml uses actions/download-artifact@v4 while v8 is out. This adds a weekly Dependabot check for the github-actions ecosystem, which with directory "/" covers .github/workflows. All updates, majors included, are grouped into a single pull request to keep the noise down; the cost is that one incompatible release holds back the whole group until it is fixed or excluded. The release workflow only runs when a release is created, so bumps to download-artifact or action-gh-release are not exercised by pull request CI and need a manual look before merging. --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..f6faee69 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + github-actions: + patterns: + - "*" From 613a2a578eac3639b8f51b6202a9b0bb3bdd6fc7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 27 Sep 2026 17:33:44 +0000 Subject: [PATCH 10/11] Bump the github-actions group with 6 updates Bumps the github-actions group with 6 updates: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `4` | `7` | | [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4` | `7` | | [actions/cache](https://github.com/actions/cache) | `3` | `6` | | [actions/setup-python](https://github.com/actions/setup-python) | `5` | `7` | | [actions/download-artifact](https://github.com/actions/download-artifact) | `4` | `8` | | [softprops/action-gh-release](https://github.com/softprops/action-gh-release) | `2` | `3` | Updates `actions/checkout` from 4 to 7 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v7) Updates `actions/upload-artifact` from 4 to 7 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v7) Updates `actions/cache` from 3 to 6 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v6) Updates `actions/setup-python` from 5 to 7 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v5...v7) Updates `actions/download-artifact` from 4 to 8 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v4...v8) Updates `softprops/action-gh-release` from 2 to 3 - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/cache dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/setup-python dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/download-artifact dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: softprops/action-gh-release dependency-version: '3' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 16 ++++++++-------- .github/workflows/pre-commit.yml | 6 +++--- .github/workflows/release.yml | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 94570a9b..82b58914 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Install TeX Dependencies run: | @@ -29,7 +29,7 @@ jobs: pdflatex -interaction=nonstopmode -output-directory=doc doc/manual/manual.tex - name: Upload PDF Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: manual-pdf path: doc/manual.pdf @@ -39,7 +39,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Install Build Dependencies run: | @@ -63,7 +63,7 @@ jobs: mv release/usr/local/* dist/ - name: Upload Linux Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: gpt-linux path: dist/* @@ -74,7 +74,7 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Setup MSYS2 Environment uses: msys2/setup-msys2@v2 @@ -98,7 +98,7 @@ jobs: - name: Cache JDK 25 id: cache-jdk - uses: actions/cache@v3 + uses: actions/cache@v6 with: path: D:\a\gpt\gpt\jdk-25.0.1 key: jdk-25.0.1-cache @@ -115,7 +115,7 @@ jobs: - name: Cache ANTLR2 Build id: cache-antlr - uses: actions/cache@v3 + uses: actions/cache@v6 with: path: D:/a/_temp/msys64/usr/local key: antlr2.7.7-msys2-static @@ -178,7 +178,7 @@ jobs: done - name: Upload Windows ZIP Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: gpt-windows path: dist/* diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 4f20646e..5d35015a 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -16,10 +16,10 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v7 with: python-version: "3.x" @@ -29,7 +29,7 @@ jobs: pip install pre-commit - name: Cache pre-commit - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/.cache/pre-commit key: pre-commit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e390907f..326c5785 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,17 +13,17 @@ jobs: needs: build-for-release runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v8 with: name: gpt-windows path: release/windows - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v8 with: name: gpt-linux path: release/linux - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v8 with: name: manual-pdf path: release/manual @@ -45,7 +45,7 @@ jobs: rm -rf "gpt-${TAG}" - name: Upload to GitHub Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: files: | release/gpt-win-x86_64.zip From 5699e5395f795a693a4a9c15b7158ce4abbcefeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Bregu=C3=AAz?= Date: Fri, 18 Sep 2026 18:39:48 -0300 Subject: [PATCH 11/11] Pin and verify what the CI puts into the release binary The Windows job fetched the ANTLR 2.7.7 tarball over plain http:// and never checked it, although that tarball generates the parser compiled into gpt.exe. The JDK that runs it and the NASM 0.99.05 zip, whose nasm.exe ships inside gpt-win-x86_64.zip, went unchecked too. Each download is now followed by sha256sum -c against a pinned hash, so a mismatch stops the step before extraction; the ANTLR URL uses https://, and every action is pinned to a commit SHA with its tag in a comment for Dependabot. The workflows default to contents: read, and only upload-release-assets gets contents: write. That job now relies on the built-in token: the pinned softprops/action-gh-release reads its token input, which defaults to github.token, before the GITHUB_TOKEN env, so the GH_RELEASE_TOKEN PAT was already being ignored. The cache keys now carry the ANTLR hash and the JDK version, so entries saved on master from unchecked downloads are never restored again. The ANTLR key names the JDK because the cached antlr launcher records the absolute path of the java that configure found, and the jar is compiled by that JDK; a JDK bump must update both keys. The JDK directory goes to $GITHUB_PATH in Windows form from a step without if:, so it also applies on cache hits and no longer rewrites the whole PATH through $GITHUB_ENV. NASM publishes no checksum for 0.99.05, so its hash pins the file as served today rather than a vendor value. The release path with the built-in token has not run yet: the next release is its first test, and the GH_RELEASE_TOKEN secret can be revoked once it succeeds. Closes #26 Co-Authored-By: Antigravity Co-authored-by: Marcelo Jorge Vieira --- .github/workflows/build-on-push.yml | 3 +++ .github/workflows/build.yml | 38 ++++++++++++++++++----------- .github/workflows/pre-commit.yml | 9 ++++--- .github/workflows/release.yml | 16 ++++++------ 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build-on-push.yml b/.github/workflows/build-on-push.yml index 517dabd9..4e94fdf6 100644 --- a/.github/workflows/build-on-push.yml +++ b/.github/workflows/build-on-push.yml @@ -11,6 +11,9 @@ concurrency: group: build-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} cancel-in-progress: true +permissions: + contents: read + jobs: build: uses: ./.github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 82b58914..f7064f37 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,13 +6,16 @@ on: required: true type: string +permissions: + contents: read + jobs: generate-manual-pdf: if: ${{ inputs.target == 'manual-pdf' || inputs.target == 'all' }} runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Install TeX Dependencies run: | @@ -29,7 +32,7 @@ jobs: pdflatex -interaction=nonstopmode -output-directory=doc doc/manual/manual.tex - name: Upload PDF Artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: manual-pdf path: doc/manual.pdf @@ -39,7 +42,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Install Build Dependencies run: | @@ -63,7 +66,7 @@ jobs: mv release/usr/local/* dist/ - name: Upload Linux Artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: gpt-linux path: dist/* @@ -74,10 +77,10 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup MSYS2 Environment - uses: msys2/setup-msys2@v2 + uses: msys2/setup-msys2@ec48f7c5447b3140e2b088413ae3a55687bccb6e # v2.33.0 with: update: true msystem: MINGW64 @@ -98,33 +101,39 @@ jobs: - name: Cache JDK 25 id: cache-jdk - uses: actions/cache@v6 + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: D:\a\gpt\gpt\jdk-25.0.1 - key: jdk-25.0.1-cache + key: jdk-25.0.1-2bbae75b-cache - shell: msys2 {0} name: Install Java JDK 25 if: steps.cache-jdk.outputs.cache-hit != 'true' run: | wget https://download.java.net/java/GA/jdk25.0.1/2fbf10d8c78e40bd87641c434705079d/8/GPL/openjdk-25.0.1_windows-x64_bin.zip + echo "2bbae75bc31a848b7cb5f297270efb7bef9bba0deeec6a671625563dc090ad69 openjdk-25.0.1_windows-x64_bin.zip" | sha256sum -c - unzip openjdk-25.0.1_windows-x64_bin.zip - echo "PATH=$PATH:$(pwd)/jdk-25.0.1/bin" >> $GITHUB_ENV - export PATH=$PATH:$(pwd)/jdk-25.0.1/bin + + - shell: msys2 {0} + name: Configure Java JDK 25 PATH + run: | + cygpath -w "$(pwd)/jdk-25.0.1/bin" >> "$GITHUB_PATH" + export PATH="$(pwd)/jdk-25.0.1/bin:$PATH" java -version - name: Cache ANTLR2 Build id: cache-antlr - uses: actions/cache@v6 + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: D:/a/_temp/msys64/usr/local - key: antlr2.7.7-msys2-static + key: antlr2.7.7-853aeb02-jdk25.0.1-msys2-static - shell: msys2 {0} name: Build ANTLR 2.7.7 (if not cached) if: steps.cache-antlr.outputs.cache-hit != 'true' run: | - wget http://www.antlr2.org/download/antlr-2.7.7.tar.gz + wget https://www.antlr2.org/download/antlr-2.7.7.tar.gz + echo "853aeb021aef7586bda29e74a6b03006bcb565a755c86b66032d8ec31b67dbb9 antlr-2.7.7.tar.gz" | sha256sum -c - tar xvfz antlr-2.7.7.tar.gz cd antlr-2.7.7 @@ -156,6 +165,7 @@ jobs: name: Install NASM run: | wget https://www.nasm.us/pub/nasm/releasebuilds/0.99.05/nasm-0.99.05-win32.zip + echo "cc9d5e2890e230f51db617e414b9a5e6e107d1cd3a80d19018c8a53bde277408 nasm-0.99.05-win32.zip" | sha256sum -c - unzip nasm-0.99.05-win32.zip cp nasm.exe /mingw64/bin/ @@ -178,7 +188,7 @@ jobs: done - name: Upload Windows ZIP Artifact - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: gpt-windows path: dist/* diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 5d35015a..463e20c4 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -10,16 +10,19 @@ concurrency: group: pre-commit-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} cancel-in-progress: true +permissions: + contents: read + jobs: pre-commit: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@v7 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.x" @@ -29,7 +32,7 @@ jobs: pip install pre-commit - name: Cache pre-commit - uses: actions/cache@v6 + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: ~/.cache/pre-commit key: pre-commit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 326c5785..4d21f020 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,9 @@ on: release: types: [created] +permissions: + contents: read + jobs: build-for-release: uses: ./.github/workflows/build.yml @@ -12,18 +15,20 @@ jobs: upload-release-assets: needs: build-for-release runs-on: ubuntu-latest + permissions: + contents: write steps: - - uses: actions/download-artifact@v8 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: gpt-windows path: release/windows - - uses: actions/download-artifact@v8 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: gpt-linux path: release/linux - - uses: actions/download-artifact@v8 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: manual-pdf path: release/manual @@ -45,12 +50,9 @@ jobs: rm -rf "gpt-${TAG}" - name: Upload to GitHub Release - uses: softprops/action-gh-release@v3 + uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3 with: files: | release/gpt-win-x86_64.zip release/gpt-linux-x86_64.tar.gz release/manual/manual.pdf - - env: - GITHUB_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}