@@ -90,48 +90,47 @@ export class VbaFmtParser extends vbafmtParser {
9090
9191export class VbaErrorHandler extends DefaultErrorStrategy {
9292 override recover ( recognizer : Parser , e : RecognitionException ) : void {
93+ // Try base recovery for some reason.
94+ super . recover ( recognizer , e ) ;
95+
9396 // Consume the error token if look-ahead is not EOF.
9497 const inputStream = recognizer . inputStream ;
9598 if ( inputStream . LA ( 1 ) !== Token . EOF ) {
99+ const intervalSet = this . getErrorRecoverySet ( recognizer ) ;
100+ console . log ( `recover consuming ${ recognizer . getCurrentToken ( ) } ` ) ;
96101 inputStream . consume ( ) ;
102+ // this.consumeUntil(recognizer, intervalSet);
97103 }
98104 this . endErrorCondition ( recognizer ) ;
99105 }
100106
101107 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 ;
112113 }
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 ) ;
124117 }
125118
126119 // When we don't know what could come next, invalidate the entire line.
120+ const stream = recognizer . inputStream ;
121+ const expectedTokens = recognizer . getExpectedTokens ( ) ;
127122 if ( expectedTokens . minElement === - 1 ) {
128123 const invalidTokens : Token [ ] = [ ] ;
129124 while ( ! [ vbaLexer . NEWLINE , vbaLexer . EOF ] . includes ( stream . LA ( 1 ) ) ) {
130125 invalidTokens . push ( stream . LT ( 1 ) ! ) ;
126+ console . log ( `inline consuming ${ recognizer . getCurrentToken ( ) } ` ) ;
131127 recognizer . consume ( ) ;
132128 }
133129 if ( invalidTokens . length > 0 ) {
134130 const missingToken = this . createErrorToken ( recognizer , invalidTokens ) ;
131+ this . reportMatch ( recognizer ) ;
132+ console . log ( `inline consuming ${ recognizer . getCurrentToken ( ) } ` ) ;
133+ recognizer . consume ( ) ;
135134 return missingToken ;
136135 }
137136 }
0 commit comments