about summary refs log tree commit diff
path: root/src/parser.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.zig')
-rw-r--r--src/parser.zig13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/parser.zig b/src/parser.zig
index 6e07491..510726f 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -99,6 +99,7 @@ pub const Node = union(enum) {
 
 pub const EqualityExpressionType = enum {
     EQ,
+    NE,
     GE,
     LE,
     LT,
@@ -409,7 +410,7 @@ pub const Parser = struct {
             return ParserError.ParsingError;
     }
 
-    // EqualityExpression ::= AdditiveExpression ("==" | "<=" | ">=" | "<" | ">") AdditiveExpression
+    // EqualityExpression ::= AdditiveExpression ("==" | "!=" | "<=" | ">=" | "<" | ">") AdditiveExpression
     fn parse_equality_expression(self: *Parser) ParserError!*Node {
         errdefer if (!self.try_context) std.debug.print("Error parsing equality expression {any}\n", .{self.peek_token()});
 
@@ -429,6 +430,16 @@ pub const Parser = struct {
             typ = .EQ;
         } else if (self.accept_parse(struct {
             fn parse(iself: *Parser) ParserError!*Node {
+                _ = try iself.parse_token(tokenizer.TokenType.BANG);
+                _ = try iself.parse_token(tokenizer.TokenType.EQUALS);
+                return try iself.create_node(.{ .PROGRAM = .{
+                    .statements = &[_]*Node{},
+                } });
+            }
+        }.parse) != null) {
+            typ = .NE;
+        } else if (self.accept_parse(struct {
+            fn parse(iself: *Parser) ParserError!*Node {
                 _ = try iself.parse_token(tokenizer.TokenType.LESS);
                 _ = try iself.parse_token(tokenizer.TokenType.EQUALS);
                 return try iself.create_node(.{ .PROGRAM = .{