Git Product home page Git Product logo

parser-toolkit's Introduction

A parser toolkit

Project Logo

This repo contains a tiny parser toolkit that can be used to build new parsers and programming languages.

It provides:

  • Configurable tokenizer
  • Parser core (accept functions with state restoration)
  • Compiler error management (emission, rendering, source locations)

Demo

Invoke zig build run to run a tiny command line calculator that can evaluate basic expressions, parens and invoke functions:

$ zig build run
? 10
= 10
? 10 + 10
= 20
? 5 * 3
= 15
? a = 10
= 10
? sqrt(a)
= 3.1622776601683795
? sin(3.14)
= 0.0015926529164868282
? a = a + 1
= 11
? a = a + 1
= 12
? ^D

Available functions are:

fn sin(v: f64) f64
fn cos(v: f64) f64
fn tan(v: f64) f64
fn sqrt(v: f64) f64
fn pow(a: f64, b: f64) f64
fn ln(v: f64) f64
fn ln10(v: f64) f64
fn ln2(v: f64) f64
fn log(b: f64, v: f64) f64

parser-toolkit's People

Contributors

der-teufel-programming avatar dweiller avatar hqnna avatar ikskuh avatar linusg avatar thechampagne avatar theoparis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

parser-toolkit's Issues

How should I use this as a zon module?

Here's what I got:

build.zig.zon:

.{
    .name = "project-name",
    .version = "0.0.0",
    .dependencies = .{
        .ptk = .{
            .url = "https://github.com/MasterQ32/parser-toolkit/archive/7e7188bfaa46d0ba36d1ef31c1f368d264aa6876.tar.gz",
            .hash = "12202ae562efbd6a4f12f1b10c5237329d19d1be15eec7fa1b0b02f5658500bfcbfd",
        },
    },
}

build.zig:

const std = @import("std");

// Although this function looks imperative, note that its job is to declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void {
    // Standard target options allows the person running `zig build` to choose
    // what target to build for. Here we do not override the defaults, which
    // means any target is allowed, and the default is native. Other options
    // for restricting supported target set are available.
    const target = b.standardTargetOptions(.{});

    // Standard optimization options allow the person running `zig build` to select
    // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
    // set a preferred release mode, allowing the user to decide how to optimize.
    const optimize = b.standardOptimizeOption(.{});

    const exe = b.addExecutable(.{
        .name = "yula",
        // In this case the main source file is merely a path, however, in more
        // complicated build scripts, this could be a generated file.
        .root_source_file = .{ .path = "src/main.zig" },
        .target = target,
        .optimize = optimize,
    });

    const ptk = b.dependency("ptk", .{
        .target = target,
        .optimize = optimize,
    });
    exe.addModule("ptk", ptk.module("parser-toolkit"));

    // const pcre = b.dependency("pcre", .{
    //     .target = target,
    //     .optimize = optimize,
    // });
    // exe.addModule("pcre", pcre.)

    // This declares intent for the executable to be installed into the
    // standard location when the user invokes the "install" step (the default
    // step when running `zig build`).
    b.installArtifact(exe);

    // This *creates* a Run step in the build graph, to be executed when another
    // step is evaluated that depends on it. The next line below will establish
    // such a dependency.
    const run_cmd = b.addRunArtifact(exe);

    // By making the run step depend on the install step, it will be run from the
    // installation directory rather than directly from within the cache directory.
    // This is not necessary, however, if the application depends on other installed
    // files, this ensures they will be present and in the expected location.
    run_cmd.step.dependOn(b.getInstallStep());

    // This allows the user to pass arguments to the application in the build
    // command itself, like this: `zig build run -- arg1 arg2 etc`
    if (b.args) |args| {
        run_cmd.addArgs(args);
    }

    // This creates a build step. It will be visible in the `zig build --help` menu,
    // and can be selected like this: `zig build run`
    // This will evaluate the `run` step rather than the default, which is "install".
    const run_step = b.step("run", "Run the app");
    run_step.dependOn(&run_cmd.step);

    // Creates a step for unit testing. This only builds the test executable
    // but does not run it.
    const unit_tests = b.addTest(.{
        .root_source_file = .{ .path = "src/main.zig" },
        .target = target,
        .optimize = optimize,
    });

    const run_unit_tests = b.addRunArtifact(unit_tests);

    // Similar to creating the run step earlier, this exposes a `test` step to
    // the `zig build --help` menu, providing a way for the user to request
    // running the unit tests.
    const test_step = b.step("test", "Run unit tests");
    test_step.dependOn(&run_unit_tests.step);
}

However I got this:

error: Invalid option: -Dcpu
error: Invalid option: -Dtarget
/home/lyh/.zvm/0.11.0/lib/std/Build.zig:1572:35: 0x333779 in dependency__anon_13361 (build)
            return dependencyInner(b, name, build_root, build_zig, args);
                                  ^
/home/lyh/Documents/CS/compiler/yula/yula/build.zig:26:29: 0x2ee88c in build (build)
    const ptk = b.dependency("ptk", .{
                            ^
/home/lyh/.zvm/0.11.0/lib/std/Build.zig:1638:33: 0x2dd803 in runBuild__anon_7159 (build)
        .Void => build_zig.build(b),
                                ^
/home/lyh/.zvm/0.11.0/lib/build_runner.zig:297:29: 0x2d95d2 in main (build)
        try builder.runBuild(root);
                            ^
/home/lyh/.zvm/0.11.0/lib/std/start.zig:574:37: 0x2c4ede in posixCallMainAndExit (build)
            const result = root.main() catch |err| {
                                    ^
/home/lyh/.zvm/0.11.0/lib/std/start.zig:243:5: 0x2c49c1 in _start (build)
    asm volatile (switch (native_arch) {
    ^
???:?:?: 0x5 in ??? (???)
Unwind information for `???:0x5` was not available, trace may be incomplete

All your codebase are belong to us.
Run `zig build test` to run the tests.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.