@@ -20,14 +20,14 @@ public override void SyntaxError(TextWriter output, IRecognizer recognizer, ITok
2020 {
2121 simaiParser . alerts . Add ( new Alert ( Warning ,
2222 string . Format ( Locale . RecoverInlineExtraneousToken , GetTokenErrorDisplay ( offendingSymbol ) ) ,
23- line : line , relevantNote : RelevantNote ( parser . Context ) ) ) ;
23+ line : line , relevantNote : RelevantNote ( parser . Context , recognizer , offendingSymbol ) ) ) ;
2424 return ;
2525 }
2626 else if ( msg . StartsWith ( "missing" ) )
2727 {
2828 simaiParser . alerts . Add ( new Alert ( Warning ,
2929 string . Format ( Locale . RecoverInlineMissingToken , GetTokenErrorDisplay ( offendingSymbol ) , parser . GetExpectedTokens ( ) . ToString ( parser . Vocabulary ) ) ,
30- line : line , relevantNote : RelevantNote ( parser . Context ) ) ) ;
30+ line : line , relevantNote : RelevantNote ( parser . Context , recognizer , offendingSymbol ) ) ) ;
3131 return ;
3232 }
3333 }
@@ -50,7 +50,7 @@ public override void SyntaxError(TextWriter output, IRecognizer recognizer, ITok
5050 message = string . Format ( Locale . AntlrUnknownError , msg ) ;
5151 break ;
5252 }
53- simaiParser . alerts . Add ( new Alert ( level , message , line : line , relevantNote : RelevantNote ( parser . Context ) ) ) ;
53+ simaiParser . alerts . Add ( new Alert ( level , message , line : line , relevantNote : RelevantNote ( parser . Context , recognizer , offendingSymbol ) ) ) ;
5454 }
5555
5656 // 词法分析的错误报告函数
@@ -75,14 +75,26 @@ public void SyntaxError(TextWriter output, IRecognizer recognizer, int offending
7575 }
7676
7777 // 从context获得为适合放进relevantNote里的形式
78- private static string ? RelevantNote ( RuleContext ? context )
78+ private static string ? RelevantNote ( RuleContext ? context , IRecognizer ? recognizer , IToken ? offendingSymbol )
7979 {
80- while ( true )
80+ string ? result = null ;
81+ while ( context != null )
8182 {
82- if ( context == null ) return null ;
83- if ( context . GetText ( ) . Length >= 5 ) return context . GetText ( ) ;
83+ if ( context . GetText ( ) . Length >= 5 )
84+ {
85+ result = context . GetText ( ) ;
86+ break ;
87+ }
8488 context = context . Parent ;
8589 }
90+
91+ if ( recognizer != null && offendingSymbol is { TokenIndex : >= 0 } && result is { Length : > 35 } )
92+ { // 根据offendingToken的位置,前截取5个、后截取三个token
93+ var i = offendingSymbol . TokenIndex ;
94+ result = ( ( ITokenStream ) recognizer . InputStream ) . GetText (
95+ new Interval ( Math . Max ( i - 5 , 0 ) , Math . Min ( i + 3 , recognizer . InputStream . Size - 1 ) ) ) ;
96+ }
97+ return result ;
8698 }
8799
88100 # region 用于暴露DefaultErrorStrategy内部的GetTokenErrorDisplay函数
0 commit comments