]> git.mdlowis.com Git - proto/aas.git/commitdiff
started emitting aas
authorMichael D. Lowis <mike@mdlowis.com>
Fri, 10 Nov 2023 04:40:01 +0000 (23:40 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Fri, 10 Nov 2023 04:40:01 +0000 (23:40 -0500)
cerise.rb

index 7931113518a85dc429d84d2437923552778c50e6..b43ccbab161d1bb54d6bc6d872a3efa8feb7b3c4 100755 (executable)
--- 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