From 4d064042e8a6ebf874fecbc23f13073f39fa1ebe Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 30 Jul 2026 07:46:37 +0200 Subject: first version of js parser --- src/z/js/parser/root.zig | 93 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/z/js/parser/root.zig (limited to 'src/z/js/parser/root.zig') diff --git a/src/z/js/parser/root.zig b/src/z/js/parser/root.zig new file mode 100644 index 0000000..6d41c7b --- /dev/null +++ b/src/z/js/parser/root.zig @@ -0,0 +1,93 @@ +const std = @import("std"); + +pub const lexical_grammar = @import("lexical_grammar.zig"); +pub const ast = @import("ast.zig"); +pub const syntactic_grammar = @import("syntactic_grammar.zig"); +pub const Result = @import("result.zig").Result; +pub const Parser = @import("parser.zig").Parser; + +test "simple literal" { + const source = "42;"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); + try std.testing.expect(result.body[0].data == .expr); +} + +test "variable declaration" { + const source = "var x = 1;"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); + try std.testing.expect(result.body[0].data == .variable); +} + +test "function declaration" { + const source = "function foo() { return 1; }"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); + try std.testing.expect(result.body[0].data == .function); +} + +test "if statement" { + const source = "if (x > 0) { x = 1; } else { x = 2; }"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); + try std.testing.expect(result.body[0].data == .@"if"); +} + +test "binary expression" { + const source = "a + b * c;"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test "arrow function" { + const source = "const f = (x) => x + 1;"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test "object literal" { + const source = "var obj = { a: 1, b: 2 };"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test "class declaration" { + const source = "class Foo { constructor() { } }"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test "for loop" { + const source = "for (var i = 0; i < 10; i++) { break; }"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test "try catch" { + const source = "try { x; } catch (e) { y; }"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test "multiple statements" { + const source = "var a = 1; var b = 2; var c = a + b;"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 3); +} + +test "array literal with spread" { + const source = "var arr = [1, ...rest, 3];"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test "template literal" { + const source = "const s = `hello ${name} world`;"; + const result = try syntactic_grammar.parse(source); + try std.testing.expect(result.body.len == 1); +} + +test { + _ = std.testing.refAllDecls(@This()); +} -- cgit v1.2.3-70-g09d2