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 92 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 end raise ParserError.new() end if t.type == :lparen expr = Expr() t = @scan.getToken if t.type == :rparen return expr end raise ParserError.new() end raise ParserError.new0 end
Prog()
click to toggle source
private public protectec
# 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 62 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())) end @scan.putBackToken e end
Storable()
click to toggle source
# File lib/parser.rb, line 78 def Storable() factor = Factor() t = @scan.getToken if t.type == :keyword if t.lex == "S" return StoreNode.new(factor) raise ParserError.new() end end @scan.putBackToken() factor end
Term()
click to toggle source
# File lib/parser.rb, line 48 def Term() RestTerm(Storable()) # 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