|
@@ -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();
|