A cursed IGCSE pseudocode interpreter/transpiler
Project description
beancode1
This is a tree-walking interpreter for IGCSE pseudocode, as shown in the 2023-2025 syllabus, written in Python.
IMPORTANT: Some examples using raylib are provided. They were written entirely for fun; in order to run those examples one must install the raylib package for those examples to run, else, you will get an error.
This interpreter is called beancode (aka beancode1. beancode2 does exist, it is a completely different programming language featured in the main branch of this repository. Future references to beancode means the current implementation.)
If youre looking for beancode2, head over to the main branch.
Dependencies
typed-argument-parserpipxif you wish to install it system-wide
Installation
Installing from PyPI (pip)
pipx install beancode(you should have pipx installed)pip install --break-system-packages beancode
since this package does not actually have dependencies, you can pass --break-system-packages safely.
Installing from this repository
- Clone the respository with
git clone https://github.com/ezntek/beancode --branch=py --depth=1 cd beancodepipx install .
Notes on using pip
If you use pip, you may be faced with an error as such:
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try 'pacman -S
python-xyz', where xyz is the package you are trying to
install.
=== snip ===
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
You can either choose to run pip install . --break-system-packages, which is not recommended but is likely to work, or you can run it in a virtual environment.
Either way, it is still recommended to use pipx, as all the hard work is done for you.
Running
note: the extension of the source file does not matter, but I recommend .bean.
If you installed it globally:
beancode file.bean
If you wish to run it in the project directory:
python -m beancode file.bean
extra features™
There are many extra features, which are not standard to IGCSE Pseudocode.
- Lowercase keywords are supported; but cases may not be mixed. All library routines are fully case-insensitive.
- Includes can be done with
include "file.bean", relative to the file.
- Mark a declaration, constant, procedure, or function as exportable with
EXPORT, likeEXPORT DECLARE X:INTEGER. - Symbols marked as export will be present in whichever scope the include was called.
-
You can declare a manual scope with:
SCOPE OUTPUT "Hallo, Welt." ENDSCOPEExporting form a custom scope also works:
SCOPE EXPORT CONSTANT Age <- 5 ENDSCOPE OUTPUT Age -
There are many custom library routines:
FUNCTION GETCHAR() RETURNS CHARPROCEDURE PUTCHAR(ch: CHAR)PROCEDURE EXIT(code: INTEGER)
- Type casting is supported:
Any Type -> STRINGSTRING -> INTEGER(returnsnullon failure)STRING -> REAL(returnsnullon failure)INTEGER -> REALREAL -> INTEGERINTEGER -> BOOLEAN(0is false,1is true)BOOLEAN -> INTEGER
- Declaration and assignment on the same line is also supported:
DECLARE Num:INTEGER <- 5
- You can also declare variables without types and directly assign them:
DECLARE Num <- 5
- Array literals are supported:
Arr <- {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- Get the type of any value as a string with
TYPE(value)orTYPEOF(value) - You can directly assign variables without declaring its type through type inference:
X <- 5 OUTPUT X // works
quirks
- Multiple statements in CASE OFs are not supported! Therefore, the following code is illegal:
Please put your code into a procedure instead.CASE OF Var CASE 'a': OUTPUT "foo" OUTPUT "bar" ENDCASE - File IO is completely unsupported. You might get cryptic errors if you try.
- Not more than 1 parse error can be reported at one time.
- Lowercase keywords are supported.
Appendix
This turned out to be a very cursed non-optimizing super-cursed super-cursed-pro-max-plus-ultra IGCSE pseudocode tree-walk interpreter written in the best language, Python.
(I definitely do not have 30,000 C projects and I definitely do not advocate for C and the burning of Python at the stake for projects such as this).
It's slow, it's horrible, it's hacky, but it works :) and if it ain't broke, don't fix it.
This is my foray into compiler engineering; through this project I have finally learned how to perform recursive-descent parsing. I will most likely adapt this into C/Rust (maybe not C++) and play with a bytecode VM sooner or later (with a different language, because Python is slow and does not have null safety in 2025).
WARNING: This is NOT my best work. please do NOT assume my programming ability to be this, and do NOT use this project as a reference for yours. The layout is horrible. The code style is horrible. The code is not idiomatic. I went through 607,587,384 hacks and counting just for this project to work.
</rant>
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file beancode-0.1.1.tar.gz.
File metadata
- Download URL: beancode-0.1.1.tar.gz
- Upload date:
- Size: 35.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.2 CPython/3.13.5 Linux/6.16.0-5-cachyos
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b1ac639158e97bf35456776602371afbb4e76ced55379be193d919a1f481847
|
|
| MD5 |
b3af0d7ad47edefd3c0d2775b4ec84dc
|
|
| BLAKE2b-256 |
4ea4d0188bad532ac6be7564af6a853bd5bbb046d5f7decee6d6f069e48ec418
|
File details
Details for the file beancode-0.1.1-py3-none-any.whl.
File metadata
- Download URL: beancode-0.1.1-py3-none-any.whl
- Upload date:
- Size: 36.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.2 CPython/3.13.5 Linux/6.16.0-5-cachyos
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6783027154b454bdb87d948454f351772bf6f626e07cf76839e19ea31a97431
|
|
| MD5 |
dfc1341c918c8c97eb2e2a3a3f6983a9
|
|
| BLAKE2b-256 |
72d3546604db004c29f039b9bc9b68a36134e17d1cdae3ff07b50a13c2c07786
|