@@ -90,48 +90,47 @@ export class VbaFmtParser extends vbafmtParser {
90
90
91
91
export class VbaErrorHandler extends DefaultErrorStrategy {
92
92
override recover ( recognizer : Parser , e : RecognitionException ) : void {
93
+ // Try base recovery for some reason.
94
+ super . recover ( recognizer , e ) ;
95
+
93
96
// Consume the error token if look-ahead is not EOF.
94
97
const inputStream = recognizer . inputStream ;
95
98
if ( inputStream . LA ( 1 ) !== Token . EOF ) {
99
+ const intervalSet = this . getErrorRecoverySet ( recognizer ) ;
100
+ console . log ( `recover consuming ${ recognizer . getCurrentToken ( ) } ` ) ;
96
101
inputStream . consume ( ) ;
102
+ // this.consumeUntil(recognizer, intervalSet);
97
103
}
98
104
this . endErrorCondition ( recognizer ) ;
99
105
}
100
106
101
107
override recoverInline ( recognizer : Parser ) : Token {
102
- const stream = recognizer . inputStream ;
103
- const thisToken = recognizer . getCurrentToken ( ) ;
104
-
105
- // Recover using deletion strategy.
106
- const nextToken = stream . LT ( 2 ) ;
107
- const expectedTokens = recognizer . getExpectedTokens ( ) ;
108
- if ( nextToken && expectedTokens . contains ( nextToken . type ) ) {
109
- recognizer . consume ( ) ;
110
- this . reportMatch ( recognizer ) ;
111
- return thisToken ;
108
+ // Attempt to recover using token deletion.
109
+ const matchedSymbol = this . singleTokenDeletion ( recognizer ) ;
110
+ if ( matchedSymbol ) {
111
+ recognizer . consume ( ) ;
112
+ return matchedSymbol ;
112
113
}
113
-
114
- // Failsafe to prevent circular insertions.
115
- const MAXRECURSION = - 20 ;
116
- for ( let i = - 1 ; i >= MAXRECURSION ; i -- ) {
117
- if ( i <= - 20 ) {
118
- throw new InputMismatchException ( recognizer ) ;
119
- }
120
- const wasInsertedToken = this . isTokenPositionMatch ( thisToken , recognizer . inputStream . LT ( i ) ) ;
121
- if ( ! wasInsertedToken ) {
122
- break ;
123
- }
114
+ // Attempt to recover using token insertion.
115
+ if ( this . singleTokenInsertion ( recognizer ) ) {
116
+ return this . getMissingSymbol ( recognizer ) ;
124
117
}
125
118
126
119
// When we don't know what could come next, invalidate the entire line.
120
+ const stream = recognizer . inputStream ;
121
+ const expectedTokens = recognizer . getExpectedTokens ( ) ;
127
122
if ( expectedTokens . minElement === - 1 ) {
128
123
const invalidTokens : Token [ ] = [ ] ;
129
124
while ( ! [ vbaLexer . NEWLINE , vbaLexer . EOF ] . includes ( stream . LA ( 1 ) ) ) {
130
125
invalidTokens . push ( stream . LT ( 1 ) ! ) ;
126
+ console . log ( `inline consuming ${ recognizer . getCurrentToken ( ) } ` ) ;
131
127
recognizer . consume ( ) ;
132
128
}
133
129
if ( invalidTokens . length > 0 ) {
134
130
const missingToken = this . createErrorToken ( recognizer , invalidTokens ) ;
131
+ this . reportMatch ( recognizer ) ;
132
+ console . log ( `inline consuming ${ recognizer . getCurrentToken ( ) } ` ) ;
133
+ recognizer . consume ( ) ;
135
134
return missingToken ;
136
135
}
137
136
}
0 commit comments