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
  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
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()
  RestTerm(Storable())
end
parse() click to toggle source
# File lib/parser.rb, line 11
def parse()
  return Prog()
end