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
parse()
click to toggle source
# File lib/parser.rb, line 11 def parse() return Prog() end
Private 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 98 def Factor() t = @scan.getToken if t.type == :number then return NumNode.new(t.lex.to_i) end if t.type == :keyword then if lex == "R" then return RecallNode.new else raise ParserError.new end end if t.type == :lparen then expr = Expr() t = @scan.getToken if t.type == :rparen then return expr else raise ParserError.new end end raise ParserError.new end
Prog()
click to toggle source
# File lib/parser.rb, line 16 def Prog() result = Expr() t = @scan.getToken() unless t.type == :eof then print "Expected EOF. Found ", t.type, ".\n" raise ParseError.new #Raise para excepciones 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 66 def RestTerm(e) t = @scan.getToken if t.type == :times then return RestTerm(TimesNode.new(e, Storable())) if t.type == :divide then return RestTerm(DivideNode.new(e, Storable())) @scan.putBackToken e end end return e end
Storable()
click to toggle source
# File lib/parser.rb, line 83 def Storable() fact = Factor() t = @scan.getToken if t.type == :keyword then if t.lex == "S" then return StoreNode.new(fact) else raise ParserError.new end end return fact end
Term()
click to toggle source
# File lib/parser.rb, line 48 def Term() RestTerm(Storable()) # 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