@@ -190,11 +190,11 @@ mutable struct ParserState
190190 id_to_debuginfo::Dict{{Vector{{UInt8}},Vector{{Pair{{Tuple{{UInt64,UInt64}},String}}}}}}
191191 _current_fragment_id::Union{{Nothing,Vector{{UInt8}}}}
192192 _relation_id_to_name::Dict{{Tuple{{UInt64,UInt64}},String}}
193- provenance::Dict{{Int ,Span}}
193+ provenance::Dict{{Any ,Span}}
194194 _line_starts::Vector{{Int}}
195195
196196 function ParserState(tokens::Vector{{Token}}, input_str::String)
197- return new(tokens, 1, Dict(), nothing, Dict(), Dict(), _compute_line_starts(input_str))
197+ return new(tokens, 1, Dict(), nothing, Dict(), Dict{{Any,Span}} (), _compute_line_starts(input_str))
198198 end
199199end
200200
@@ -329,36 +329,43 @@ end
329329# --- Parse functions ---
330330{parse_nonterminal_defns}
331331
332- function parse_transaction(input::String)
333- lexer = Lexer(input)
334- parser = ParserState(lexer.tokens, input)
335- result = parse_{start_name}(parser)
336- # Check for unconsumed tokens (except EOF)
332+ function _check_eof(parser::ParserState)
337333 if parser.pos <= length(parser.tokens)
338334 remaining_token = lookahead(parser, 0)
339335 if remaining_token.type != "\$"
340336 throw(ParseError("Unexpected token at end of input: $remaining_token"))
341337 end
342338 end
343- return result, parser.provenance
339+ return nothing
340+ end
341+
342+ function parse_transaction(input::String)
343+ lexer = Lexer(input)
344+ parser = ParserState(lexer.tokens, input)
345+ result = parse_{start_name}(parser)
346+ _check_eof(parser)
347+ return result
344348end
345349
346350function parse_fragment(input::String)
347351 lexer = Lexer(input)
348352 parser = ParserState(lexer.tokens, input)
349353 result = parse_fragment(parser)
350- # Check for unconsumed tokens (except EOF)
351- if parser.pos <= length(parser.tokens)
352- remaining_token = lookahead(parser, 0)
353- if remaining_token.type != "\$"
354- throw(ParseError("Unexpected token at end of input: $remaining_token"))
355- end
356- end
357- return result, parser.provenance
354+ _check_eof(parser)
355+ return result
358356end
359357
360358function parse(input::String)
361- return parse_transaction(input)
359+ lexer = Lexer(input)
360+ parser = ParserState(lexer.tokens, input)
361+ result = parse_{start_name}(parser)
362+ _check_eof(parser)
363+ # Add root span at () key
364+ root_offset = lexer.tokens[1].start_pos
365+ if haskey(parser.provenance, root_offset)
366+ parser.provenance[()] = parser.provenance[root_offset]
367+ end
368+ return result, parser.provenance
362369end
363370
364371# Export main parse functions and error type
0 commit comments