Quellcode durchsuchen

Refactor

master
Dylan Baker vor 4 Jahren
Ursprung
Commit
17102fd991
2 geänderte Dateien mit 19 neuen und 31 gelöschten Zeilen
  1. 1
    0
      src/ast.ts
  2. 18
    31
      src/parser.ts

+ 1
- 0
src/ast.ts Datei anzeigen

15
 export type Primary = _Number | Identifier | Backtick | Alias;
15
 export type Primary = _Number | Identifier | Backtick | Alias;
16
 export type Statement = SelectStatement;
16
 export type Statement = SelectStatement;
17
 export type Expr = Primary | Binary;
17
 export type Expr = Primary | Binary;
18
+export type SelectArgument = Expr;
18
 export type FromTarget = Identifier | Backtick | Alias;
19
 export type FromTarget = Identifier | Backtick | Alias;

+ 18
- 31
src/parser.ts Datei anzeigen

39
 
39
 
40
   private select(): AST.Statement | Error {
40
   private select(): AST.Statement | Error {
41
     this.eat(TokenKind.SELECT);
41
     this.eat(TokenKind.SELECT);
42
-    const args = this.args();
42
+    const args = this.selectArguments();
43
     if (isError(args)) {
43
     if (isError(args)) {
44
       return args;
44
       return args;
45
     }
45
     }
61
     });
61
     });
62
   }
62
   }
63
 
63
 
64
-  private args(): AST.Expr[] | Error {
64
+  private selectArguments(): AST.SelectArgument[] | Error {
65
     const args = [];
65
     const args = [];
66
 
66
 
67
     while (true) {
67
     while (true) {
88
   }
88
   }
89
 
89
 
90
   private fromTarget(): AST.FromTarget | Error {
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
     this.eat(TokenKind.AS);
96
     this.eat(TokenKind.AS);
122
 
97
 
123
     const token = this.currentToken();
98
     const token = this.currentToken();
131
       return alias;
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
   private where(): AST.Expr | Error {
112
   private where(): AST.Expr | Error {
355
     return primary;
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
   private backtick(): AST.Backtick | Error {
345
   private backtick(): AST.Backtick | Error {
359
     this.eat(TokenKind.BACKTICK);
346
     this.eat(TokenKind.BACKTICK);
360
     const identifier = this.identifier();
347
     const identifier = this.identifier();

Laden…
Abbrechen
Speichern