diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2026-07-30 07:46:37 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2026-07-30 08:10:47 +0200 |
| commit | 4d064042e8a6ebf874fecbc23f13073f39fa1ebe (patch) | |
| tree | 55cb0fc9d92dd2edd998bb910985de5e3b9ed012 /src/z/js/parser/root.zig | |
| parent | d1776161dcc57b600ce7b18c5e7179757491fbc2 (diff) | |
first version of js parser
Diffstat (limited to 'src/z/js/parser/root.zig')
| -rw-r--r-- | src/z/js/parser/root.zig | 93 |
1 files changed, 93 insertions, 0 deletions
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()); +} |