@auscope/angular2parse 21.0.0 → 22.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -18
- package/fesm2022/auscope-angular2parse.mjs +2047 -0
- package/fesm2022/auscope-angular2parse.mjs.map +1 -0
- package/package.json +34 -41
- package/types/auscope-angular2parse.d.ts +32 -0
- package/.editorconfig +0 -13
- package/LICENSE +0 -21
- package/angular.json +0 -56
- package/projects/angular2parse/README.md +0 -49
- package/projects/angular2parse/ng-package.json +0 -7
- package/projects/angular2parse/package.json +0 -19
- package/projects/angular2parse/src/lib/angular/compiler/assertions.d.ts +0 -10
- package/projects/angular2parse/src/lib/angular/compiler/assertions.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/assertions.js +0 -45
- package/projects/angular2parse/src/lib/angular/compiler/assertions.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/assertions.ts +0 -49
- package/projects/angular2parse/src/lib/angular/compiler/ast.d.ts +0 -243
- package/projects/angular2parse/src/lib/angular/compiler/ast.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/ast.js +0 -393
- package/projects/angular2parse/src/lib/angular/compiler/ast.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/ast.ts +0 -393
- package/projects/angular2parse/src/lib/angular/compiler/chars.d.ts +0 -70
- package/projects/angular2parse/src/lib/angular/compiler/chars.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/chars.js +0 -78
- package/projects/angular2parse/src/lib/angular/compiler/chars.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/chars.ts +0 -89
- package/projects/angular2parse/src/lib/angular/compiler/interpolation-config.d.ts +0 -15
- package/projects/angular2parse/src/lib/angular/compiler/interpolation-config.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/interpolation-config.js +0 -24
- package/projects/angular2parse/src/lib/angular/compiler/interpolation-config.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/interpolation-config.ts +0 -25
- package/projects/angular2parse/src/lib/angular/compiler/lexer.d.ts +0 -45
- package/projects/angular2parse/src/lib/angular/compiler/lexer.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/lexer.js +0 -344
- package/projects/angular2parse/src/lib/angular/compiler/lexer.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/lexer.ts +0 -383
- package/projects/angular2parse/src/lib/angular/compiler/parser.d.ts +0 -93
- package/projects/angular2parse/src/lib/angular/compiler/parser.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/parser.js +0 -735
- package/projects/angular2parse/src/lib/angular/compiler/parser.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler/parser.ts +0 -825
- package/projects/angular2parse/src/lib/angular/compiler.d.ts +0 -7
- package/projects/angular2parse/src/lib/angular/compiler.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler.js +0 -7
- package/projects/angular2parse/src/lib/angular/compiler.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/compiler.ts +0 -6
- package/projects/angular2parse/src/lib/angular/facade/lang.d.ts +0 -45
- package/projects/angular2parse/src/lib/angular/facade/lang.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/facade/lang.js +0 -85
- package/projects/angular2parse/src/lib/angular/facade/lang.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/facade/lang.ts +0 -124
- package/projects/angular2parse/src/lib/angular/facade.d.ts +0 -2
- package/projects/angular2parse/src/lib/angular/facade.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular/facade.js +0 -2
- package/projects/angular2parse/src/lib/angular/facade.js.map +0 -1
- package/projects/angular2parse/src/lib/angular/facade.ts +0 -1
- package/projects/angular2parse/src/lib/angular.d.ts +0 -3
- package/projects/angular2parse/src/lib/angular.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/angular.js +0 -3
- package/projects/angular2parse/src/lib/angular.js.map +0 -1
- package/projects/angular2parse/src/lib/angular.ts +0 -2
- package/projects/angular2parse/src/lib/module.d.ts +0 -6
- package/projects/angular2parse/src/lib/module.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/module.js +0 -17
- package/projects/angular2parse/src/lib/module.js.map +0 -1
- package/projects/angular2parse/src/lib/module.ts +0 -12
- package/projects/angular2parse/src/lib/parse.d.ts +0 -19
- package/projects/angular2parse/src/lib/parse.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/parse.js +0 -61
- package/projects/angular2parse/src/lib/parse.js.map +0 -1
- package/projects/angular2parse/src/lib/parse.ts +0 -78
- package/projects/angular2parse/src/lib/util/binary-operations.d.ts +0 -2
- package/projects/angular2parse/src/lib/util/binary-operations.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/util/binary-operations.js +0 -18
- package/projects/angular2parse/src/lib/util/binary-operations.js.map +0 -1
- package/projects/angular2parse/src/lib/util/binary-operations.ts +0 -17
- package/projects/angular2parse/src/lib/util/lang.d.ts +0 -5
- package/projects/angular2parse/src/lib/util/lang.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/util/lang.js +0 -13
- package/projects/angular2parse/src/lib/util/lang.js.map +0 -1
- package/projects/angular2parse/src/lib/util/lang.ts +0 -15
- package/projects/angular2parse/src/lib/util.d.ts +0 -3
- package/projects/angular2parse/src/lib/util.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/util.js +0 -3
- package/projects/angular2parse/src/lib/util.js.map +0 -1
- package/projects/angular2parse/src/lib/util.ts +0 -2
- package/projects/angular2parse/src/lib/visitors/parse-visitor-compiler.d.ts +0 -24
- package/projects/angular2parse/src/lib/visitors/parse-visitor-compiler.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/visitors/parse-visitor-compiler.js +0 -96
- package/projects/angular2parse/src/lib/visitors/parse-visitor-compiler.js.map +0 -1
- package/projects/angular2parse/src/lib/visitors/parse-visitor-compiler.ts +0 -149
- package/projects/angular2parse/src/lib/visitors/parse-visitor-resolver.d.ts +0 -26
- package/projects/angular2parse/src/lib/visitors/parse-visitor-resolver.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/visitors/parse-visitor-resolver.js +0 -141
- package/projects/angular2parse/src/lib/visitors/parse-visitor-resolver.js.map +0 -1
- package/projects/angular2parse/src/lib/visitors/parse-visitor-resolver.ts +0 -208
- package/projects/angular2parse/src/lib/visitors.d.ts +0 -3
- package/projects/angular2parse/src/lib/visitors.d.ts.map +0 -1
- package/projects/angular2parse/src/lib/visitors.js +0 -3
- package/projects/angular2parse/src/lib/visitors.js.map +0 -1
- package/projects/angular2parse/src/lib/visitors.ts +0 -2
- package/projects/angular2parse/src/public-api.d.ts +0 -3
- package/projects/angular2parse/src/public-api.d.ts.map +0 -1
- package/projects/angular2parse/src/public-api.js +0 -6
- package/projects/angular2parse/src/public-api.js.map +0 -1
- package/projects/angular2parse/src/public-api.ts +0 -5
- package/projects/angular2parse/tsconfig.lib.json +0 -22
- package/projects/angular2parse/tsconfig.lib.prod.json +0 -15
- package/tsconfig.json +0 -21
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interpolation-config.js","sourceRoot":"","sources":["interpolation-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAC,0BAA0B,EAAC,MAAM,cAAc,CAAC;AAExD,MAAM,OAAO,mBAAmB;IAC5B,MAAM,CAAC,SAAS,CAAC,OAAyB;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,4BAA4B,CAAC;QACxC,CAAC;QAED,0BAA0B,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,YAAmB,KAAa,EAAS,GAAW;QAAjC,UAAK,GAAL,KAAK,CAAQ;QAAS,QAAG,GAAH,GAAG,CAAQ;IAAE,CAAC;IAAA,CAAC;CAC3D;AAED,MAAM,CAAC,MAAM,4BAA4B,GACrC,IAAI,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC","sourcesContent":["/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nimport {assertInterpolationSymbols} from './assertions';\r\n\r\nexport class InterpolationConfig {\r\n static fromArray(markers: [string, string]): InterpolationConfig {\r\n if (!markers) {\r\n return DEFAULT_INTERPOLATION_CONFIG;\r\n }\r\n\r\n assertInterpolationSymbols('interpolation', markers);\r\n return new InterpolationConfig(markers[0], markers[1]);\r\n }\r\n\r\n constructor(public start: string, public end: string){};\r\n}\r\n\r\nexport const DEFAULT_INTERPOLATION_CONFIG: InterpolationConfig =\r\n new InterpolationConfig('{{', '}}');"]}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {assertInterpolationSymbols} from './assertions';
|
|
10
|
-
|
|
11
|
-
export class InterpolationConfig {
|
|
12
|
-
static fromArray(markers: [string, string]): InterpolationConfig {
|
|
13
|
-
if (!markers) {
|
|
14
|
-
return DEFAULT_INTERPOLATION_CONFIG;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
assertInterpolationSymbols('interpolation', markers);
|
|
18
|
-
return new InterpolationConfig(markers[0], markers[1]);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
constructor(public start: string, public end: string){};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const DEFAULT_INTERPOLATION_CONFIG: InterpolationConfig =
|
|
25
|
-
new InterpolationConfig('{{', '}}');
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
export declare enum TokenType {
|
|
9
|
-
Character = 0,
|
|
10
|
-
Identifier = 1,
|
|
11
|
-
Keyword = 2,
|
|
12
|
-
String = 3,
|
|
13
|
-
Operator = 4,
|
|
14
|
-
Number = 5,
|
|
15
|
-
Error = 6
|
|
16
|
-
}
|
|
17
|
-
export declare class Lexer {
|
|
18
|
-
tokenize(text: string): Token[];
|
|
19
|
-
}
|
|
20
|
-
export declare class Token {
|
|
21
|
-
index: number;
|
|
22
|
-
type: TokenType;
|
|
23
|
-
numValue: number;
|
|
24
|
-
strValue: string;
|
|
25
|
-
constructor(index: number, type: TokenType, numValue: number, strValue: string);
|
|
26
|
-
isCharacter(code: number): boolean;
|
|
27
|
-
isNumber(): boolean;
|
|
28
|
-
isString(): boolean;
|
|
29
|
-
isOperator(operater: string): boolean;
|
|
30
|
-
isIdentifier(): boolean;
|
|
31
|
-
isKeyword(): boolean;
|
|
32
|
-
isKeywordLet(): boolean;
|
|
33
|
-
isKeywordNull(): boolean;
|
|
34
|
-
isKeywordUndefined(): boolean;
|
|
35
|
-
isKeywordTrue(): boolean;
|
|
36
|
-
isKeywordFalse(): boolean;
|
|
37
|
-
isKeywordThis(): boolean;
|
|
38
|
-
isError(): boolean;
|
|
39
|
-
toNumber(): number;
|
|
40
|
-
toString(): string | null;
|
|
41
|
-
}
|
|
42
|
-
export declare const EOF: Token;
|
|
43
|
-
export declare function isIdentifier(input: string): boolean;
|
|
44
|
-
export declare function isQuote(code: number): boolean;
|
|
45
|
-
//# sourceMappingURL=lexer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["lexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,oBAAY,SAAS;IACjB,SAAS,IAAA;IACT,UAAU,IAAA;IACV,OAAO,IAAA;IACP,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,KAAK,IAAA;CACR;AAID,qBAAa,KAAK;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE;CAUlC;AAED,qBAAa,KAAK;IAEH,KAAK,EAAE,MAAM;IAAS,IAAI,EAAE,SAAS;IAAS,QAAQ,EAAE,MAAM;IAC9D,QAAQ,EAAE,MAAM;gBADhB,KAAK,EAAE,MAAM,EAAS,IAAI,EAAE,SAAS,EAAS,QAAQ,EAAE,MAAM,EAC9D,QAAQ,EAAE,MAAM;IAE3B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC,QAAQ,IAAI,OAAO;IAEnB,QAAQ,IAAI,OAAO;IAEnB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,YAAY,IAAI,OAAO;IAEvB,SAAS,IAAI,OAAO;IAEpB,YAAY,IAAI,OAAO;IAEvB,aAAa,IAAI,OAAO;IAExB,kBAAkB,IAAI,OAAO;IAI7B,aAAa,IAAI,OAAO;IAExB,cAAc,IAAI,OAAO;IAEzB,aAAa,IAAI,OAAO;IAExB,OAAO,IAAI,OAAO;IAElB,QAAQ,IAAI,MAAM;IAElB,QAAQ,IAAI,MAAM,GAAG,IAAI;CAe5B;AA8BD,eAAO,MAAM,GAAG,EAAE,KAAiD,CAAC;AA0NpE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAUnD;AAeD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C"}
|
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import * as chars from './chars';
|
|
9
|
-
import { NumberWrapper } from '../facade/lang';
|
|
10
|
-
export var TokenType;
|
|
11
|
-
(function (TokenType) {
|
|
12
|
-
TokenType[TokenType["Character"] = 0] = "Character";
|
|
13
|
-
TokenType[TokenType["Identifier"] = 1] = "Identifier";
|
|
14
|
-
TokenType[TokenType["Keyword"] = 2] = "Keyword";
|
|
15
|
-
TokenType[TokenType["String"] = 3] = "String";
|
|
16
|
-
TokenType[TokenType["Operator"] = 4] = "Operator";
|
|
17
|
-
TokenType[TokenType["Number"] = 5] = "Number";
|
|
18
|
-
TokenType[TokenType["Error"] = 6] = "Error";
|
|
19
|
-
})(TokenType || (TokenType = {}));
|
|
20
|
-
const KEYWORDS = ['var', 'let', 'null', 'undefined', 'true', 'false', 'if', 'else', 'this'];
|
|
21
|
-
export class Lexer {
|
|
22
|
-
tokenize(text) {
|
|
23
|
-
const scanner = new _Scanner(text);
|
|
24
|
-
const tokens = [];
|
|
25
|
-
let token = scanner.scanToken();
|
|
26
|
-
while (token != null) {
|
|
27
|
-
tokens.push(token);
|
|
28
|
-
token = scanner.scanToken();
|
|
29
|
-
}
|
|
30
|
-
return tokens;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export class Token {
|
|
34
|
-
constructor(index, type, numValue, strValue) {
|
|
35
|
-
this.index = index;
|
|
36
|
-
this.type = type;
|
|
37
|
-
this.numValue = numValue;
|
|
38
|
-
this.strValue = strValue;
|
|
39
|
-
}
|
|
40
|
-
isCharacter(code) {
|
|
41
|
-
return this.type == TokenType.Character && this.numValue == code;
|
|
42
|
-
}
|
|
43
|
-
isNumber() { return this.type == TokenType.Number; }
|
|
44
|
-
isString() { return this.type == TokenType.String; }
|
|
45
|
-
isOperator(operater) {
|
|
46
|
-
return this.type == TokenType.Operator && this.strValue == operater;
|
|
47
|
-
}
|
|
48
|
-
isIdentifier() { return this.type == TokenType.Identifier; }
|
|
49
|
-
isKeyword() { return this.type == TokenType.Keyword; }
|
|
50
|
-
isKeywordLet() { return this.type == TokenType.Keyword && this.strValue == 'let'; }
|
|
51
|
-
isKeywordNull() { return this.type == TokenType.Keyword && this.strValue == 'null'; }
|
|
52
|
-
isKeywordUndefined() {
|
|
53
|
-
return this.type == TokenType.Keyword && this.strValue == 'undefined';
|
|
54
|
-
}
|
|
55
|
-
isKeywordTrue() { return this.type == TokenType.Keyword && this.strValue == 'true'; }
|
|
56
|
-
isKeywordFalse() { return this.type == TokenType.Keyword && this.strValue == 'false'; }
|
|
57
|
-
isKeywordThis() { return this.type == TokenType.Keyword && this.strValue == 'this'; }
|
|
58
|
-
isError() { return this.type == TokenType.Error; }
|
|
59
|
-
toNumber() { return this.type == TokenType.Number ? this.numValue : -1; }
|
|
60
|
-
toString() {
|
|
61
|
-
switch (this.type) {
|
|
62
|
-
case TokenType.Character:
|
|
63
|
-
case TokenType.Identifier:
|
|
64
|
-
case TokenType.Keyword:
|
|
65
|
-
case TokenType.Operator:
|
|
66
|
-
case TokenType.String:
|
|
67
|
-
case TokenType.Error:
|
|
68
|
-
return this.strValue;
|
|
69
|
-
case TokenType.Number:
|
|
70
|
-
return this.numValue.toString();
|
|
71
|
-
default:
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function newCharacterToken(index, code) {
|
|
77
|
-
return new Token(index, TokenType.Character, code, String.fromCharCode(code));
|
|
78
|
-
}
|
|
79
|
-
function newIdentifierToken(index, text) {
|
|
80
|
-
return new Token(index, TokenType.Identifier, 0, text);
|
|
81
|
-
}
|
|
82
|
-
function newKeywordToken(index, text) {
|
|
83
|
-
return new Token(index, TokenType.Keyword, 0, text);
|
|
84
|
-
}
|
|
85
|
-
function newOperatorToken(index, text) {
|
|
86
|
-
return new Token(index, TokenType.Operator, 0, text);
|
|
87
|
-
}
|
|
88
|
-
function newStringToken(index, text) {
|
|
89
|
-
return new Token(index, TokenType.String, 0, text);
|
|
90
|
-
}
|
|
91
|
-
function newNumberToken(index, n) {
|
|
92
|
-
return new Token(index, TokenType.Number, n, '');
|
|
93
|
-
}
|
|
94
|
-
function newErrorToken(index, message) {
|
|
95
|
-
return new Token(index, TokenType.Error, 0, message);
|
|
96
|
-
}
|
|
97
|
-
export const EOF = new Token(-1, TokenType.Character, 0, '');
|
|
98
|
-
class _Scanner {
|
|
99
|
-
constructor(input) {
|
|
100
|
-
this.input = input;
|
|
101
|
-
this.peek = 0;
|
|
102
|
-
this.index = -1;
|
|
103
|
-
this.length = input.length;
|
|
104
|
-
this.advance();
|
|
105
|
-
}
|
|
106
|
-
advance() {
|
|
107
|
-
this.peek = ++this.index >= this.length ? chars.$EOF : this.input.charCodeAt(this.index);
|
|
108
|
-
}
|
|
109
|
-
scanToken() {
|
|
110
|
-
const input = this.input, length = this.length;
|
|
111
|
-
let peek = this.peek, index = this.index;
|
|
112
|
-
// Skip whitespace.
|
|
113
|
-
while (peek <= chars.$SPACE) {
|
|
114
|
-
if (++index >= length) {
|
|
115
|
-
peek = chars.$EOF;
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
peek = input.charCodeAt(index);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
this.peek = peek;
|
|
123
|
-
this.index = index;
|
|
124
|
-
if (index >= length) {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
// Handle identifiers and numbers.
|
|
128
|
-
if (isIdentifierStart(peek))
|
|
129
|
-
return this.scanIdentifier();
|
|
130
|
-
if (chars.isDigit(peek))
|
|
131
|
-
return this.scanNumber(index);
|
|
132
|
-
const start = index;
|
|
133
|
-
switch (peek) {
|
|
134
|
-
case chars.$PERIOD:
|
|
135
|
-
this.advance();
|
|
136
|
-
return chars.isDigit(this.peek) ? this.scanNumber(start) :
|
|
137
|
-
newCharacterToken(start, chars.$PERIOD);
|
|
138
|
-
case chars.$LPAREN:
|
|
139
|
-
case chars.$RPAREN:
|
|
140
|
-
case chars.$LBRACE:
|
|
141
|
-
case chars.$RBRACE:
|
|
142
|
-
case chars.$LBRACKET:
|
|
143
|
-
case chars.$RBRACKET:
|
|
144
|
-
case chars.$COMMA:
|
|
145
|
-
case chars.$COLON:
|
|
146
|
-
case chars.$SEMICOLON:
|
|
147
|
-
return this.scanCharacter(start, peek);
|
|
148
|
-
case chars.$SQ:
|
|
149
|
-
case chars.$DQ:
|
|
150
|
-
return this.scanString();
|
|
151
|
-
case chars.$HASH:
|
|
152
|
-
case chars.$PLUS:
|
|
153
|
-
case chars.$MINUS:
|
|
154
|
-
case chars.$STAR:
|
|
155
|
-
case chars.$SLASH:
|
|
156
|
-
case chars.$PERCENT:
|
|
157
|
-
case chars.$CARET:
|
|
158
|
-
return this.scanOperator(start, String.fromCharCode(peek));
|
|
159
|
-
case chars.$QUESTION:
|
|
160
|
-
return this.scanComplexOperator(start, '?', chars.$PERIOD, '.');
|
|
161
|
-
case chars.$LT:
|
|
162
|
-
case chars.$GT:
|
|
163
|
-
return this.scanComplexOperator(start, String.fromCharCode(peek), chars.$EQ, '=');
|
|
164
|
-
case chars.$BANG:
|
|
165
|
-
case chars.$EQ:
|
|
166
|
-
return this.scanComplexOperator(start, String.fromCharCode(peek), chars.$EQ, '=', chars.$EQ, '=');
|
|
167
|
-
case chars.$AMPERSAND:
|
|
168
|
-
return this.scanComplexOperator(start, '&', chars.$AMPERSAND, '&');
|
|
169
|
-
case chars.$BAR:
|
|
170
|
-
return this.scanComplexOperator(start, '|', chars.$BAR, '|');
|
|
171
|
-
case chars.$NBSP:
|
|
172
|
-
while (chars.isWhitespace(this.peek))
|
|
173
|
-
this.advance();
|
|
174
|
-
return this.scanToken();
|
|
175
|
-
}
|
|
176
|
-
this.advance();
|
|
177
|
-
return this.error(`Unexpected character [${String.fromCharCode(peek)}]`, 0);
|
|
178
|
-
}
|
|
179
|
-
scanCharacter(start, code) {
|
|
180
|
-
this.advance();
|
|
181
|
-
return newCharacterToken(start, code);
|
|
182
|
-
}
|
|
183
|
-
scanOperator(start, str) {
|
|
184
|
-
this.advance();
|
|
185
|
-
return newOperatorToken(start, str);
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Tokenize a 2/3 char long operator
|
|
189
|
-
*
|
|
190
|
-
* @param start start index in the expression
|
|
191
|
-
* @param one first symbol (always part of the operator)
|
|
192
|
-
* @param twoCode code point for the second symbol
|
|
193
|
-
* @param two second symbol (part of the operator when the second code point matches)
|
|
194
|
-
* @param threeCode code point for the third symbol
|
|
195
|
-
* @param three third symbol (part of the operator when provided and matches source expression)
|
|
196
|
-
* @returns {Token}
|
|
197
|
-
*/
|
|
198
|
-
scanComplexOperator(start, one, twoCode, two, threeCode, three) {
|
|
199
|
-
this.advance();
|
|
200
|
-
let str = one;
|
|
201
|
-
if (this.peek == twoCode) {
|
|
202
|
-
this.advance();
|
|
203
|
-
str += two;
|
|
204
|
-
}
|
|
205
|
-
if (threeCode != null && this.peek == threeCode) {
|
|
206
|
-
this.advance();
|
|
207
|
-
str += three;
|
|
208
|
-
}
|
|
209
|
-
return newOperatorToken(start, str);
|
|
210
|
-
}
|
|
211
|
-
scanIdentifier() {
|
|
212
|
-
const start = this.index;
|
|
213
|
-
this.advance();
|
|
214
|
-
while (isIdentifierPart(this.peek))
|
|
215
|
-
this.advance();
|
|
216
|
-
const str = this.input.substring(start, this.index);
|
|
217
|
-
return KEYWORDS.indexOf(str) > -1 ? newKeywordToken(start, str) :
|
|
218
|
-
newIdentifierToken(start, str);
|
|
219
|
-
}
|
|
220
|
-
scanNumber(start) {
|
|
221
|
-
let simple = (this.index === start);
|
|
222
|
-
this.advance(); // Skip initial digit.
|
|
223
|
-
while (true) {
|
|
224
|
-
if (chars.isDigit(this.peek)) {
|
|
225
|
-
// Do nothing.
|
|
226
|
-
}
|
|
227
|
-
else if (this.peek == chars.$PERIOD) {
|
|
228
|
-
simple = false;
|
|
229
|
-
}
|
|
230
|
-
else if (isExponentStart(this.peek)) {
|
|
231
|
-
this.advance();
|
|
232
|
-
if (isExponentSign(this.peek))
|
|
233
|
-
this.advance();
|
|
234
|
-
if (!chars.isDigit(this.peek))
|
|
235
|
-
return this.error('Invalid exponent', -1);
|
|
236
|
-
simple = false;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
this.advance();
|
|
242
|
-
}
|
|
243
|
-
const str = this.input.substring(start, this.index);
|
|
244
|
-
const value = simple ? NumberWrapper.parseIntAutoRadix(str) : parseFloat(str);
|
|
245
|
-
return newNumberToken(start, value);
|
|
246
|
-
}
|
|
247
|
-
scanString() {
|
|
248
|
-
const start = this.index;
|
|
249
|
-
const quote = this.peek;
|
|
250
|
-
this.advance(); // Skip initial quote.
|
|
251
|
-
let buffer = '';
|
|
252
|
-
let marker = this.index;
|
|
253
|
-
const input = this.input;
|
|
254
|
-
while (this.peek != quote) {
|
|
255
|
-
if (this.peek == chars.$BACKSLASH) {
|
|
256
|
-
buffer += input.substring(marker, this.index);
|
|
257
|
-
this.advance();
|
|
258
|
-
let unescapedCode;
|
|
259
|
-
// Workaround for TS2.1-introduced type strictness
|
|
260
|
-
this.peek = this.peek;
|
|
261
|
-
if (this.peek == chars.$u) {
|
|
262
|
-
// 4 character hex code for unicode character.
|
|
263
|
-
const hex = input.substring(this.index + 1, this.index + 5);
|
|
264
|
-
if (/^[0-9a-f]+$/i.test(hex)) {
|
|
265
|
-
unescapedCode = parseInt(hex, 16);
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
return this.error(`Invalid unicode escape [\\u${hex}]`, 0);
|
|
269
|
-
}
|
|
270
|
-
for (let i = 0; i < 5; i++) {
|
|
271
|
-
this.advance();
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
unescapedCode = unescape(this.peek);
|
|
276
|
-
this.advance();
|
|
277
|
-
}
|
|
278
|
-
buffer += String.fromCharCode(unescapedCode);
|
|
279
|
-
marker = this.index;
|
|
280
|
-
}
|
|
281
|
-
else if (this.peek == chars.$EOF) {
|
|
282
|
-
return this.error('Unterminated quote', 0);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
this.advance();
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
const last = input.substring(marker, this.index);
|
|
289
|
-
this.advance(); // Skip terminating quote.
|
|
290
|
-
return newStringToken(start, buffer + last);
|
|
291
|
-
}
|
|
292
|
-
error(message, offset) {
|
|
293
|
-
const position = this.index + offset;
|
|
294
|
-
return newErrorToken(position, `Lexer Error: ${message} at column ${position} in expression [${this.input}]`);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
function isIdentifierStart(code) {
|
|
298
|
-
return (chars.$a <= code && code <= chars.$z) || (chars.$A <= code && code <= chars.$Z) ||
|
|
299
|
-
(code == chars.$_) || (code == chars.$$);
|
|
300
|
-
}
|
|
301
|
-
export function isIdentifier(input) {
|
|
302
|
-
if (input.length == 0)
|
|
303
|
-
return false;
|
|
304
|
-
const scanner = new _Scanner(input);
|
|
305
|
-
if (!isIdentifierStart(scanner.peek))
|
|
306
|
-
return false;
|
|
307
|
-
scanner.advance();
|
|
308
|
-
while (scanner.peek !== chars.$EOF) {
|
|
309
|
-
if (!isIdentifierPart(scanner.peek))
|
|
310
|
-
return false;
|
|
311
|
-
scanner.advance();
|
|
312
|
-
}
|
|
313
|
-
return true;
|
|
314
|
-
}
|
|
315
|
-
function isIdentifierPart(code) {
|
|
316
|
-
return chars.isAsciiLetter(code) || chars.isDigit(code) || (code == chars.$_) ||
|
|
317
|
-
(code == chars.$$);
|
|
318
|
-
}
|
|
319
|
-
function isExponentStart(code) {
|
|
320
|
-
return code == chars.$e || code == chars.$E;
|
|
321
|
-
}
|
|
322
|
-
function isExponentSign(code) {
|
|
323
|
-
return code == chars.$MINUS || code == chars.$PLUS;
|
|
324
|
-
}
|
|
325
|
-
export function isQuote(code) {
|
|
326
|
-
return code === chars.$SQ || code === chars.$DQ || code === chars.$BT;
|
|
327
|
-
}
|
|
328
|
-
function unescape(code) {
|
|
329
|
-
switch (code) {
|
|
330
|
-
case chars.$n:
|
|
331
|
-
return chars.$LF;
|
|
332
|
-
case chars.$f:
|
|
333
|
-
return chars.$FF;
|
|
334
|
-
case chars.$r:
|
|
335
|
-
return chars.$CR;
|
|
336
|
-
case chars.$t:
|
|
337
|
-
return chars.$TAB;
|
|
338
|
-
case chars.$v:
|
|
339
|
-
return chars.$VTAB;
|
|
340
|
-
default:
|
|
341
|
-
return code;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
//# sourceMappingURL=lexer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["lexer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * @license\r\n * Copyright Google Inc. All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nimport * as chars from './chars';\r\nimport {NumberWrapper} from '../facade/lang';\r\n\r\nexport enum TokenType {\r\n Character,\r\n Identifier,\r\n Keyword,\r\n String,\r\n Operator,\r\n Number,\r\n Error\r\n}\r\n\r\nconst KEYWORDS = ['var', 'let', 'null', 'undefined', 'true', 'false', 'if', 'else', 'this'];\r\n\r\nexport class Lexer {\r\n tokenize(text: string): Token[] {\r\n const scanner = new _Scanner(text);\r\n const tokens: Token[] = [];\r\n let token = scanner.scanToken();\r\n while (token != null) {\r\n tokens.push(token);\r\n token = scanner.scanToken();\r\n }\r\n return tokens;\r\n }\r\n}\r\n\r\nexport class Token {\r\n constructor(\r\n public index: number, public type: TokenType, public numValue: number,\r\n public strValue: string) {}\r\n\r\n isCharacter(code: number): boolean {\r\n return this.type == TokenType.Character && this.numValue == code;\r\n }\r\n\r\n isNumber(): boolean { return this.type == TokenType.Number; }\r\n\r\n isString(): boolean { return this.type == TokenType.String; }\r\n\r\n isOperator(operater: string): boolean {\r\n return this.type == TokenType.Operator && this.strValue == operater;\r\n }\r\n\r\n isIdentifier(): boolean { return this.type == TokenType.Identifier; }\r\n\r\n isKeyword(): boolean { return this.type == TokenType.Keyword; }\r\n\r\n isKeywordLet(): boolean { return this.type == TokenType.Keyword && this.strValue == 'let'; }\r\n\r\n isKeywordNull(): boolean { return this.type == TokenType.Keyword && this.strValue == 'null'; }\r\n\r\n isKeywordUndefined(): boolean {\r\n return this.type == TokenType.Keyword && this.strValue == 'undefined';\r\n }\r\n\r\n isKeywordTrue(): boolean { return this.type == TokenType.Keyword && this.strValue == 'true'; }\r\n\r\n isKeywordFalse(): boolean { return this.type == TokenType.Keyword && this.strValue == 'false'; }\r\n\r\n isKeywordThis(): boolean { return this.type == TokenType.Keyword && this.strValue == 'this'; }\r\n\r\n isError(): boolean { return this.type == TokenType.Error; }\r\n\r\n toNumber(): number { return this.type == TokenType.Number ? this.numValue : -1; }\r\n\r\n toString(): string | null {\r\n switch (this.type) {\r\n case TokenType.Character:\r\n case TokenType.Identifier:\r\n case TokenType.Keyword:\r\n case TokenType.Operator:\r\n case TokenType.String:\r\n case TokenType.Error:\r\n return this.strValue;\r\n case TokenType.Number:\r\n return this.numValue.toString();\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nfunction newCharacterToken(index: number, code: number): Token {\r\n return new Token(index, TokenType.Character, code, String.fromCharCode(code));\r\n}\r\n\r\nfunction newIdentifierToken(index: number, text: string): Token {\r\n return new Token(index, TokenType.Identifier, 0, text);\r\n}\r\n\r\nfunction newKeywordToken(index: number, text: string): Token {\r\n return new Token(index, TokenType.Keyword, 0, text);\r\n}\r\n\r\nfunction newOperatorToken(index: number, text: string): Token {\r\n return new Token(index, TokenType.Operator, 0, text);\r\n}\r\n\r\nfunction newStringToken(index: number, text: string): Token {\r\n return new Token(index, TokenType.String, 0, text);\r\n}\r\n\r\nfunction newNumberToken(index: number, n: number): Token {\r\n return new Token(index, TokenType.Number, n, '');\r\n}\r\n\r\nfunction newErrorToken(index: number, message: string): Token {\r\n return new Token(index, TokenType.Error, 0, message);\r\n}\r\n\r\nexport const EOF: Token = new Token(-1, TokenType.Character, 0, '');\r\n\r\nclass _Scanner {\r\n length: number;\r\n peek: number = 0;\r\n index: number = -1;\r\n\r\n constructor(public input: string) {\r\n this.length = input.length;\r\n this.advance();\r\n }\r\n\r\n advance() {\r\n this.peek = ++this.index >= this.length ? chars.$EOF : this.input.charCodeAt(this.index);\r\n }\r\n\r\n scanToken(): Token | null {\r\n const input = this.input, length = this.length;\r\n let peek = this.peek, index = this.index;\r\n\r\n // Skip whitespace.\r\n while (peek <= chars.$SPACE) {\r\n if (++index >= length) {\r\n peek = chars.$EOF;\r\n break;\r\n } else {\r\n peek = input.charCodeAt(index);\r\n }\r\n }\r\n\r\n this.peek = peek;\r\n this.index = index;\r\n\r\n if (index >= length) {\r\n return null;\r\n }\r\n\r\n // Handle identifiers and numbers.\r\n if (isIdentifierStart(peek)) return this.scanIdentifier();\r\n if (chars.isDigit(peek)) return this.scanNumber(index);\r\n\r\n const start: number = index;\r\n switch (peek) {\r\n case chars.$PERIOD:\r\n this.advance();\r\n return chars.isDigit(this.peek) ? this.scanNumber(start) :\r\n newCharacterToken(start, chars.$PERIOD);\r\n case chars.$LPAREN:\r\n case chars.$RPAREN:\r\n case chars.$LBRACE:\r\n case chars.$RBRACE:\r\n case chars.$LBRACKET:\r\n case chars.$RBRACKET:\r\n case chars.$COMMA:\r\n case chars.$COLON:\r\n case chars.$SEMICOLON:\r\n return this.scanCharacter(start, peek);\r\n case chars.$SQ:\r\n case chars.$DQ:\r\n return this.scanString();\r\n case chars.$HASH:\r\n case chars.$PLUS:\r\n case chars.$MINUS:\r\n case chars.$STAR:\r\n case chars.$SLASH:\r\n case chars.$PERCENT:\r\n case chars.$CARET:\r\n return this.scanOperator(start, String.fromCharCode(peek));\r\n case chars.$QUESTION:\r\n return this.scanComplexOperator(start, '?', chars.$PERIOD, '.');\r\n case chars.$LT:\r\n case chars.$GT:\r\n return this.scanComplexOperator(start, String.fromCharCode(peek), chars.$EQ, '=');\r\n case chars.$BANG:\r\n case chars.$EQ:\r\n return this.scanComplexOperator(\r\n start, String.fromCharCode(peek), chars.$EQ, '=', chars.$EQ, '=');\r\n case chars.$AMPERSAND:\r\n return this.scanComplexOperator(start, '&', chars.$AMPERSAND, '&');\r\n case chars.$BAR:\r\n return this.scanComplexOperator(start, '|', chars.$BAR, '|');\r\n case chars.$NBSP:\r\n while (chars.isWhitespace(this.peek)) this.advance();\r\n return this.scanToken();\r\n }\r\n\r\n this.advance();\r\n return this.error(`Unexpected character [${String.fromCharCode(peek)}]`, 0);\r\n }\r\n\r\n scanCharacter(start: number, code: number): Token {\r\n this.advance();\r\n return newCharacterToken(start, code);\r\n }\r\n\r\n\r\n scanOperator(start: number, str: string): Token {\r\n this.advance();\r\n return newOperatorToken(start, str);\r\n }\r\n\r\n /**\r\n * Tokenize a 2/3 char long operator\r\n *\r\n * @param start start index in the expression\r\n * @param one first symbol (always part of the operator)\r\n * @param twoCode code point for the second symbol\r\n * @param two second symbol (part of the operator when the second code point matches)\r\n * @param threeCode code point for the third symbol\r\n * @param three third symbol (part of the operator when provided and matches source expression)\r\n * @returns {Token}\r\n */\r\n scanComplexOperator(\r\n start: number, one: string, twoCode: number, two: string, threeCode?: number,\r\n three?: string): Token {\r\n this.advance();\r\n let str: string = one;\r\n if (this.peek == twoCode) {\r\n this.advance();\r\n str += two;\r\n }\r\n if (threeCode != null && this.peek == threeCode) {\r\n this.advance();\r\n str += three;\r\n }\r\n return newOperatorToken(start, str);\r\n }\r\n\r\n scanIdentifier(): Token {\r\n const start: number = this.index;\r\n this.advance();\r\n while (isIdentifierPart(this.peek)) this.advance();\r\n const str: string = this.input.substring(start, this.index);\r\n return KEYWORDS.indexOf(str) > -1 ? newKeywordToken(start, str) :\r\n newIdentifierToken(start, str);\r\n }\r\n\r\n scanNumber(start: number): Token {\r\n let simple: boolean = (this.index === start);\r\n this.advance(); // Skip initial digit.\r\n while (true) {\r\n if (chars.isDigit(this.peek)) {\r\n // Do nothing.\r\n } else if (this.peek == chars.$PERIOD) {\r\n simple = false;\r\n } else if (isExponentStart(this.peek)) {\r\n this.advance();\r\n if (isExponentSign(this.peek)) this.advance();\r\n if (!chars.isDigit(this.peek)) return this.error('Invalid exponent', -1);\r\n simple = false;\r\n } else {\r\n break;\r\n }\r\n this.advance();\r\n }\r\n const str: string = this.input.substring(start, this.index);\r\n const value: number = simple ? NumberWrapper.parseIntAutoRadix(str) : parseFloat(str);\r\n return newNumberToken(start, value);\r\n }\r\n\r\n scanString(): Token {\r\n const start: number = this.index;\r\n const quote: number = this.peek;\r\n this.advance(); // Skip initial quote.\r\n\r\n let buffer: string = '';\r\n let marker: number = this.index;\r\n const input: string = this.input;\r\n\r\n while (this.peek != quote) {\r\n if (this.peek == chars.$BACKSLASH) {\r\n buffer += input.substring(marker, this.index);\r\n this.advance();\r\n let unescapedCode: number;\r\n // Workaround for TS2.1-introduced type strictness\r\n this.peek = this.peek;\r\n if (this.peek == chars.$u) {\r\n // 4 character hex code for unicode character.\r\n const hex: string = input.substring(this.index + 1, this.index + 5);\r\n if (/^[0-9a-f]+$/i.test(hex)) {\r\n unescapedCode = parseInt(hex, 16);\r\n } else {\r\n return this.error(`Invalid unicode escape [\\\\u${hex}]`, 0);\r\n }\r\n for (let i: number = 0; i < 5; i++) {\r\n this.advance();\r\n }\r\n } else {\r\n unescapedCode = unescape(this.peek);\r\n this.advance();\r\n }\r\n buffer += String.fromCharCode(unescapedCode);\r\n marker = this.index;\r\n } else if (this.peek == chars.$EOF) {\r\n return this.error('Unterminated quote', 0);\r\n } else {\r\n this.advance();\r\n }\r\n }\r\n\r\n const last: string = input.substring(marker, this.index);\r\n this.advance(); // Skip terminating quote.\r\n\r\n return newStringToken(start, buffer + last);\r\n }\r\n\r\n error(message: string, offset: number): Token {\r\n const position: number = this.index + offset;\r\n return newErrorToken(\r\n position, `Lexer Error: ${message} at column ${position} in expression [${this.input}]`);\r\n }\r\n}\r\n\r\nfunction isIdentifierStart(code: number): boolean {\r\n return (chars.$a <= code && code <= chars.$z) || (chars.$A <= code && code <= chars.$Z) ||\r\n (code == chars.$_) || (code == chars.$$);\r\n}\r\n\r\nexport function isIdentifier(input: string): boolean {\r\n if (input.length == 0) return false;\r\n const scanner = new _Scanner(input);\r\n if (!isIdentifierStart(scanner.peek)) return false;\r\n scanner.advance();\r\n while (scanner.peek !== chars.$EOF) {\r\n if (!isIdentifierPart(scanner.peek)) return false;\r\n scanner.advance();\r\n }\r\n return true;\r\n}\r\n\r\nfunction isIdentifierPart(code: number): boolean {\r\n return chars.isAsciiLetter(code) || chars.isDigit(code) || (code == chars.$_) ||\r\n (code == chars.$$);\r\n}\r\n\r\nfunction isExponentStart(code: number): boolean {\r\n return code == chars.$e || code == chars.$E;\r\n}\r\n\r\nfunction isExponentSign(code: number): boolean {\r\n return code == chars.$MINUS || code == chars.$PLUS;\r\n}\r\n\r\nexport function isQuote(code: number): boolean {\r\n return code === chars.$SQ || code === chars.$DQ || code === chars.$BT;\r\n}\r\n\r\nfunction unescape(code: number): number {\r\n switch (code) {\r\n case chars.$n:\r\n return chars.$LF;\r\n case chars.$f:\r\n return chars.$FF;\r\n case chars.$r:\r\n return chars.$CR;\r\n case chars.$t:\r\n return chars.$TAB;\r\n case chars.$v:\r\n return chars.$VTAB;\r\n default:\r\n return code;\r\n }\r\n}"]}
|