Commit aabf7cf57e

Jimmi Holst Christensen <jimmiholstchristensen@gmail.com>
2018-03-31 22:10:49
std.zig.parser now parses null and bool literals
1 parent 975dc5a
Changed files (2)
std/zig/ast.zig
@@ -22,6 +22,8 @@ pub const Node = struct {
         StringLiteral,
         MultilineStringLiteral,
         CharLiteral,
+        BoolLiteral,
+        NullLiteral,
         UndefinedLiteral,
         BuiltinCall,
         Call,
@@ -44,6 +46,8 @@ pub const Node = struct {
             Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).iterate(index),
             Id.MultilineStringLiteral => @fieldParentPtr(NodeMultilineStringLiteral, "base", base).iterate(index),
             Id.CharLiteral => @fieldParentPtr(NodeCharLiteral, "base", base).iterate(index),
+            Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).iterate(index),
+            Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).iterate(index),
             Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).iterate(index),
             Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
             Id.Call => @fieldParentPtr(NodeCall, "base", base).iterate(index),
@@ -67,6 +71,8 @@ pub const Node = struct {
             Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).firstToken(),
             Id.MultilineStringLiteral => @fieldParentPtr(NodeMultilineStringLiteral, "base", base).firstToken(),
             Id.CharLiteral => @fieldParentPtr(NodeCharLiteral, "base", base).firstToken(),
+            Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).firstToken(),
+            Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).firstToken(),
             Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).firstToken(),
             Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(),
             Id.Call => @fieldParentPtr(NodeCall, "base", base).firstToken(),
@@ -90,6 +96,8 @@ pub const Node = struct {
             Id.StringLiteral => @fieldParentPtr(NodeStringLiteral, "base", base).lastToken(),
             Id.MultilineStringLiteral => @fieldParentPtr(NodeMultilineStringLiteral, "base", base).lastToken(),
             Id.CharLiteral => @fieldParentPtr(NodeCharLiteral, "base", base).lastToken(),
+            Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).lastToken(),
+            Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).lastToken(),
             Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).lastToken(),
             Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(),
             Id.Call => @fieldParentPtr(NodeCall, "base", base).lastToken(),
@@ -629,6 +637,40 @@ pub const NodeCharLiteral = struct {
     }
 };
 
+pub const NodeBoolLiteral = struct {
+    base: Node,
+    token: Token,
+
+    pub fn iterate(self: &NodeBoolLiteral, index: usize) ?&Node {
+        return null;
+    }
+
+    pub fn firstToken(self: &NodeBoolLiteral) Token {
+        return self.token;
+    }
+
+    pub fn lastToken(self: &NodeBoolLiteral) Token {
+        return self.token;
+    }
+};
+
+pub const NodeNullLiteral = struct {
+    base: Node,
+    token: Token,
+
+    pub fn iterate(self: &NodeNullLiteral, index: usize) ?&Node {
+        return null;
+    }
+
+    pub fn firstToken(self: &NodeNullLiteral) Token {
+        return self.token;
+    }
+
+    pub fn lastToken(self: &NodeNullLiteral) Token {
+        return self.token;
+    }
+};
+
 pub const NodeUndefinedLiteral = struct {
     base: Node,
     token: Token,
std/zig/parser.zig
@@ -427,6 +427,30 @@ pub const Parser = struct {
                             try stack.append(State.AfterOperand);
                             continue;
                         },
+                        Token.Id.Keyword_true, Token.Id.Keyword_false => {
+                            const node = try arena.create(ast.NodeBoolLiteral);
+                            *node = ast.NodeBoolLiteral {
+                                .base = self.initNode(ast.Node.Id.BoolLiteral),
+                                .token = token,
+                            };
+                            try stack.append(State {
+                                .Operand = &node.base
+                            });
+                            try stack.append(State.AfterOperand);
+                            continue;
+                        },
+                        Token.Id.Keyword_null => {
+                            const node = try arena.create(ast.NodeNullLiteral);
+                            *node = ast.NodeNullLiteral {
+                                .base = self.initNode(ast.Node.Id.NullLiteral),
+                                .token = token,
+                            };
+                            try stack.append(State {
+                                .Operand = &node.base
+                            });
+                            try stack.append(State.AfterOperand);
+                            continue;
+                        },
                         Token.Id.Builtin => {
                             const node = try arena.create(ast.NodeBuiltinCall);
                             *node = ast.NodeBuiltinCall {
@@ -1467,6 +1491,14 @@ pub const Parser = struct {
                         const char_literal = @fieldParentPtr(ast.NodeCharLiteral, "base", base);
                         try stream.print("{}", self.tokenizer.getTokenSlice(char_literal.token));
                     },
+                    ast.Node.Id.BoolLiteral => {
+                        const bool_literal = @fieldParentPtr(ast.NodeCharLiteral, "base", base);
+                        try stream.print("{}", self.tokenizer.getTokenSlice(bool_literal.token));
+                    },
+                    ast.Node.Id.NullLiteral => {
+                        const null_literal = @fieldParentPtr(ast.NodeNullLiteral, "base", base);
+                        try stream.print("{}", self.tokenizer.getTokenSlice(null_literal.token));
+                    },
                     ast.Node.Id.MultilineStringLiteral => {
                         const multiline_str_literal = @fieldParentPtr(ast.NodeMultilineStringLiteral, "base", base);
                         try stream.print("\n");