Dylan Baker 4 роки тому
джерело
коміт
82b5315379
3 змінених файлів з 67 додано та 6 видалено
  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 Переглянути файл

1
 import * as AST from "../ast";
1
 import * as AST from "../ast";
2
 
2
 
3
 export enum BinaryExpressionTypes {
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
 interface IBinaryOptions {
13
 interface IBinaryOptions {

+ 45
- 1
src/parser.ts Переглянути файл

92
   }
92
   }
93
 
93
 
94
   private expr(): AST.Expr | Error {
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
   private equality(): AST.Expr | Error {
142
   private equality(): AST.Expr | Error {

+ 15
- 0
test/parser.test.ts Переглянути файл

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
 });

Завантаження…
Відмінити
Зберегти