Skip to content

Commit a88398f

Browse files
committed
Fix Position's printed representation, include the source in ANTLR parse errors
1 parent 16e7e34 commit a88398f

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

pylasu/model/position.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ def __contains__(self, pos):
9999

100100
def __repr__(self):
101101
return f"Position(start={self.start}, end={self.end}"\
102-
+ (f", source={self.source}" if self.source is not None else "")
102+
+ (f", source={self.source}" if self.source is not None else "")\
103+
+ ")"
103104

104105
def __str__(self):
105106
str_rep = (f"{self.source}:" if self.source is not None else "") + str(self.start)

pylasu/parsing/antlr.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

143143
class 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

Comments
 (0)