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 86
  def Factor() 
    t = @scan.getToken

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

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

private public protected

# 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 52
def RestTerm(e)
  t = @scan.getToken()

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

  if t.type == divide then
    return RestTerm(DivideNode.new(e,Storable()))
  end
  
  @scan.putBackToken

  e
end
Storable() click to toggle source
# File lib/parser.rb, line 68
def Storable()
  factor = Factor()

  t = @scan.getToken

  if t.type == :keyword then
    if t.lex == "S" then
      return StoreNode.new(factor)
    else
      raise ParseError.new
    end
  end
  
  @scan.putBackToken

  factor
end
Term() click to toggle source
# File lib/parser.rb, line 48
def Term()
  ResTerm(Storable())
end
parse() click to toggle source
# File lib/parser.rb, line 11
def parse()
  return Prog()
end