module Arithmetic include Treetop::Runtime def root @root ||= :expression end def _nt_expression start_index = index cached = node_cache[:expression][index] if cached @index = cached.interval.end return cached end i0 = index r1 = _nt_comparative if r1.success? r0 = r1 else r2 = _nt_additive if r2.success? r0 = r2 else self.index = i0 r0 = ParseFailure.new(input, i0) end end node_cache[:expression][start_index] = r0 return r0 end module Comparative0 def operand_1 elements[0] end def space elements[1] end def operator elements[2] end def space elements[3] end def operand_2 elements[4] end end def _nt_comparative start_index = index cached = node_cache[:comparative][index] if cached @index = cached.interval.end return cached end i0, s0 = index, [] r1 = _nt_additive s0 << r1 if r1.success? r2 = _nt_space s0 << r2 if r2.success? r3 = _nt_equality_op s0 << r3 if r3.success? r4 = _nt_space s0 << r4 if r4.success? r5 = _nt_additive s0 << r5 end end end end if s0.last.success? r0 = (BinaryOperation).new(input, i0...index, s0) r0.extend(Comparative0) else self.index = i0 r0 = ParseFailure.new(input, i0) end node_cache[:comparative][start_index] = r0 return r0 end module EqualityOp0 def apply(a, b) a == b end end def _nt_equality_op start_index = index cached = node_cache[:equality_op][index] if cached @index = cached.interval.end return cached end r0 = parse_terminal('==', SyntaxNode, EqualityOp0) node_cache[:equality_op][start_index] = r0 return r0 end module Additive0 def operand_1 elements[0] end def space elements[1] end def operator elements[2] end def space elements[3] end def operand_2 elements[4] end end def _nt_additive start_index = index cached = node_cache[:additive][index] if cached @index = cached.interval.end return cached end i0 = index i1, s1 = index, [] r2 = _nt_multitive s1 << r2 if r2.success? r3 = _nt_space s1 << r3 if r3.success? r4 = _nt_additive_op s1 << r4 if r4.success? r5 = _nt_space s1 << r5 if r5.success? r6 = _nt_additive s1 << r6 end end end end if s1.last.success? r1 = (BinaryOperation).new(input, i1...index, s1) r1.extend(Additive0) else self.index = i1 r1 = ParseFailure.new(input, i1) end if r1.success? r0 = r1 else r7 = _nt_multitive if r7.success? r0 = r7 else self.index = i0 r0 = ParseFailure.new(input, i0) end end node_cache[:additive][start_index] = r0 return r0 end module AdditiveOp0 def apply(a, b) a + b end end module AdditiveOp1 def apply(a, b) a - b end end def _nt_additive_op start_index = index cached = node_cache[:additive_op][index] if cached @index = cached.interval.end return cached end i0 = index r1 = parse_terminal('+', SyntaxNode, AdditiveOp0) if r1.success? r0 = r1 else r2 = parse_terminal('-', SyntaxNode, AdditiveOp1) if r2.success? r0 = r2 else self.index = i0 r0 = ParseFailure.new(input, i0) end end node_cache[:additive_op][start_index] = r0 return r0 end module Multitive0 def operand_1 elements[0] end def space elements[1] end def operator elements[2] end def space elements[3] end def operand_2 elements[4] end end def _nt_multitive start_index = index cached = node_cache[:multitive][index] if cached @index = cached.interval.end return cached end i0 = index i1, s1 = index, [] r2 = _nt_primary s1 << r2 if r2.success? r3 = _nt_space s1 << r3 if r3.success? r4 = _nt_multitive_op s1 << r4 if r4.success? r5 = _nt_space s1 << r5 if r5.success? r6 = _nt_multitive s1 << r6 end end end end if s1.last.success? r1 = (BinaryOperation).new(input, i1...index, s1) r1.extend(Multitive0) else self.index = i1 r1 = ParseFailure.new(input, i1) end if r1.success? r0 = r1 else r7 = _nt_primary if r7.success? r0 = r7 else self.index = i0 r0 = ParseFailure.new(input, i0) end end node_cache[:multitive][start_index] = r0 return r0 end module MultitiveOp0 def apply(a, b) a * b end end module MultitiveOp1 def apply(a, b) a / b end end def _nt_multitive_op start_index = index cached = node_cache[:multitive_op][index] if cached @index = cached.interval.end return cached end i0 = index r1 = parse_terminal('*', SyntaxNode, MultitiveOp0) if r1.success? r0 = r1 else r2 = parse_terminal('/', SyntaxNode, MultitiveOp1) if r2.success? r0 = r2 else self.index = i0 r0 = ParseFailure.new(input, i0) end end node_cache[:multitive_op][start_index] = r0 return r0 end module Primary0 def space elements[1] end def expression elements[2] end def space elements[3] end end module Primary1 def eval(env={}) expression.eval(env) end end def _nt_primary start_index = index cached = node_cache[:primary][index] if cached @index = cached.interval.end return cached end i0 = index r1 = _nt_variable if r1.success? r0 = r1 else r2 = _nt_number if r2.success? r0 = r2 else i3, s3 = index, [] r4 = parse_terminal('(', SyntaxNode) s3 << r4 if r4.success? r5 = _nt_space s3 << r5 if r5.success? r6 = _nt_expression s3 << r6 if r6.success? r7 = _nt_space s3 << r7 if r7.success? r8 = parse_terminal(')', SyntaxNode) s3 << r8 end end end end if s3.last.success? r3 = (SyntaxNode).new(input, i3...index, s3) r3.extend(Primary0) r3.extend(Primary1) else self.index = i3 r3 = ParseFailure.new(input, i3) end if r3.success? r0 = r3 else self.index = i0 r0 = ParseFailure.new(input, i0) end end end node_cache[:primary][start_index] = r0 return r0 end module Variable0 def eval(env={}) env[name] end def name text_value end end def _nt_variable start_index = index cached = node_cache[:variable][index] if cached @index = cached.interval.end return cached end s0, i0 = [], index loop do r1 = parse_char_class(/[a-z]/, 'a-z', SyntaxNode) if r1.success? s0 << r1 else break end end if s0.empty? self.index = i0 r0 = ParseFailure.new(input, i0) else r0 = SyntaxNode.new(input, i0...index, s0) r0.extend(Variable0) end node_cache[:variable][start_index] = r0 return r0 end module Number0 end module Number1 def eval(env={}) text_value.to_i end end def _nt_number start_index = index cached = node_cache[:number][index] if cached @index = cached.interval.end return cached end i0 = index i1, s1 = index, [] r2 = parse_char_class(/[1-9]/, '1-9', SyntaxNode) s1 << r2 if r2.success? s3, i3 = [], index loop do r4 = parse_char_class(/[0-9]/, '0-9', SyntaxNode) if r4.success? s3 << r4 else break end end r3 = SyntaxNode.new(input, i3...index, s3) s1 << r3 end if s1.last.success? r1 = (SyntaxNode).new(input, i1...index, s1) r1.extend(Number0) else self.index = i1 r1 = ParseFailure.new(input, i1) end if r1.success? r0 = r1 r0.extend(Number1) else r5 = parse_terminal('0', SyntaxNode) if r5.success? r0 = r5 r0.extend(Number1) else self.index = i0 r0 = ParseFailure.new(input, i0) end end node_cache[:number][start_index] = r0 return r0 end def _nt_space start_index = index cached = node_cache[:space][index] if cached @index = cached.interval.end return cached end s0, i0 = [], index loop do r1 = parse_terminal(' ', SyntaxNode) if r1.success? s0 << r1 else break end end r0 = SyntaxNode.new(input, i0...index, s0) node_cache[:space][start_index] = r0 return r0 end end class ArithmeticParser < Treetop::Runtime::CompiledParser include Arithmetic end