Skip to content

Commit 9414091

Browse files
committed
added operators != and 'not between'
1 parent d2dceb8 commit 9414091

3 files changed

Lines changed: 23 additions & 4 deletions

File tree

src/client/compiler/lexer/Lexer.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export class Lexer {
4141

4242
tokenTypesToMerge: { first: TokenType, second: TokenType, merged: TokenType }[] = [
4343
{ first: TokenType.keywordNotIn, second: TokenType.keywordIn, merged: TokenType.keywordNotIn },
44+
{ first: TokenType.keywordNot, second: TokenType.keywordBetween, merged: TokenType.keywordNotBetween },
4445
{ first: TokenType.keywordIs, second: TokenType.keywordNot, merged: TokenType.isNot },
4546
{ first: TokenType.isNot, second: TokenType.keywordNull, merged: TokenType.isNotNull },
4647
{ first: TokenType.keywordIs, second: TokenType.keywordNull, merged: TokenType.isNull },
@@ -135,6 +136,17 @@ export class Lexer {
135136

136137
if (specialCharToken != null) {
137138
switch (specialCharToken) {
139+
case TokenType.exclamationMark:
140+
if (this.nextChar == "=") {
141+
this.pushToken(TokenType.notEqual, '!=');
142+
this.next();
143+
this.next();
144+
return;
145+
} else {
146+
this.pushToken(TokenType.exclamationMark, '!');
147+
this.next();
148+
return;
149+
}
138150
case TokenType.leftSquareBracket:
139151
if (this.nextChar == "]") {
140152
this.pushToken(TokenType.leftRightSquareBracket, "[]");

src/client/compiler/lexer/Token.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export enum TokenType {
6060
keywordView,
6161
keywordEnum,
6262
keywordBetween,
63+
keywordNotBetween,
6364

6465
keywordOr,
6566
keywordAnd,
@@ -152,6 +153,8 @@ export enum TokenType {
152153
// Comment
153154
comment,
154155

156+
exclamationMark, // !
157+
155158
endofSourcecode, // will be generated after sourcecode end
156159

157160
// Program statement types:
@@ -235,6 +238,7 @@ export var TokenTypeReadable: {[tt: number]: string} = {
235238
[TokenType.keywordView]: "view",
236239
[TokenType.keywordEnum]: "enum",
237240
[TokenType.keywordBetween]: "between",
241+
[TokenType.keywordNotBetween]: "not between",
238242

239243

240244
[TokenType.keywordAnd]: "and",
@@ -339,6 +343,8 @@ export var specialCharList: {[keyword: string]:TokenType} = {
339343
'{': TokenType.leftCurlyBracket, // {}
340344
'}': TokenType.rightCurlyBracket,
341345

346+
'!': TokenType.exclamationMark, // !
347+
342348
// operators
343349
'.': TokenType.dot, //.
344350
',': TokenType.comma, //.
@@ -442,6 +448,7 @@ export var keywordList: {[keyword: string]:TokenType} = {
442448
"offset": TokenType.keywordOffset,
443449
"in": TokenType.keywordIn,
444450
"not in": TokenType.keywordNotIn,
451+
"not between": TokenType.keywordNotBetween,
445452
"like": TokenType.keywordLike,
446453
"collate": TokenType.keywordCollate,
447454
"default": TokenType.keywordDefault,

src/client/compiler/parser/Parser.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class Parser {
2121

2222
static operatorPrecedence: TokenType[][] = [
2323
[TokenType.keywordOr], [TokenType.keywordAnd],
24-
[TokenType.keywordBetween],
24+
[TokenType.keywordBetween, TokenType.keywordNotBetween],
2525
[TokenType.lower, TokenType.lowerOrEqual, TokenType.greater, TokenType.greaterOrEqual, TokenType.equal, TokenType.notEqual, TokenType.keywordLike],
2626
[TokenType.concatenation, TokenType.plus, TokenType.minus], [TokenType.multiplication, TokenType.division, TokenType.modulo],
2727
[TokenType.keywordIn, TokenType.keywordNotIn]
@@ -2103,8 +2103,8 @@ export class Parser {
21032103

21042104
let first = true;
21052105

2106-
if(this.tt == TokenType.keywordBetween){
2107-
return this.parseBetween(left);
2106+
if(this.tt == TokenType.keywordBetween || this.tt == TokenType.keywordNotBetween){
2107+
return this.parseBetween(left, this.tt);
21082108
}
21092109

21102110
while (first || operators.indexOf(this.tt) >= 0) {
@@ -2137,7 +2137,7 @@ export class Parser {
21372137

21382138
}
21392139

2140-
parseBetween(left: TermNode): TermNode {
2140+
parseBetween(left: TermNode, tt: TokenType.keywordBetween | TokenType.keywordNotBetween): TermNode {
21412141
let position = this.getCurrentPosition();
21422142
this.nextToken(); // skip "between"
21432143
let secondOperand = this.parseTermBinary(2);

0 commit comments

Comments
 (0)