# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.4.14 # from Racc grammer file "". # require 'racc/parser.rb' module Machete class Parser < Racc::Parser module_eval(<<'...end machete.y/module_eval...', 'machete.y', 175) include Matchers class SyntaxError < StandardError; end def parse(input) @input = input @pos = 0 do_parse end private def integer_value(value) if value =~ /^0[bB]/ value[2..-1].to_i(2) elsif value =~ /^0[oO]/ value[2..-1].to_i(8) elsif value =~ /^0[dD]/ value[2..-1].to_i(10) elsif value =~ /^0[xX]/ value[2..-1].to_i(16) elsif value =~ /^0/ value.to_i(8) else value.to_i end end def symbol_value(value) value[1..-1].to_sym end def string_value(value) quote = value[0..0] if quote == "'" value[1..-2].gsub("\\\\", "\\").gsub("\\'", "'") elsif quote == '"' value[1..-2]. gsub("\\\\", "\\"). gsub('\\"', '"'). gsub("\\n", "\n"). gsub("\\t", "\t"). gsub("\\r", "\r"). gsub("\\f", "\f"). gsub("\\v", "\v"). gsub("\\a", "\a"). gsub("\\e", "\e"). gsub("\\b", "\b"). gsub("\\s", "\s"). gsub(/\\([0-7]{1,3})/) { $1.to_i(8).chr }. gsub(/\\x([0-9a-fA-F]{1,2})/) { $1.to_i(16).chr } else raise "Unknown quote: #{quote.inspect}." end end REGEXP_OPTIONS = { 'i' => Regexp::IGNORECASE, 'm' => Regexp::MULTILINE, 'x' => Regexp::EXTENDED } def regexp_value(value) /\A\/(.*)\/([imx]*)\z/ =~ value pattern, options = $1, $2 Regexp.new(pattern, options.chars.map { |ch| REGEXP_OPTIONS[ch] }.inject(:|)) end # "^" needs to be here because if it were among operators recognized by # METHOD_NAME, "^=" would be recognized as two tokens. SIMPLE_TOKENS = [ "|", "<", ">", ",", "=", "^=", "^", "$=", "[", "]", "*=", "*", "+", "?", "{", "}" ] COMPLEX_TOKENS = [ [:NIL, /^nil/], [:TRUE, /^true/], [:FALSE, /^false/], # INTEGER needs to be before METHOD_NAME, otherwise e.g. "+1" would be # recognized as two tokens. [ :INTEGER, /^ [+-]? # sign ( 0[bB][01]+(_[01]+)* # binary (prefixed) | 0[oO][0-7]+(_[0-7]+)* # octal (prefixed) | 0[dD]\d+(_\d+)* # decimal (prefixed) | 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)* # hexadecimal (prefixed) | 0[0-7]*(_[0-7]+)* # octal (unprefixed) | [1-9]\d*(_\d+)* # decimal (unprefixed) ) /x ], [ :SYMBOL, /^ : ( # class name [A-Z][a-zA-Z0-9_]* | # regular method name [a-z_][a-zA-Z0-9_]*[?!=]? | # instance variable name @[a-zA-Z_][a-zA-Z0-9_]* | # class variable name @@[a-zA-Z_][a-zA-Z0-9_]* | # operator (sorted by length, then alphabetically) (<=>|===|\[\]=|\*\*|\+@|-@|<<|<=|==|=~|>=|>>|\[\]|[%&*+\-\/<>^`|~]) ) /x ], [ :STRING, /^ ( ' # sinqle-quoted string ( \\[\\'] # escape | [^'] # regular character )* ' | " # double-quoted string ( \\ # escape ( [\\"ntrfvaebs] # one-character escape | [0-7]{1,3} # octal number escape | x[0-9a-fA-F]{1,2} # hexadecimal number escape ) | [^"] # regular character )* " ) /x ], [ :REGEXP, /^ \/ ( \\ # escape ( [\\\/ntrfvaebs\(\)\[\]\{\}\-\.\?\*\+\|\^\$] # one-character escape | [0-7]{2,3} # octal number escape | x[0-9a-fA-F]{1,2} # hexadecimal number escape ) | [^\/] # regular character )* \/ [imx]* /x ], # ANY, EVEN and ODD need to be before METHOD_NAME, otherwise they would be # recognized as method names. [:ANY, /^any/], [:EVEN, /^even/], [:ODD, /^odd/], # We exclude "*", "+", "<", ">", "^" and "|" from method names since they are # lexed as simple tokens. This is because they have also other meanings in # Machette patterns beside Ruby method names. [ :METHOD_NAME, /^ ( # regular name [a-z_][a-zA-Z0-9_]*[?!=]? | # operator (sorted by length, then alphabetically) (<=>|===|\[\]=|\*\*|\+@|-@|<<|<=|==|=~|>=|>>|\[\]|[%&\-\/`~]) ) /x ], [:CLASS_NAME, /^[A-Z][a-zA-Z0-9_]*/] ] def next_token skip_whitespace return false if remaining_input.empty? # Complex tokens need to be before simple tokens, otherwise e.g. "<<" would be # recognized as two tokens. COMPLEX_TOKENS.each do |type, regexp| if remaining_input =~ regexp @pos += $&.length return [type, $&] end end SIMPLE_TOKENS.each do |token| if remaining_input[0...token.length] == token @pos += token.length return [token, token] end end raise SyntaxError, "Unexpected character: #{remaining_input[0..0].inspect}." end def skip_whitespace if remaining_input =~ /\A^[ \t\r\n]+/ @pos += $&.length end end def remaining_input @input[@pos..-1] end def on_error(error_token_id, error_value, value_stack) raise SyntaxError, "Unexpected token: #{error_value.inspect}." end ...end machete.y/module_eval... ##### State transition tables begin ### racc_action_table = [ 75, 24, 9, 10, 11, 12, 13, 14, 15, 16, 66, 67, 68, 7, 48, 9, 10, 11, 12, 13, 14, 15, 16, 17, 74, 8, 7, 76, 9, 10, 11, 12, 13, 14, 15, 16, 71, 18, 8, 7, 72, 9, 10, 11, 12, 13, 14, 15, 16, 73, 70, 8, 7, 19, 9, 10, 11, 12, 13, 14, 15, 16, 69, 18, 8, 7, 30, 31, 32, 51, 52, 53, 54, 33, 34, 35, 29, 8, 41, 38, 39, 77, 30, 31, 32, 47, 36, 37, 40, 33, 34, 35, 29, nil, 41, 38, 39, 18, 49, 50, 62, 63, 36, 37, 40, 43, 44, 55, 64, 65, 45, 46, 57, 58, nil, nil, nil, nil, nil, 56 ] racc_action_check = [ 70, 17, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 0, 22, 8, 8, 8, 8, 8, 8, 8, 8, 1, 70, 0, 8, 71, 18, 18, 18, 18, 18, 18, 18, 18, 56, 1, 8, 18, 57, 48, 48, 48, 48, 48, 48, 48, 48, 58, 55, 18, 48, 7, 51, 51, 51, 51, 51, 51, 51, 51, 55, 61, 48, 51, 19, 19, 19, 28, 28, 28, 28, 19, 19, 19, 19, 51, 19, 19, 19, 75, 50, 50, 50, 21, 19, 19, 19, 50, 50, 50, 50, nil, 50, 50, 50, 20, 26, 26, 52, 52, 50, 50, 50, 20, 20, 46, 53, 53, 20, 20, 46, 46, nil, nil, nil, nil, nil, 46 ] racc_action_pointer = [ 0, 23, nil, nil, nil, nil, nil, 38, 13, nil, nil, nil, nil, nil, nil, nil, nil, 1, 26, 64, 83, 59, -3, nil, nil, nil, 82, nil, 51, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 102, nil, 39, nil, 80, 52, 94, 102, 4, 33, 31, 11, 20, nil, nil, 49, nil, nil, nil, nil, nil, nil, nil, nil, -5, -2, nil, nil, nil, 52, nil, nil ] racc_action_default = [ -56, -56, -1, -3, -4, -5, -6, -7, -33, -48, -49, -50, -51, -52, -53, -54, -55, -56, -56, -56, -37, -56, -34, -35, 78, -2, -56, -9, -56, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -38, -39, -40, -41, -56, -32, -56, -8, -56, -56, -56, -56, -56, -56, -56, -56, -56, -36, -10, -11, -12, -15, -13, -16, -14, -17, -18, -42, -56, -56, -46, -47, -43, -56, -44, -45 ] racc_goto_table = [ 1, 23, 27, 21, 22, 42, 25, 26, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 60, nil, nil, nil, nil, nil, nil, nil, 59, nil, nil, nil, nil, nil, nil, nil, nil, nil, 61 ] racc_goto_check = [ 1, 12, 8, 10, 11, 13, 2, 7, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 8, nil, nil, nil, nil, nil, nil, nil, 12, nil, nil, nil, nil, nil, nil, nil, nil, nil, 1 ] racc_goto_pointer = [ nil, 0, -12, nil, nil, nil, nil, -12, -17, nil, -5, -4, -7, -15 ] racc_goto_default = [ nil, 20, 2, 3, 4, 5, 6, nil, nil, 28, nil, nil, nil, nil ] racc_reduce_table = [ 0, 0, :racc_error, 1, 31, :_reduce_none, 3, 31, :_reduce_2, 1, 32, :_reduce_none, 1, 32, :_reduce_none, 1, 32, :_reduce_none, 1, 32, :_reduce_none, 1, 33, :_reduce_7, 4, 33, :_reduce_8, 1, 37, :_reduce_none, 3, 37, :_reduce_10, 3, 38, :_reduce_11, 3, 38, :_reduce_12, 3, 38, :_reduce_13, 3, 38, :_reduce_14, 3, 38, :_reduce_15, 3, 38, :_reduce_16, 3, 38, :_reduce_17, 3, 38, :_reduce_18, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 1, 39, :_reduce_none, 3, 34, :_reduce_32, 0, 40, :_reduce_33, 1, 40, :_reduce_none, 1, 41, :_reduce_35, 3, 41, :_reduce_36, 1, 42, :_reduce_none, 2, 42, :_reduce_38, 1, 43, :_reduce_39, 1, 43, :_reduce_40, 1, 43, :_reduce_41, 3, 43, :_reduce_42, 4, 43, :_reduce_43, 4, 43, :_reduce_44, 5, 43, :_reduce_45, 3, 43, :_reduce_46, 3, 43, :_reduce_47, 1, 35, :_reduce_48, 1, 35, :_reduce_49, 1, 35, :_reduce_50, 1, 35, :_reduce_51, 1, 35, :_reduce_52, 1, 35, :_reduce_53, 1, 35, :_reduce_54, 1, 36, :_reduce_55 ] racc_reduce_n = 56 racc_shift_n = 78 racc_token_table = { false => 0, :error => 1, :NIL => 2, :TRUE => 3, :FALSE => 4, :INTEGER => 5, :SYMBOL => 6, :STRING => 7, :REGEXP => 8, :ANY => 9, :EVEN => 10, :ODD => 11, :METHOD_NAME => 12, :CLASS_NAME => 13, "|" => 14, "<" => 15, ">" => 16, "," => 17, "=" => 18, "^=" => 19, "$=" => 20, "*=" => 21, "*" => 22, "+" => 23, "^" => 24, "[" => 25, "]" => 26, "?" => 27, "{" => 28, "}" => 29 } racc_nt_base = 30 racc_use_result_var = true Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ "$end", "error", "NIL", "TRUE", "FALSE", "INTEGER", "SYMBOL", "STRING", "REGEXP", "ANY", "EVEN", "ODD", "METHOD_NAME", "CLASS_NAME", "\"|\"", "\"<\"", "\">\"", "\",\"", "\"=\"", "\"^=\"", "\"$=\"", "\"*=\"", "\"*\"", "\"+\"", "\"^\"", "\"[\"", "\"]\"", "\"?\"", "\"{\"", "\"}\"", "$start", "expression", "primary", "node", "array", "literal", "any", "attrs", "attr", "method_name", "items_opt", "items", "item", "quantifier" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted # reduce 1 omitted module_eval(<<'.,.,', 'machete.y', 44) def _reduce_2(val, _values, result) result = if val[0].is_a?(ChoiceMatcher) ChoiceMatcher.new(val[0].alternatives << val[2]) else ChoiceMatcher.new([val[0], val[2]]) end result end .,., # reduce 3 omitted # reduce 4 omitted # reduce 5 omitted # reduce 6 omitted module_eval(<<'.,.,', 'machete.y', 57) def _reduce_7(val, _values, result) result = NodeMatcher.new(val[0].to_sym) result end .,., module_eval(<<'.,.,', 'machete.y', 60) def _reduce_8(val, _values, result) result = NodeMatcher.new(val[0].to_sym, val[2]) result end .,., # reduce 9 omitted module_eval(<<'.,.,', 'machete.y', 64) def _reduce_10(val, _values, result) result = val[0].merge(val[2]) result end .,., module_eval(<<'.,.,', 'machete.y', 66) def _reduce_11(val, _values, result) result = { val[0].to_sym => val[2] } result end .,., module_eval(<<'.,.,', 'machete.y', 68) def _reduce_12(val, _values, result) result = { val[0].to_sym => SymbolRegexpMatcher.new( Regexp.new("^" + Regexp.escape(symbol_value(val[2]).to_s)) ) } result end .,., module_eval(<<'.,.,', 'machete.y', 75) def _reduce_13(val, _values, result) result = { val[0].to_sym => SymbolRegexpMatcher.new( Regexp.new(Regexp.escape(symbol_value(val[2]).to_s) + "$") ) } result end .,., module_eval(<<'.,.,', 'machete.y', 82) def _reduce_14(val, _values, result) result = { val[0].to_sym => SymbolRegexpMatcher.new( Regexp.new(Regexp.escape(symbol_value(val[2]).to_s)) ) } result end .,., module_eval(<<'.,.,', 'machete.y', 89) def _reduce_15(val, _values, result) result = { val[0].to_sym => StringRegexpMatcher.new( Regexp.new("^" + Regexp.escape(string_value(val[2]))) ) } result end .,., module_eval(<<'.,.,', 'machete.y', 96) def _reduce_16(val, _values, result) result = { val[0].to_sym => StringRegexpMatcher.new( Regexp.new(Regexp.escape(string_value(val[2])) + "$") ) } result end .,., module_eval(<<'.,.,', 'machete.y', 103) def _reduce_17(val, _values, result) result = { val[0].to_sym => StringRegexpMatcher.new( Regexp.new(Regexp.escape(string_value(val[2]))) ) } result end .,., module_eval(<<'.,.,', 'machete.y', 110) def _reduce_18(val, _values, result) result = { val[0].to_sym => IndifferentRegexpMatcher.new( Regexp.new(regexp_value(val[2])) ) } result end .,., # reduce 19 omitted # reduce 20 omitted # reduce 21 omitted # reduce 22 omitted # reduce 23 omitted # reduce 24 omitted # reduce 25 omitted # reduce 26 omitted # reduce 27 omitted # reduce 28 omitted # reduce 29 omitted # reduce 30 omitted # reduce 31 omitted module_eval(<<'.,.,', 'machete.y', 134) def _reduce_32(val, _values, result) result = ArrayMatcher.new(val[1]) result end .,., module_eval(<<'.,.,', 'machete.y', 136) def _reduce_33(val, _values, result) result = [] result end .,., # reduce 34 omitted module_eval(<<'.,.,', 'machete.y', 139) def _reduce_35(val, _values, result) result = [val[0]] result end .,., module_eval(<<'.,.,', 'machete.y', 140) def _reduce_36(val, _values, result) result = val[0] << val[2] result end .,., # reduce 37 omitted module_eval(<<'.,.,', 'machete.y', 143) def _reduce_38(val, _values, result) result = Quantifier.new(val[0], *val[1]) result end .,., module_eval(<<'.,.,', 'machete.y', 145) def _reduce_39(val, _values, result) result = [0, nil, 1] result end .,., module_eval(<<'.,.,', 'machete.y', 146) def _reduce_40(val, _values, result) result = [1, nil, 1] result end .,., module_eval(<<'.,.,', 'machete.y', 147) def _reduce_41(val, _values, result) result = [0, 1, 1] result end .,., module_eval(<<'.,.,', 'machete.y', 149) def _reduce_42(val, _values, result) result = [integer_value(val[1]), integer_value(val[1]), 1] result end .,., module_eval(<<'.,.,', 'machete.y', 152) def _reduce_43(val, _values, result) result = [integer_value(val[1]), nil, 1] result end .,., module_eval(<<'.,.,', 'machete.y', 155) def _reduce_44(val, _values, result) result = [0, integer_value(val[2]), 1] result end .,., module_eval(<<'.,.,', 'machete.y', 158) def _reduce_45(val, _values, result) result = [integer_value(val[1]), integer_value(val[3]), 1] result end .,., module_eval(<<'.,.,', 'machete.y', 160) def _reduce_46(val, _values, result) result = [0, nil, 2] result end .,., module_eval(<<'.,.,', 'machete.y', 161) def _reduce_47(val, _values, result) result = [1, nil, 2] result end .,., module_eval(<<'.,.,', 'machete.y', 163) def _reduce_48(val, _values, result) result = LiteralMatcher.new(nil) result end .,., module_eval(<<'.,.,', 'machete.y', 164) def _reduce_49(val, _values, result) result = LiteralMatcher.new(true) result end .,., module_eval(<<'.,.,', 'machete.y', 165) def _reduce_50(val, _values, result) result = LiteralMatcher.new(false) result end .,., module_eval(<<'.,.,', 'machete.y', 166) def _reduce_51(val, _values, result) result = LiteralMatcher.new(integer_value(val[0])) result end .,., module_eval(<<'.,.,', 'machete.y', 167) def _reduce_52(val, _values, result) result = LiteralMatcher.new(symbol_value(val[0])) result end .,., module_eval(<<'.,.,', 'machete.y', 168) def _reduce_53(val, _values, result) result = LiteralMatcher.new(string_value(val[0])) result end .,., module_eval(<<'.,.,', 'machete.y', 169) def _reduce_54(val, _values, result) result = LiteralMatcher.new(regexp_value(val[0])) result end .,., module_eval(<<'.,.,', 'machete.y', 171) def _reduce_55(val, _values, result) result = AnyMatcher.new result end .,., def _reduce_none(val, _values, result) val[0] end end # class Parser end # module Machete