@@ -152,74 +152,12 @@ export namespace syxparser {
152
152
153
153
if ( tt === TokenType . SingleQuote ) return ExpressionParser . parseSingleQuotedString ( this , put ) ;
154
154
else if ( tt === TokenType . DoubleQuote ) return ExpressionParser . parseDoubleQuotedString ( this , put ) ;
155
- else if ( tt === TokenType . OpenDiamond ) {
156
-
157
- const newToken = at ( 1 ) ;
158
- if ( newToken . type !== TokenType . Identifier ) throw new CompilerError ( newToken . range , `Expected identifier after '<', found '${ newToken . value } '.` , filePath ) ;
159
- if ( ! newToken . value . match ( primitiveTypes ) ) throw new CompilerError ( newToken . range , `Expected primitive type identifier after '<', found '${ newToken . value } '` , filePath ) ;
160
- if ( at ( 2 ) . type !== TokenType . CloseDiamond ) throw new CompilerError ( at ( 2 ) . range , `Expected '>' after primitive type identifier, found '${ at ( 2 ) . value } '` , filePath ) ;
161
- const t = tokens . shift ( ) ;
162
- tokens . shift ( ) ;
163
-
164
- return node ( { type : NodeType . PrimitiveType , value : newToken . value , range : combineTwo ( t , tokens . shift ( ) ) } , put ) ;
165
- } else if ( tt === TokenType . WhitespaceIdentifier ) {
166
- const { range } = tokens . shift ( ) ;
167
- return node ( { type : NodeType . WhitespaceIdentifier , value : '+s' , range } , put ) ;
168
- } else if ( tt === TokenType . OpenBrace ) {
169
- const { range } = tokens . shift ( ) ;
170
-
171
- const expr : BraceExpression = { type : NodeType . Brace , body : [ ] , value : '{' , range : defaultRange } ;
172
-
173
- while ( at ( ) . type !== TokenType . CloseBrace ) {
174
- const stmt = parseStatement ( false ) ;
175
- expr . body . push ( stmt ) ;
176
- }
177
- expr . range = combineTwo ( range , tokens . shift ( ) ) ;
178
- return node ( expr , put ) ;
179
-
180
- } else if ( tt === TokenType . OpenParen ) {
181
- const { range } = tokens . shift ( ) ;
182
-
183
- const expr : ParenExpression = { type : NodeType . Paren , body : [ ] , value : '(' , range : defaultRange } ;
184
-
185
- while ( at ( ) . type !== TokenType . CloseParen ) {
186
- const stmt = parseStatement ( false ) ;
187
- expr . body . push ( stmt ) ;
188
- }
189
- expr . range = combineTwo ( range , tokens . shift ( ) ) ;
190
- return node ( expr , put ) ;
191
-
192
-
193
- } else if ( tt === TokenType . OpenSquare ) {
194
- const { range } = tokens . shift ( ) ;
195
-
196
- const expr : SquareExpression = { type : NodeType . Square , body : [ ] , value : '[' , range : defaultRange } ;
197
-
198
- while ( at ( ) . type !== TokenType . CloseSquare ) {
199
- const stmt = parseStatement ( false ) ;
200
- expr . body . push ( stmt ) ;
201
- }
202
- expr . range = combineTwo ( range , tokens . shift ( ) ) ;
203
- return node ( expr , put ) ;
204
-
205
-
206
- } else if ( tt === TokenType . Identifier && at ( 1 ) . type === TokenType . VarSeperator ) {
207
-
208
- if ( at ( 2 ) . type !== TokenType . IntNumber ) throw new CompilerError ( at ( 2 ) . range , `Expected index after ${ at ( ) . value } variable, found ${ at ( 2 ) . value } .` , filePath ) ;
209
-
210
- const id = tokens . shift ( ) ; // id
211
- tokens . shift ( ) ; // sep
212
- const index = tokens . shift ( ) ; // index
213
- const expr : VariableExpression = { index : parseInt ( index . value ) , type : NodeType . Variable , value : id . value , range : combineTwo ( id , index ) } ;
214
-
215
- return node ( expr , put ) ;
216
- } else if ( keywords . includes ( tt ) ) {
217
- if ( ! statements ) throw new CompilerError ( at ( ) . range , 'Statement not allowed here.' , filePath ) ;
218
- return parseStatement ( ) ;
219
- } else if ( tt === TokenType . Identifier && expectIdentifier ) {
220
- const { value, range } = tokens . shift ( ) ;
221
- return node ( { type : NodeType . String , value, range } , put ) ;
222
- }
155
+ else if ( tt === TokenType . OpenDiamond ) return ExpressionParser . parsePrimitiveType ( this , primitiveTypes , put ) ;
156
+ else if ( tt === TokenType . WhitespaceIdentifier ) return ExpressionParser . parseWhitespaceIdentifier ( this , put ) ;
157
+ else if ( tt === TokenType . OpenBrace ) return ExpressionParser . parseBraceExpression ( this , put , defaultRange ) ;
158
+ else if ( tt === TokenType . OpenSquare ) return ExpressionParser . parseSquareExpression ( this , put , defaultRange ) ;
159
+ else if ( tt === TokenType . OpenParen ) return ExpressionParser . parseParenExpression ( this , put , defaultRange ) ;
160
+ else if ( tt === TokenType . Identifier && at ( 1 ) . type === TokenType . VarSeperator ) return ExpressionParser . parsePrimitiveVariable ( this , put ) ;
223
161
else throw new CompilerError ( at ( ) . range , `Unexpected expression: '${ at ( ) . value } '` , filePath ) ;
224
162
225
163
@@ -593,4 +531,95 @@ namespace ExpressionParser {
593
531
return node ( { type : NodeType . String , value : s , range : combineTwo ( range , tokens . shift ( ) ) } , put ) ;
594
532
}
595
533
534
+ /**
535
+ * Parses a primitive type expression. Parameters are related to the environment of {@link syxparser.parseExpression} or {@link sysparser.parseExpression}.
536
+ * @returns Parsed node.
537
+ */
538
+ export function parsePrimitiveType ( { at, tokens, filePath, combineTwo, node } : parser , primitiveTypes : RegExp , put : boolean ) : Node {
539
+ const newToken = at ( 1 ) ;
540
+ if ( newToken . type !== TokenType . Identifier ) throw new CompilerError ( newToken . range , `Expected identifier after '<', found '${ newToken . value } '.` , filePath ) ;
541
+ if ( ! primitiveTypes . test ( newToken . value ) ) throw new CompilerError ( newToken . range , `Expected primitive type identifier after '<', found '${ newToken . value } '` , filePath ) ;
542
+ if ( at ( 2 ) . type !== TokenType . CloseDiamond ) throw new CompilerError ( at ( 2 ) . range , `Expected '>' after primitive type identifier, found '${ at ( 2 ) . value } '` , filePath ) ;
543
+ const t = tokens . shift ( ) ;
544
+ tokens . shift ( ) ;
545
+ return node ( { type : NodeType . PrimitiveType , value : newToken . value , range : combineTwo ( t , tokens . shift ( ) ) } , put ) ;
546
+ }
547
+
548
+ /**
549
+ * Parses a whitespace identifier expression. Parameters are related to the environment of {@link syxparser.parseExpression} or {@link sysparser.parseExpression}.
550
+ * @returns Parsed node.
551
+ */
552
+ export function parseWhitespaceIdentifier ( { node, tokens } : parser , put : boolean ) : Node {
553
+ const { range } = tokens . shift ( ) ;
554
+ return node ( { type : NodeType . WhitespaceIdentifier , value : '+s' , range } , put ) ;
555
+ }
556
+
557
+ /**
558
+ * Parses a brace expression. Parameters are related to the environment of {@link syxparser.parseExpression} or {@link sysparser.parseExpression}.
559
+ * @returns Parsed node.
560
+ */
561
+ export function parseBraceExpression ( { tokens, parseStatement, combineTwo, node, at } : parser , put : boolean , dr : Range ) {
562
+ const { range } = tokens . shift ( ) ;
563
+
564
+ const expr : BraceExpression = { type : NodeType . Brace , body : [ ] , value : '{' , range : dr } ;
565
+
566
+ while ( at ( ) . type !== TokenType . CloseBrace ) {
567
+ const stmt = parseStatement ( false ) ;
568
+ expr . body . push ( stmt ) ;
569
+ }
570
+ expr . range = combineTwo ( range , tokens . shift ( ) ) ;
571
+ return node ( expr , put ) ;
572
+ }
573
+
574
+ /**
575
+ * Parses a square expression. Parameters are related to the environment of {@link syxparser.parseExpression} or {@link sysparser.parseExpression}.
576
+ * @returns Parsed node.
577
+ */
578
+ export function parseSquareExpression ( { tokens, parseStatement, combineTwo, node, at } : parser , put : boolean , dr : Range ) {
579
+ const { range } = tokens . shift ( ) ;
580
+
581
+ const expr : SquareExpression = { type : NodeType . Square , body : [ ] , value : '[' , range : dr } ;
582
+
583
+ while ( at ( ) . type !== TokenType . CloseSquare ) {
584
+ const stmt = parseStatement ( false ) ;
585
+ expr . body . push ( stmt ) ;
586
+ }
587
+ expr . range = combineTwo ( range , tokens . shift ( ) ) ;
588
+ return node ( expr , put ) ;
589
+ }
590
+
591
+
592
+ /**
593
+ * Parses a paren expression. Parameters are related to the environment of {@link syxparser.parseExpression} or {@link sysparser.parseExpression}.
594
+ * @returns Parsed node.
595
+ */
596
+ export function parseParenExpression ( { tokens, parseStatement, combineTwo, node, at } : parser , put : boolean , dr : Range ) {
597
+ const { range } = tokens . shift ( ) ;
598
+
599
+ const expr : ParenExpression = { type : NodeType . Paren , body : [ ] , value : '(' , range : dr } ;
600
+
601
+ while ( at ( ) . type !== TokenType . CloseParen ) {
602
+ const stmt = parseStatement ( false ) ;
603
+ expr . body . push ( stmt ) ;
604
+ }
605
+ expr . range = combineTwo ( range , tokens . shift ( ) ) ;
606
+ return node ( expr , put ) ;
607
+ }
608
+
609
+ /**
610
+ * Parses a primitive variable expression. Parameters are related to the environment of {@link syxparser.parseExpression} or {@link sysparser.parseExpression}.
611
+ * @returns Parsed node.
612
+ */
613
+ export function parsePrimitiveVariable ( { at, tokens, node, filePath, combineTwo } : parser , put : boolean ) {
614
+
615
+ if ( at ( 2 ) . type !== TokenType . IntNumber ) throw new CompilerError ( at ( 2 ) . range , `Expected index after ${ at ( ) . value } variable, found ${ at ( 2 ) . value } .` , filePath ) ;
616
+
617
+ const id = tokens . shift ( ) ; // id
618
+ tokens . shift ( ) ; // sep
619
+ const index = tokens . shift ( ) ; // index
620
+ const expr : VariableExpression = { index : parseInt ( index . value ) , type : NodeType . Variable , value : id . value , range : combineTwo ( id , index ) } ;
621
+
622
+ return node ( expr , put ) ;
623
+ }
624
+
596
625
}
0 commit comments