class Parser
attr_accessor :exprs
attr_accessor :syms
+ attr_accessor :defs
def initialize(path = nil)
@syms = SymTable.new
- parse_file(path)
syms.add_sym(:void, 0, :type, :void)
syms.add_sym(:bool, 0, :type, :bool)
syms.add_sym(:int, 0, :type, :int)
parse_file(path)
end
- def parse_string(str)
- @lex = Lexer.new()
- @lex.parse_string(str)
- @prev = nil
- @next = nil
- toplevel
- end
-
def parse_file(path)
@lex = Lexer.new(path)
@prev = nil
toplevel
end
- def toplevel
- raise "toplevel() must be implemented by inheriting class"
- end
-
def error(str, loc = nil)
file, pos = (loc ? [@lex.file, loc] : [@lex.file, (@next || @prev).pos])
$stderr.puts "#{file}:#{@lex.linenum(pos)}: #{str}"
@defs = {}
while !matches(:eof)
mod_def = toplevel_defintion()
- @defs[mod_def.name.text] = mod_def
-
-# if decl.class == IR::Let
-# syms[decl.var.name][:value] = decl
-# end
-# @exprs << decl
+ @defs[mod_def.name.name] = mod_def
end
-
-# @type_checker = TypeChecker.new(self)
-# @exprs = []
-# @exprs = @exprs.compact
-# @exprs.each do |e|
-# @type_checker.infer(syms, e)
-# end
-# pp syms
- pp @defs
end
def imports
else
error("#{ident.name} is not a valid toplevel definition")
end
- IR::Def.new(name.loc, nil, ident, val)
+ IR::Def.new(ident.loc, nil, ident, val)
end
def function_definition(name)
func.body << IR::Return.new(location, nil, expression())
end
expect("}");
+ func
end
def constant_definition(name)
error("type annotations not yet supported")
end
-
def function_arglist()
args = []
expect("(")
# end
end
+module Codegen
+ def self.emit(v)
+ if v.is_a? IR::Return then
+ emit_return(v)
+ elsif v.is_a? IR::Const then
+ emit_const(v)
+# else
+# emit_const(v)
+ end
+ end
+
+ def self.emit_return(v)
+ end
+
+ def self.emit_const(v)
+ end
+end
+
$parser = Parser.new("cerise.m")
-pp $parser
+$parser.defs.each do |name, val|
+ puts "func #{name.to_sym.inspect} do"
+ puts "end"
+ puts val
+end