From dd6cfc6784a1b0bbc460614dc1dc9d805da37361 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Thu, 9 Nov 2023 23:40:01 -0500 Subject: [PATCH] started emitting aas --- cerise.rb | 58 ++++++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/cerise.rb b/cerise.rb index 7931113..b43ccba 100755 --- a/cerise.rb +++ b/cerise.rb @@ -526,10 +526,10 @@ end 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) @@ -538,14 +538,6 @@ class Parser 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 @@ -553,10 +545,6 @@ class Parser 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}" @@ -632,22 +620,8 @@ class Parser @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 @@ -671,7 +645,7 @@ class Parser 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) @@ -683,6 +657,7 @@ class Parser func.body << IR::Return.new(location, nil, expression()) end expect("}"); + func end def constant_definition(name) @@ -697,7 +672,6 @@ class Parser error("type annotations not yet supported") end - def function_arglist() args = [] expect("(") @@ -909,5 +883,27 @@ class Parser # 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 -- 2.52.0