Browse Source

Parse AND and OR

master
Dylan Baker 4 years ago
parent
commit
82b5315379
3 changed files with 67 additions and 6 deletions
  1. 7
    5
      src/ast/binary.ts
  2. 45
    1
      src/parser.ts
  3. 15
    0
      test/parser.test.ts

+ 7
- 5
src/ast/binary.ts View File

@@ -1,11 +1,13 @@
1 1
 import * as AST from "../ast";
2 2
 
3 3
 export enum BinaryExpressionTypes {
4
-  ADDITION,
5
-  SUBTRACTION,
6
-  MULTIPLICATION,
7
-  DIVISION,
8
-  EQUALITY,
4
+  ADDITION = "ADDITION",
5
+  AND = "AND",
6
+  DIVISION = "DIVISION",
7
+  EQUALITY = "EQUALITY",
8
+  MULTIPLICATION = "MULTIPLICATION",
9
+  OR = "OR",
10
+  SUBTRACTION = "SUBTRACTION",
9 11
 }
10 12
 
11 13
 interface IBinaryOptions {

+ 45
- 1
src/parser.ts View File

@@ -92,7 +92,51 @@ export default class Parser {
92 92
   }
93 93
 
94 94
   private expr(): AST.Expr | Error {
95
-    return this.equality();
95
+    return this.or();
96
+  }
97
+
98
+  private or(): AST.Expr | Error {
99
+    const left = this.and();
100
+    if (isError(left)) {
101
+      return left;
102
+    }
103
+
104
+    if (this.match(TokenKind.OR)) {
105
+      this.eat(TokenKind.OR);
106
+      const right = this.and();
107
+      if (isError(right)) {
108
+        return right;
109
+      }
110
+      return new AST.Binary({
111
+        left,
112
+        right,
113
+        type: AST.BinaryExpressionTypes.OR,
114
+      });
115
+    }
116
+
117
+    return left;
118
+  }
119
+
120
+  private and(): AST.Expr | Error {
121
+    const left = this.equality();
122
+    if (isError(left)) {
123
+      return left;
124
+    }
125
+
126
+    if (this.match(TokenKind.AND)) {
127
+      this.eat(TokenKind.AND);
128
+      const right = this.equality();
129
+      if (isError(right)) {
130
+        return right;
131
+      }
132
+      return new AST.Binary({
133
+        left,
134
+        right,
135
+        type: AST.BinaryExpressionTypes.AND,
136
+      });
137
+    }
138
+
139
+    return left;
96 140
   }
97 141
 
98 142
   private equality(): AST.Expr | Error {

+ 15
- 0
test/parser.test.ts View File

@@ -207,4 +207,19 @@ describe("Parser", () => {
207 207
       }),
208 208
     ]);
209 209
   });
210
+
211
+  it("should parse a where with a boolean expression", () => {
212
+    const tree = parse("select a from b where c and d");
213
+    expect(tree).to.deep.equal([
214
+      new AST.SelectStatement({
215
+        arguments: [new AST.Identifier("a")],
216
+        from: new AST.Identifier("b"),
217
+        where: new AST.Binary({
218
+          left: new AST.Identifier("c"),
219
+          right: new AST.Identifier("d"),
220
+          type: AST.BinaryExpressionTypes.AND,
221
+        }),
222
+      }),
223
+    ]);
224
+  });
210 225
 });

Loading…
Cancel
Save