zua icon indicating copy to clipboard operation
zua copied to clipboard

An implementation of Lua 5.1 in Zig, for learning purposes

Zua

An attempt at a Lua 5.1 implementation in Zig.

Goals, in order of priority:

  1. Learn more about Lua internals
  2. Learn more about Zig
  3. Anything else

Status

  • [ ] Lexer (llex.c/.h) -> lex.zig
    • [x] Keywords
    • [x] Identifiers
    • [x] .., ...
    • [x] ==, >=, <=, ~=
    • [x] String literals (single/double quoted and multi-line ([[))
    • [x] Comments (-- and --[[)
    • [x] Numbers
    • [x] Improve tests, perhaps use fuzz testing
    • [ ] Cleanup implementation
  • [x] String parsing (in Lua this was done at lex-time) -> parse_literal.zig (see 4324bd0 for more details)
  • [ ] Number parsing (in Lua this was done at lex-time) -> parse_literal.zig
    • [x] Basic number parsing
    • [ ] Proper strtod-compatible number parsing implementation
  • [ ] Parser (lparser.c/.h) (in Lua this was done as one step with no AST intermediate)
    • [x] Parsing tokens into an AST -> parse.zig (mostly done, needs some more testing/cleanup)
    • [ ] Compiling the AST into bytecode -> compiler.zig
  • [ ] ...

Why Lua 5.1?

It's what I'm most familiar with, and I'm also assuming that 5.1 is simpler internally than more recent Lua versions.

Building / running

  • zig build to build zua.exe
  • zig build test to build & run the main test suite
  • zig build run to build & run zua.exe (does nothing right now)
  • zig build lua51_tests to run tests on the PUC Lua 5.1 test files (currently it just tests parsing them)
  • zig build fuzzed_lex to run lexer tests on a large set of inputs/outputs generated by fuzzing-lua
  • zig build bench_lex to run a benchmark of the lexer (this benchmark needs improvement)
  • zig build fuzzed_strings to run string parsing tests on a set of inputs/outputs generated by fuzzing-lua