aboutsummaryrefslogtreecommitdiff
path: root/src/z/js/parser/root.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2026-07-30 07:46:37 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2026-07-30 08:10:47 +0200
commit4d064042e8a6ebf874fecbc23f13073f39fa1ebe (patch)
tree55cb0fc9d92dd2edd998bb910985de5e3b9ed012 /src/z/js/parser/root.zig
parentd1776161dcc57b600ce7b18c5e7179757491fbc2 (diff)
first version of js parser
Diffstat (limited to 'src/z/js/parser/root.zig')
-rw-r--r--src/z/js/parser/root.zig93
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());
+}