@@ -530,16 +530,24 @@ function parseIf(tokens: Token[]): IfStatement {
530
530
const test = parseExpression ( tokens )
531
531
consume ( tokens , ')' )
532
532
533
- const consequent = parseBlock ( tokens )
533
+ let consequent : Statement
534
+ if ( tokens [ 0 ] . value === '{' ) {
535
+ consequent = parseBlock ( tokens )
536
+ } else {
537
+ consequent = parseStatement ( tokens )
538
+ }
534
539
535
540
let alternate = null
536
- if ( tokens [ 0 ] && tokens [ 0 ] . value === 'else' ) {
541
+ const elseToken = tokens [ 0 ]
542
+ if ( elseToken && elseToken . value === 'else' ) {
537
543
consume ( tokens , 'else' )
538
544
539
545
if ( tokens [ 0 ] && ( tokens [ 0 ] as Token ) . value === 'if' ) {
540
546
alternate = parseIf ( tokens )
541
- } else {
547
+ } else if ( tokens [ 0 ] . value === '{' ) {
542
548
alternate = parseBlock ( tokens )
549
+ } else {
550
+ alternate = parseStatement ( tokens )
543
551
}
544
552
}
545
553
@@ -689,6 +697,32 @@ function isVariable(tokens: Token[]): boolean {
689
697
return tokens [ i ] ?. type !== 'symbol'
690
698
}
691
699
700
+ function parseStatement ( tokens : Token [ ] ) : Statement {
701
+ const token = tokens [ 0 ]
702
+ let statement : Statement | null = null
703
+
704
+ if ( token . value === '#' ) statement = parsePreprocessor ( tokens )
705
+ else if ( token . value === 'struct' ) statement = parseStruct ( tokens )
706
+ else if ( token . value === 'continue' ) statement = parseContinue ( tokens )
707
+ else if ( token . value === 'break' ) statement = parseBreak ( tokens )
708
+ else if ( token . value === 'discard' ) statement = parseDiscard ( tokens )
709
+ else if ( token . value === 'return' ) statement = parseReturn ( tokens )
710
+ else if ( token . value === 'if' ) statement = parseIf ( tokens )
711
+ else if ( token . value === 'while' ) statement = parseWhile ( tokens )
712
+ else if ( token . value === 'for' ) statement = parseFor ( tokens )
713
+ else if ( token . value === 'do' ) statement = parseDoWhile ( tokens )
714
+ else if ( token . value === 'switch' ) statement = parseSwitch ( tokens )
715
+ else if ( token . value === 'precision' ) statement = parsePrecision ( tokens )
716
+ else if ( isVariable ( tokens ) ) statement = parseIndeterminate ( tokens )
717
+ else {
718
+ const expression = parseExpression ( tokens )
719
+ consume ( tokens , ';' )
720
+ statement = { type : 'ExpressionStatement' , expression }
721
+ }
722
+
723
+ return statement
724
+ }
725
+
692
726
function parseStatements ( tokens : Token [ ] ) : Statement [ ] {
693
727
const body : Statement [ ] = [ ]
694
728
let scopeIndex = 0
@@ -699,29 +733,8 @@ function parseStatements(tokens: Token[]): Statement[] {
699
733
scopeIndex += getScopeDelta ( token )
700
734
if ( scopeIndex < 0 ) break
701
735
702
- let statement : Statement | null = null
703
-
704
736
if ( token . value === 'case' || token . value === 'default' ) break
705
- else if ( token . value === '#' ) statement = parsePreprocessor ( tokens )
706
- else if ( token . value === 'struct' ) statement = parseStruct ( tokens )
707
- else if ( token . value === 'continue' ) statement = parseContinue ( tokens )
708
- else if ( token . value === 'break' ) statement = parseBreak ( tokens )
709
- else if ( token . value === 'discard' ) statement = parseDiscard ( tokens )
710
- else if ( token . value === 'return' ) statement = parseReturn ( tokens )
711
- else if ( token . value === 'if' ) statement = parseIf ( tokens )
712
- else if ( token . value === 'while' ) statement = parseWhile ( tokens )
713
- else if ( token . value === 'for' ) statement = parseFor ( tokens )
714
- else if ( token . value === 'do' ) statement = parseDoWhile ( tokens )
715
- else if ( token . value === 'switch' ) statement = parseSwitch ( tokens )
716
- else if ( token . value === 'precision' ) statement = parsePrecision ( tokens )
717
- else if ( isVariable ( tokens ) ) statement = parseIndeterminate ( tokens )
718
- else {
719
- const expression = parseExpression ( tokens )
720
- consume ( tokens , ';' )
721
- statement = { type : 'ExpressionStatement' , expression }
722
- }
723
-
724
- body . push ( statement )
737
+ body . push ( parseStatement ( tokens ) )
725
738
}
726
739
727
740
return body
0 commit comments