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: + - "*" diff --git a/.github/workflows/build-on-push.yml b/.github/workflows/build-on-push.yml index 8388cbea..4e94fdf6 100644 --- a/.github/workflows/build-on-push.yml +++ b/.github/workflows/build-on-push.yml @@ -3,10 +3,16 @@ 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 + +permissions: + contents: read jobs: build: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 94570a9b..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@v4 + 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@v4 + 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@v4 + 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@v4 + 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@v4 + 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@v3 + 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@v3 + 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@v4 + 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 5ffd9a2f..463e20c4 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -2,18 +2,27 @@ 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 + +permissions: + contents: read + jobs: pre-commit: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.x" @@ -23,7 +32,7 @@ jobs: pip install pre-commit - name: Cache pre-commit - uses: actions/cache@v4 + 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 e390907f..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@v4 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: gpt-windows path: release/windows - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: gpt-linux path: release/linux - - uses: actions/download-artifact@v4 + - 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@v2 + 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 }} 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 new file mode 100644 index 00000000..1ac11e63 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,97 @@ +# 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/`: `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. + +## 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 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: + +```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/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 + 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. 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 new file mode 100644 index 00000000..d2ce2986 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,112 @@ +# 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 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 + +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/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: + +```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. 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/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/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. 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/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" 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/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/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); } 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 00000000..ea74fb6f Binary files /dev/null and b/test/casos/arrays.saida differ 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..4c104223 100755 --- a/test/run_test.sh +++ b/test/run_test.sh @@ -1,113 +1,312 @@ #!/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 +case "$ARCH" in +i?86 | x86_64 | amd64) CAN_EXEC_X86=1 -fi + ;; +esac -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 "" + +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 [ $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" + fi + fi + + # 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 a compilação nativa (-o)" +echo "tester.gpt" 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" +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_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 "✗ Execução FALHOU (esperado: 42)" - FAILURES=$((FAILURES + 1)) + fail "tester.gpt (-s): montagem com NASM falhou" + head -5 "$TMP/tester.nasm" fi else - echo "⚠ Pulando execução (arquitetura $ARCH, binário x86)" + echo "⚠ tester.gpt (-s): montagem pulada (NASM não encontrado)" fi - rm -f tester_bin else - echo "✗ Compilação FALHOU" - FAILURES=$((FAILURES + 1)) + fail "tester.gpt (-s): geração de assembly" fi echo "" echo "========================================" -echo "Testando geração de assembly (-s)" +echo "Casos de regressão (test/casos)" 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 - 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 - else - echo "⚠ NASM falhou ao montar (pode ser normal em ARM)" - 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 - echo "⚠ NASM não encontrado" + ok "$name" fi - rm -f tester.asm -else - echo "✗ Geração de assembly FALHOU" - FAILURES=$((FAILURES + 1)) -fi +done +cd "$SCRIPT_DIR" || exit 1 echo "" echo "========================================" -echo "Testando tradução para C (-t)" +echo "Recusas (código de saída 1)" 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 +# 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 - echo "⚠ Tradução para C não implementada (ANTLR4 migration pending)" + 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 "========================================" +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