# Build and return a full AST.
fun parse: Start
do
push(0, null)
var lexer = _lexer
loop
var token = lexer.peek
if token isa AError then
return new Start(null, token)
end
var state = self.state
var index = token.parser_index
var action_type = parser_action(state, 2)
var action_value = parser_action(state, 3)
var low = 1
var high = parser_action(state, 0) - 1
while low <= high do
var middle = (low + high) / 2
var subindex = middle * 3 + 1 # +1 because parser_action(state, 0) is the length
var goal = parser_action(state, subindex)
if index < goal then
high = middle - 1
else if index > goal then
low = middle + 1
else
action_type = parser_action(state, subindex+1)
action_value = parser_action(state, subindex+2)
break
end
end
if action_type == 0 then # SHIFT
push(action_value, lexer.next)
else if action_type == 1 then # REDUCE
_reduce_table[action_value].action(self)
else if action_type == 2 then # ACCEPT
var node2 = lexer.next
assert node2 isa EOF
var node1 = pop
assert node1 isa AModule
var node = new Start(node1, node2)
node2.parent = node
(new ComputeProdLocationVisitor(lexer.file.first_token)).enter_visit(node)
return node
else if action_type == 3 then # ERROR
# skip injected tokens
while not isset token._location do token = lexer.next
var node2 = new AParserError.init_parser_error("Syntax Error: unexpected {token}.", token.location, token)
var node = new Start(null, node2)
return node
end
end
end
src/parser/parser_work.nit:98,2--155,4