aboutsummaryrefslogtreecommitdiff
path: root/src/z/js/parser/root.zig
diff options
context:
space:
mode:
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());
+}