Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 69 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,62 +1,104 @@
# BASIC Compiler (bcomp)
# bcomp

`bcomp` is a compiler for the BASIC programming language that generates LLVM Intermediate Representation (IR). This allows BASIC programs to be compiled and optimized using the LLVM toolchain, enabling high performance and portability.
`bcomp` is a small BASIC compiler written in Rust. It lexes and parses
a subset of pretty BASIC-like syntax, and then uses cranelift to lower it into real assembly.

## Features
## Current Status

- Parses a subset of the BASIC language
- Generates LLVM IR for further compilation or optimization
- Command-line interface for compiling `.bsc` files
- Easily extensible for more BASIC features
Heres what actually work right now if you ran this program:

- BASIC Expressions, which include: identifiers, numbers, strings, chars,
separators, arithmetic operators, and comparison operators
- Statement lists (each line is a statement), `print`, `return`, `end`, and `rem`
- Cranelift object emission for `main` (each file is loaded as a seperate main)
- `print` uses libc calls for strings, chars, and numeric
expressions
- Tiny program CLI that uses `clap`

Not implemented yet:

- Variables and assignment lowering
- Control-flow expressions and keywords like `if`, `goto`, `for`, `next`, and `gosub`
- Floats in any way shape or form
- Multifile linkage (likely never supported)

## Requirements

- Rust (for building the compiler)
- LLVM (for assembling and optimizing IR)
- Rust 2024

## Build

```sh
cargo build
```

## Installation
or

```sh
git clone https://github.com/Hyphen325/bcomp.git
cd bcomp
cargo build --release
```

## Usage

Compile a `.bsc` source file to an object file:

```sh
cargo run -- tests/input/print.bsc
```

By default, `bcomp` writes the object next to the input with an `.o` extension.
Use `-o` to choose an output path:

```sh
./target/release/bcomp input.bsc -o output.ll
cargo run -- tests/input/print.bsc -o print.o
```

- `input.bsc`: Your BASIC source file
- `output.ll`: Generated LLVM IR file
The generated object currently expects libc symbols such as `printf`, so link it
with your platform C compiler:

```sh
cc print.o -o print
```

## Example

Given a BASIC file `hello.bas`:
Input:

```basic
10 PRINT "Hello, world!"
20 END
print "HELLO WORLD";
```

Compile to LLVM IR:
Compile:

```sh
./bcomp hello.bsc -o hello.ll
cargo run -- tests/input/print.bsc -o print.o
cc print.o -o print
./print
```

## Reference
## Development

This project references:
Run the test suite:

- [Lets make a Teeny Tiny compiler](https://austinhenley.com/blog/teenytinycompiler1.html)
```sh
cargo test
```

Run lint checks:

## License
```sh
cargo clippy --all-targets --all-features
```

The crate currently denies warnings and Clippy's `all` and `pedantic` groups, so
small changes may still need a formatting or lint pass before they compile
cleanly.

MIT License
## References

## Contributing
- [Let's make a Teeny Tiny compiler](https://austinhenley.com/blog/teenytinycompiler1.html)
- [Cranelift documentation](https://github.com/bytecodealliance/wasmtime/tree/main/cranelift)

## License

Contributions are welcome! Please open issues or pull requests after reading CONTRIBUTING.md
MIT. See [LICENSE](LICENSE).
Loading