Browse Source

Refactor

master
Dylan Baker 4 years ago
parent
commit
17102fd991
2 changed files with 19 additions and 31 deletions
  1. 1
    0
      src/ast.ts
  2. 18
    31
      src/parser.ts

+ 1
- 0
src/ast.ts View File

@@ -15,4 +15,5 @@ export * from "./ast/selectStatement";
15 15
 export type Primary = _Number | Identifier | Backtick | Alias;
16 16
 export type Statement = SelectStatement;
17 17
 export type Expr = Primary | Binary;
18
+export type SelectArgument = Expr;
18 19
 export type FromTarget = Identifier | Backtick | Alias;

+ 18
- 31
src/parser.ts View File

@@ -39,7 +39,7 @@ export default class Parser {
39 39
 
40 40
   private select(): AST.Statement | Error {
41 41
     this.eat(TokenKind.SELECT);
42
-    const args = this.args();
42
+    const args = this.selectArguments();
43 43
     if (isError(args)) {
44 44
       return args;
45 45
     }
@@ -61,7 +61,7 @@ export default class Parser {
61 61
     });
62 62
   }
63 63
 
64
-  private args(): AST.Expr[] | Error {
64
+  private selectArguments(): AST.SelectArgument[] | Error {
65 65
     const args = [];
66 66
 
67 67
     while (true) {
@@ -88,36 +88,11 @@ export default class Parser {
88 88
   }
89 89
 
90 90
   private fromTarget(): AST.FromTarget | Error {
91
-    const token = this.currentToken();
92
-    switch (token.kind) {
93
-      case TokenKind.BACKTICK:
94
-        const backtick = this.backtick();
95
-        if (isError(backtick)) {
96
-          return backtick;
97
-        }
98
-
99
-        if (this.match(TokenKind.AS)) {
100
-          return this.fromTargetAlias(backtick);
101
-        }
102
-
103
-        return backtick;
104
-      case TokenKind.IDENTIFIER:
105
-        const identifier = this.identifier();
106
-        if (isError(identifier)) {
107
-          return identifier;
108
-        }
109
-
110
-        if (this.match(TokenKind.AS)) {
111
-          return this.fromTargetAlias(identifier);
112
-        }
113
-
114
-        return identifier;
91
+    const primary = this.backtickOrIdentifier();
92
+    if (!this.match(TokenKind.AS) || isError(primary)) {
93
+      return primary;
115 94
     }
116 95
 
117
-    return new Error(`Unexpected token: ${token.repr()}`, token.line);
118
-  }
119
-
120
-  private fromTargetAlias(obj: AST.Identifier | AST.Backtick): AST.Alias | Error {
121 96
     this.eat(TokenKind.AS);
122 97
 
123 98
     const token = this.currentToken();
@@ -131,7 +106,7 @@ export default class Parser {
131 106
       return alias;
132 107
     }
133 108
 
134
-    return new AST.Alias(obj, alias);
109
+    return new AST.Alias(primary, alias);
135 110
   }
136 111
 
137 112
   private where(): AST.Expr | Error {
@@ -355,6 +330,18 @@ export default class Parser {
355 330
     return primary;
356 331
   }
357 332
 
333
+  private backtickOrIdentifier(): AST.Backtick | AST.Identifier | Error {
334
+    const token = this.currentToken();
335
+    switch (token.kind) {
336
+      case TokenKind.BACKTICK:
337
+        return this.backtick();
338
+      case TokenKind.IDENTIFIER:
339
+        return this.identifier();
340
+      default:
341
+        return new Error(`Unexpected token: ${token.repr()}`, token.line);
342
+    }
343
+  }
344
+
358 345
   private backtick(): AST.Backtick | Error {
359 346
     this.eat(TokenKind.BACKTICK);
360 347
     const identifier = this.identifier();

Loading…
Cancel
Save