class Emfrp::OpParser
Public Class Methods
make_op_parser(priority_list)
click to toggle source
# File lib/emfrp/parser/operator.rb, line 5 def self.make_op_parser(priority_list) priority_list.reverse.inject(item.map(&:item)) do |contp, x| op = sat{|i| i.item.is_a?(SSymbol) && i.item[:desc] == x[:sym]} if x[:dir] == "left" opp = x[:op].map do |op| proc{|l, r| FuncCall.new(:name => op, :args => [l, r])} end binopl_fail(contp, opp) elsif x[:dir] == "right" sp = contp >> proc{|l| x[:op] >> proc{|op| sp >> proc{|r| ok(FuncCall.new(:name => op, :args => [l, r])) }}} | contp else raise "invalid direction" end end end