class Parser

Public Class Methods

new(istream) click to toggle source
# File lib/parser.rb, line 7
def initialize(istream)
  @scan = Scanner.new(istream)
end

Public Instance Methods

Expr() click to toggle source
# File lib/parser.rb, line 28
def Expr() 
  return RestExpr(Term())
end
Factor() click to toggle source
# File lib/parser.rb, line 96
def Factor() 

  t = @scan.getToken

  if t.type == :number
    return NumNode.new(t.lex.to_i)
  end

  if t.type == :keyword
    if t.lex == "R"
      return RecallNode.new
    else
      raise ParseError.new
    end
  end

  if t.type == :lparen
    expr = Expr()
    t = @scan.getToken
    if t.type == :rparen
      return expr
    else
      raise ParseError.new
    end
  end
  raise ParseError.new
end
Prog() click to toggle source

private

# File lib/parser.rb, line 16
def Prog()
  result = Expr()
  t = @scan.getToken()
  
  if t.type != :eof then
    print "Expected EOF. Found ", t.type, ".\n"
    raise ParseError.new
  end
  
  return result
end
RestExpr(e) click to toggle source
# File lib/parser.rb, line 32
def RestExpr(e) 
  t = @scan.getToken()
  
  if t.type == :add then
       return RestExpr(AddNode.new(e,Term()))
  end
  
  if t.type == :sub then
    return RestExpr(SubNode.new(e,Term()))
  end
    
  @scan.putBackToken()
  
  return e
end
RestTerm(e) click to toggle source
# File lib/parser.rb, line 64
def RestTerm(e)
  t = @scan.getToken

  if t.type == :times
    return RestTerm(TimesNode.new(e, Storable()))
  end

  if t.type  == :divide
    return RestTerm(DivideNode.new(e, Storable()))

    @scan.putBackToken
  end
end
Storable() click to toggle source
# File lib/parser.rb, line 78
def Storable()
 
  fact = Factor()

  t = @scan.getToken

  if t.type == :keyword
    if t.lex == "S"
      return StoreNode.new(fact)
    else
      raise ParseError.new
    end
  end

  @scan.putBackToken

end
Term() click to toggle source
# File lib/parser.rb, line 48
def Term()
  # Write your Term() code here. This code is just temporary
  # so you can try the calculator out before finishing it.
  
  # t = @scan.getToken()
  
#   if t.type == :number then
#     val = t.lex.to_i
#     return NumNode.new(val)
#   end
  
#   puts "Term not implemented\n"
  
#   raise ParseError.new
end
parse() click to toggle source
# File lib/parser.rb, line 11
def parse()
  return Prog()
end