@@ -36,7 +36,7 @@ def parse(self, input_stream: Union[InputStream, str], consider_range: bool = Tr
3636 start = time .time_ns ()
3737 if type (input_stream ) is str :
3838 input_stream = InputStream (input_stream )
39- first_stage = self .parse_first_stage (input_stream , measure_lexing_time )
39+ first_stage = self .parse_first_stage (input_stream , measure_lexing_time , source )
4040 issues = first_stage .issues
4141 ast = self .parse_tree_to_ast (first_stage .root , consider_range , issues , source )
4242 self .assign_parents (ast )
@@ -63,7 +63,7 @@ def parse_first_stage(
6363 issues = []
6464 lexing_time : Optional [int ] = None
6565 total_time : int = time .time_ns ()
66- parser = self .create_parser (input_stream , issues )
66+ parser = self .create_parser (input_stream , issues , source )
6767 if measure_lexing_time :
6868 token_stream = parser .getInputStream ()
6969 if isinstance (token_stream , CommonTokenStream ):
@@ -77,16 +77,16 @@ def parse_first_stage(
7777 total_time = (time .time_ns () - total_time ) // 1_000_000
7878 return FirstStageParsingResult (issues , root , None , total_time , lexing_time , source )
7979
80- def create_parser (self , input_stream : InputStream , issues : List [Issue ]) -> Parser :
80+ def create_parser (self , input_stream : InputStream , issues : List [Issue ], source : Optional [ Source ] ) -> Parser :
8181 """Creates the first-stage parser."""
8282 lexer = self .create_antlr_lexer (input_stream )
83- self .attach_listeners (lexer , issues )
83+ self .attach_listeners (lexer , issues , source )
8484 token_stream = self .create_token_stream (lexer )
8585 parser = self .create_antlr_parser (token_stream )
8686 # Assign interpreter to avoid caching DFA states indefinitely across executions
8787 parser ._interp = \
8888 ParserATNSimulator (parser , parser .atn , parser ._interp .decisionToDFA , self .prediction_context_cache )
89- self .attach_listeners (parser , issues )
89+ self .attach_listeners (parser , issues , source )
9090 return parser
9191
9292 def invoke_root_rule (self , parser : Parser ):
@@ -135,19 +135,20 @@ def create_antlr_parser(self, token_stream: TokenStream) -> Parser:
135135 def parse_tree_to_ast (self , root , consider_range : bool , issues : List [Issue ], source : Source ) -> Optional [Node ]:
136136 pass
137137
138- def attach_listeners (self , recognizer : Recognizer , issues : List [Issue ]):
138+ def attach_listeners (self , recognizer : Recognizer , issues : List [Issue ], source : Source ):
139139 recognizer .removeErrorListeners ()
140- recognizer .addErrorListener (ParserErrorListener (issues ))
140+ recognizer .addErrorListener (ParserErrorListener (issues , source ))
141141
142142
143143class ParserErrorListener (ErrorListener ):
144- def __init__ (self , issues : List [Issue ]):
144+ def __init__ (self , issues : List [Issue ], source : Source ):
145145 self .issues = issues
146+ self .source = source
146147
147148 def syntaxError (self , recognizer , offending_symbol , line , column , msg , e ):
148149 start_point = Point (line , column )
149150 end_point = start_point
150151 if isinstance (offending_symbol , Token ):
151152 end_point = token_end_point (offending_symbol )
152153 msg = (msg or "unspecified" ).capitalize ()
153- self .issues .append (Issue (IssueType .SYNTACTIC , msg , position = Position (start_point , end_point )))
154+ self .issues .append (Issue (IssueType .SYNTACTIC , msg , position = Position (start_point , end_point , self . source )))
0 commit comments