module Acorn::TransitionTable::Consume

Direct including types

Defined in:

acorn/transition_table/consume.cr

Constant Summary

CONSUME_DEFINITION = "def consume(input : String, acc : Accumulator) : Nil\n current_states = Set(Int32).new\n current_states << 0\n next_states = Set(Int32).new\n finishing_states = Set(Int32).new\n\n char = nil\n idx = 0\n last_idx = input.size - 1\n token_begin = 0\n while idx <= last_idx\n char ||= input.char_at(idx)\n current_states.each do |current_state|\n transitions = $$table[current_state]\n transitions.each do |move, end_state|\n case move\n when Char\n if move == char\n next_states << end_state\n end\n when :any\n next_states << end_state\n when :epsilon\n finishing_states << current_state\n when Range(Char, Char)\n if move.includes?(char)\n next_states << end_state\n end\n else\n raise \"Unsupported transition move: \#{move} (between \#{current_state} and \#{end_state})\"\n end\n end\n end\n\n # Follow next_states if possible (this finds the longest match)\n if next_states.any?\n idx += 1\n char = nil\n current_states.clear\n current_states.concat(next_states)\n next_states.clear\n finishing_states.clear\n elsif finishing_states.any?\n finishing_state = finishing_states.first\n $$actions[finishing_state].call(acc, input, token_begin, idx - 1)\n token_begin = idx\n current_states.clear\n current_states << 0\n finishing_states.clear\n next_states.clear\n else\n raise UnexpectedInputError.new(char, idx)\n end\n end\n\n # last token:\n action = nil\n current_states.each do |current_state|\n action = $$actions[current_state]?\n if action\n action.call(acc, input, token_begin, idx - 1)\n break\n end\n end\n # didn't find an end state:\n if action.nil?\n raise UnexpectedEndError.new(idx)\n end\nend"

This method is shared by StaticMachine and RuntimeMachine

Macro Summary

Macro Detail

macro define_consume_method(table_id, actions_id) #

[View source]