# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.4.9 # from Racc grammer file "". # require 'racc/parser.rb' # # file:: farts_parser.rb # author:: Jon A. Lambert # version:: 2.8.0 # date:: 01/19/2006 # # This source code copyright (C) 2005, 2006 by Jon A. Lambert # All rights reserved. # # Released under the terms of the TeensyMUD Public License # See LICENSE file for additional information. # $:.unshift "lib" if !$:.include? "lib" $:.unshift "vendor" if !$:.include? "vendor" if $0 == __FILE__ Dir.chdir("../..") $:.unshift "../../lib" end require 'farts/farts_lexer' require 'farts/farts_lib' module Farts class Parser < Racc::Parser module_eval(<<'...end farts_parser.y/module_eval...', 'farts_parser.y', 109) def initialize @scope = {} end def parse( str ) @sc = Farts::Lexer.new(str) @yydebug = true if $DEBUG do_parse end def next_token @sc.next_token end def on_error( t, val, values ) raise Racc::ParseError, "Error: #{@sc.lineno}:#{@sc.tokenpos} syntax error at '#{val}'" end ...end farts_parser.y/module_eval... ##### State transition tables begin ### racc_action_table = [ 12, 26, 27, 28, 29, 24, 25, 30, 31, 26, 27, 28, 29, 24, 25, 12, 35, 19, 13, 55, 14, 17, 18, 20, 8, 21, 22, 9, 10, 37, 12, 11, 19, 13, 58, 14, 17, 18, 20, 8, 21, 22, 9, 10, 12, 57, 11, 19, 13, 42, 14, 17, 18, 20, 41, 21, 22, 12, 32, 33, 35, 19, 13, 61, 14, 17, 18, 20, 12, 21, 22, 62, 56, 35, 19, 13, 63, 14, 17, 18, 20, 12, 21, 22, 35, 19, 13, 43, 14, 17, 18, 20, 12, 21, 22, 36, 37, 35, 19, 13, 23, 14, 17, 18, 20, 12, 21, 22, 35, 19, 13, 3, 14, 17, 18, 20, 12, 21, 22, nil, nil, 35, 19, 13, nil, 14, 17, 18, 20, 12, 21, 22, 35, 19, 13, nil, 14, 17, 18, 20, 12, 21, 22, nil, nil, 35, 19, 13, nil, 14, 17, 18, 20, 12, 21, 22, 35, 19, 13, nil, 14, 17, 18, 20, 12, 21, 22, nil, nil, 35, 19, 13, nil, 14, 17, 18, 20, 12, 21, 22, 35, 19, 13, nil, 14, 17, 18, 20, 12, 21, 22, nil, nil, 35, 19, 13, nil, 14, 17, 18, 20, nil, 21, 22, 35, 19, 13, 12, 14, 17, 18, 20, nil, 21, 22, nil, 8, nil, nil, 9, 10, nil, 60, 11, 19, 13, nil, 14, 17, 18, 20, nil, 21, 22, 26, 27, 28, 29, 24, 25, 30, 31, 26, 27, 28, 29, 24, 25, 30, 31, 26, 27, 28, 29, 24, 25, 30, 31, 26, 27, 28, 29, 24, 25, 30, 31, 26, 27, 28, 29, 24, 25, 30, 26, 27, 28, 29, -42, -42, 26, 27, 28, 29, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42 ] racc_action_check = [ 37, 39, 39, 39, 39, 39, 39, 39, 39, 50, 50, 50, 50, 50, 50, 2, 37, 37, 37, 39, 37, 37, 37, 37, 2, 37, 37, 2, 2, 35, 64, 2, 2, 2, 43, 2, 2, 2, 2, 64, 2, 2, 64, 64, 31, 42, 64, 64, 64, 21, 64, 64, 64, 64, 20, 64, 64, 62, 8, 8, 31, 31, 31, 54, 31, 31, 31, 31, 10, 31, 31, 54, 41, 62, 62, 62, 59, 62, 62, 62, 62, 30, 62, 62, 10, 10, 10, 22, 10, 10, 10, 10, 12, 10, 10, 11, 11, 30, 30, 30, 3, 30, 30, 30, 30, 13, 30, 30, 12, 12, 12, 1, 12, 12, 12, 12, 14, 12, 12, nil, nil, 13, 13, 13, nil, 13, 13, 13, 13, 29, 13, 13, 14, 14, 14, nil, 14, 14, 14, 14, 27, 14, 14, nil, nil, 29, 29, 29, nil, 29, 29, 29, 29, 28, 29, 29, 27, 27, 27, nil, 27, 27, 27, 27, 24, 27, 27, nil, nil, 28, 28, 28, nil, 28, 28, 28, 28, 25, 28, 28, 24, 24, 24, nil, 24, 24, 24, 24, 26, 24, 24, nil, nil, 25, 25, 25, nil, 25, 25, 25, 25, nil, 25, 25, 26, 26, 26, 52, 26, 26, 26, 26, nil, 26, 26, nil, 52, nil, nil, 52, 52, nil, 52, 52, 52, 52, nil, 52, 52, 52, 52, nil, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 5, 5, 5, 5, 5, 5, 5, 5, 65, 65, 65, 65, 65, 65, 65, 65, 34, 34, 34, 34, 34, 34, 34, 34, 51, 51, 51, 51, 51, 51, 51, 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 49, 49, 49, 49, 48, 48, 48, 48, 47, 47, 47, 47, 46, 46, 46, 46 ] racc_action_pointer = [ nil, 111, 12, 100, nil, 238, nil, nil, 45, nil, 65, 75, 89, 102, 113, nil, nil, nil, nil, nil, 27, 22, 60, nil, 161, 174, 185, 137, 150, 126, 78, 41, nil, nil, 254, 8, nil, -3, nil, -3, nil, 53, 26, 15, 275, 269, 293, 289, 285, 281, 5, 262, 204, 230, 41, nil, nil, nil, nil, 59, nil, nil, 54, nil, 27, 246 ] racc_action_default = [ -2, -42, -1, -42, -3, -4, -5, -6, -7, -10, -42, -14, -42, -42, -42, -27, -28, -29, -30, -31, -32, -34, -36, 66, -42, -42, -42, -42, -42, -42, -42, -42, -8, -9, -2, -42, -15, -39, -16, -42, -26, -42, -42, -42, -17, -18, -19, -20, -21, -22, -23, -24, -13, -40, -42, -25, -33, -35, -37, -42, -2, -38, -42, -11, -12, -41 ] racc_goto_table = [ 2, 34, 1, 38, 39, 40, 59, 54, nil, nil, nil, nil, nil, nil, nil, 44, 45, 46, 47, 48, 49, 50, 51, nil, nil, nil, nil, nil, 53, nil, nil, nil, nil, nil, 52, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 65, nil, nil, nil, nil, nil, nil, 64 ] racc_goto_check = [ 2, 4, 1, 4, 4, 4, 7, 10, nil, nil, nil, nil, nil, nil, nil, 4, 4, 4, 4, 4, 4, 4, 4, nil, nil, nil, nil, nil, 4, nil, nil, nil, nil, nil, 2, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 4, nil, nil, nil, nil, nil, nil, 2 ] racc_goto_pointer = [ nil, 2, 0, nil, -9, nil, nil, -46, nil, nil, -30 ] racc_goto_default = [ nil, nil, nil, 4, 5, 6, 7, nil, 15, 16, nil ] racc_reduce_table = [ 0, 0, :racc_error, 1, 32, :_reduce_1, 0, 33, :_reduce_2, 2, 33, :_reduce_3, 1, 34, :_reduce_none, 1, 34, :_reduce_none, 1, 34, :_reduce_none, 1, 34, :_reduce_7, 2, 34, :_reduce_8, 2, 34, :_reduce_9, 1, 34, :_reduce_10, 5, 37, :_reduce_11, 2, 38, :_reduce_12, 0, 38, :_reduce_13, 1, 36, :_reduce_14, 2, 36, :_reduce_15, 2, 35, :_reduce_16, 3, 35, :_reduce_17, 3, 35, :_reduce_18, 3, 35, :_reduce_19, 3, 35, :_reduce_20, 3, 35, :_reduce_21, 3, 35, :_reduce_22, 3, 35, :_reduce_23, 3, 35, :_reduce_24, 3, 35, :_reduce_none, 2, 35, :_reduce_none, 1, 35, :_reduce_none, 1, 35, :_reduce_none, 1, 40, :_reduce_29, 1, 40, :_reduce_30, 1, 40, :_reduce_31, 1, 40, :_reduce_32, 3, 40, :_reduce_33, 1, 40, :_reduce_34, 3, 40, :_reduce_35, 1, 40, :_reduce_36, 3, 40, :_reduce_37, 4, 39, :_reduce_38, 0, 41, :_reduce_none, 1, 41, :_reduce_40, 3, 41, :_reduce_41 ] racc_reduce_n = 42 racc_shift_n = 66 racc_token_table = { false => 0, :error => 1, :UMINUS => 2, :NOT => 3, :GT => 4, :GE => 5, :LT => 6, :LE => 7, :EQ => 8, :NE => 9, :AND => 10, :OR => 11, :END => 12, :TRUE => 13, :FALSE => 14, :COMMENT => 15, :IF => 16, :ENDIF => 17, :ELSE => 18, :ID => 19, :STRING => 20, :LPAREN => 21, :RPAREN => 22, :SUB => 23, :NUMBER => 24, :FLOAT => 25, :ACTOR => 26, :SEND => 27, :THIS => 28, :ARGS => 29, :COMMA => 30 } racc_nt_base = 31 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", "UMINUS", "NOT", "GT", "GE", "LT", "LE", "EQ", "NE", "AND", "OR", "END", "TRUE", "FALSE", "COMMENT", "IF", "ENDIF", "ELSE", "ID", "STRING", "LPAREN", "RPAREN", "SUB", "NUMBER", "FLOAT", "ACTOR", "SEND", "THIS", "ARGS", "COMMA", "$start", "program", "stmts", "stmt", "expr", "command", "if", "else", "function", "atom", "args" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted module_eval(<<'.,.,', 'farts_parser.y', 27) def _reduce_1(val, _values, result) result = ProgramSyntaxNode.new( @sc.lineno, val[0] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 30) def _reduce_2(val, _values, result) result = [] result end .,., module_eval(<<'.,.,', 'farts_parser.y', 32) def _reduce_3(val, _values, result) result.push val[1] result end .,., # reduce 4 omitted # reduce 5 omitted # reduce 6 omitted module_eval(<<'.,.,', 'farts_parser.y', 37) def _reduce_7(val, _values, result) result = EndSyntaxNode.new( @sc.lineno, true) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 38) def _reduce_8(val, _values, result) result = EndSyntaxNode.new( @sc.lineno, true) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 39) def _reduce_9(val, _values, result) result = EndSyntaxNode.new( @sc.lineno, false) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 40) def _reduce_10(val, _values, result) result = CommentSyntaxNode.new( @sc.lineno, val[0]) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 43) def _reduce_11(val, _values, result) result = IfSyntaxNode.new( @sc.lineno, val[1], val[2], val[3] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 45) def _reduce_12(val, _values, result) result = val[1] result end .,., module_eval(<<'.,.,', 'farts_parser.y', 46) def _reduce_13(val, _values, result) result = nil result end .,., module_eval(<<'.,.,', 'farts_parser.y', 48) def _reduce_14(val, _values, result) result = CommandSyntaxNode.new( @sc.lineno, val[0] , nil ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 49) def _reduce_15(val, _values, result) result = CommandSyntaxNode.new( @sc.lineno, val[0], val[1] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 51) def _reduce_16(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '!', [val[1]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 52) def _reduce_17(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '==', [val[0], val[2]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 53) def _reduce_18(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '!=', [val[0], val[2]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 54) def _reduce_19(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '>', [val[0], val[2]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 55) def _reduce_20(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '>=', [val[0], val[2]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 56) def _reduce_21(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '<', [val[0], val[2]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 57) def _reduce_22(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '<=', [val[0], val[2]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 58) def _reduce_23(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '&&', [val[0], val[2]] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 59) def _reduce_24(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, '||', [val[0], val[2]] ) result end .,., # reduce 25 omitted # reduce 26 omitted # reduce 27 omitted # reduce 28 omitted module_eval(<<'.,.,', 'farts_parser.y', 65) def _reduce_29(val, _values, result) result = LiteralSyntaxNode.new( @sc.lineno, val[0] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 66) def _reduce_30(val, _values, result) result = LiteralSyntaxNode.new( @sc.lineno, val[0] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 67) def _reduce_31(val, _values, result) result = LiteralSyntaxNode.new( @sc.lineno, val[0] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 68) def _reduce_32(val, _values, result) result = [LocalVarSyntaxNode.new( @sc.lineno, val[0] )] result end .,., module_eval(<<'.,.,', 'farts_parser.y', 69) def _reduce_33(val, _values, result) result = [AttributeSyntaxNode.new( @sc.lineno, val[0], val[2])] result end .,., module_eval(<<'.,.,', 'farts_parser.y', 70) def _reduce_34(val, _values, result) result = LocalVarSyntaxNode.new( @sc.lineno, val[0] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 71) def _reduce_35(val, _values, result) result = AttributeSyntaxNode.new( @sc.lineno, val[0], val[2] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 72) def _reduce_36(val, _values, result) result = LocalVarSyntaxNode.new( @sc.lineno, val[0] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 73) def _reduce_37(val, _values, result) result = AttributeSyntaxNode.new( @sc.lineno, val[0], val[2] ) result end .,., module_eval(<<'.,.,', 'farts_parser.y', 76) def _reduce_38(val, _values, result) result = CallSyntaxNode.new( @sc.lineno, val[0], *val[2] ) result end .,., # reduce 39 omitted module_eval(<<'.,.,', 'farts_parser.y', 79) def _reduce_40(val, _values, result) result = [val] result end .,., module_eval(<<'.,.,', 'farts_parser.y', 80) def _reduce_41(val, _values, result) result.push(val[2]) result end .,., def _reduce_none(val, _values, result) val[0] end end # class Parser end # module Farts module Farts class SyntaxNode attr :lineno def initialize( lineno ) @lineno = lineno end def exec_list(intp, nodes) v = nil nodes.each do |i| v = i.execute(intp) break if intp.hitbreak == true end v end def fart_err(msg) raise "Error at #{lineno}: #{msg}" end end class ProgramSyntaxNode < SyntaxNode def initialize( lineno, tree ) super lineno @tree = tree end def execute(vars) intp = Interpreter.new(vars) exec_list(intp, @tree) end end class EndSyntaxNode < SyntaxNode def initialize( lineno, val ) super lineno @val = val end def execute(intp) intp.hitbreak = true intp.retval = val end end class CommentSyntaxNode < SyntaxNode def initialize( lineno, val ) super lineno @val = val end def execute(intp) end end class CallSyntaxNode < SyntaxNode def initialize( lineno, func, args ) super lineno @funcname = func @args = args end def execute(intp) arg = @args.collect {|i| i.execute(intp) } begin case @funcname when "||" arg[0] || arg[1] when "&&" arg[0] && arg[1] when "!=" arg[0] != arg[1] when "!" !arg[0] else if arg.empty? || !arg[0].respond_to?(@funcname) intp.call_lib_function(@funcname, arg) do fart_err("undefined function '#{@funcname}'") end else recv = arg.shift recv.send(@funcname, *arg) end end rescue ArgumentError pp self pp arg fart_err($!.message) end end end class CommandSyntaxNode < SyntaxNode def initialize( lineno, cmd, args ) super lineno @cmd = cmd @args = args end def execute(intp) begin if @args intp.vars["this"].parse(@cmd + " " + @args) else intp.vars["this"].parse(@cmd) end rescue Exception pp self fart_err($!.message) end end end class IfSyntaxNode < SyntaxNode def initialize( lineno, condition, stmts_true, stmts_false ) super lineno @condition = condition @stmts_true = stmts_true @stmts_false = stmts_false end def execute(intp) if @condition.execute(intp) exec_list(intp, @stmts_true) else exec_list(intp, @stmts_false) if @stmts_false end end end class LocalVarSyntaxNode < SyntaxNode def initialize( lineno, vname ) super lineno @vname = vname end def execute( intp ) if intp.vars.has_key?(@vname) intp.vars[@vname] else fart_err("unknown local variable '#{@vname}'") end end end class AttributeSyntaxNode < SyntaxNode def initialize( lineno, vname, vattr ) super lineno @vname = vname @vattr = vattr end def execute(intp) begin if intp.vars.has_key?(@vname) intp.vars[@vname].send(@vattr.intern) else fart_err("unknown local variable '#{@vname}'") end rescue NameError fart_err($!.message) end end end class LiteralSyntaxNode < SyntaxNode def initialize( lineno, val ) super lineno @val = val end def execute( intp ) @val.class == String ? @val.dup : @val end end # The Interpreter class is an instance of a machine to execute a program class Interpreter attr_accessor :hitbreak, :retval, :vars # Construct an interpreter machine # [+vars+] A hash table of attribute name/value pairs. # Currently we support 'actor' and 'this', where they are the first # two parameters of an event respectively. def initialize(vars) @vars = vars # hash table of attribute_name/value pairs @hitbreak = false @retval = true @lib = Lib.new end def call_lib_function( fname, args ) if @lib.respond_to?(fname) @lib.send(fname, *args) else yield end end end end # # FARTS testing # if $0 == __FILE__ require 'pp' begin fart = nil str ="" File.open('farts/myprog.fart') {|f| str = f.read } fart = Farts::Parser.new.parse( str ) pp fart vars = { "actor" => "foo", "this" => "bar"} fart.execute(vars) rescue Racc::ParseError, Exception log.error $! exit end end