Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
github-actions:
patterns:
- "*"
12 changes: 9 additions & 3 deletions .github/workflows/build-on-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
38 changes: 24 additions & 14 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand All @@ -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
Expand All @@ -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: |
Expand All @@ -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/*
Expand All @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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/

Expand All @@ -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/*
15 changes: 12 additions & 3 deletions .github/workflows/pre-commit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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') }}
Expand Down
16 changes: 9 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ on:
release:
types: [created]

permissions:
contents: read

jobs:
build-for-release:
uses: ./.github/workflows/build.yml
Expand All @@ -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
Expand All @@ -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 }}
4 changes: 4 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -12,3 +15,4 @@ repos:
hooks:
- id: clang-format
files: \.(cpp|cc|cxx|c|h|hpp)$
exclude: ^test/(casos/|erros/|tester\.)
97 changes: 97 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -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.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading
Loading