Skip to content

Commit

Permalink
Merge branch 'gen-exp'
Browse files Browse the repository at this point in the history
Conflicts:
	README.md
  • Loading branch information
TomTriple committed Jan 6, 2012
2 parents f45f353 + 89f4de7 commit 32f1745
Show file tree
Hide file tree
Showing 15 changed files with 189 additions and 100 deletions.
11 changes: 0 additions & 11 deletions README.md

This file was deleted.

6 changes: 6 additions & 0 deletions lib/add.loop
@@ -0,0 +1,6 @@
xa := xa + 4;
xb := xb + 3;

loop xb do
xa := xa + 1
end
47 changes: 47 additions & 0 deletions lib/gen/jsvisitor.rb
@@ -0,0 +1,47 @@
require 'gen/symboltable'

class JSVisitor

def initialize
@target = ""
@loop_counter = 0
end

def visit_start(node)
compile "var sys = require('sys');"
SymbolTable.identifiers.each do |token|
compile "#{token.name} = 0;"
end
end

def visit_assignment(node)
compile "#{node.lvalue.name} = #{node.op1.name} #{node.op.op} #{node.op2.number}; "
end

def visit_loop_start(node)
compile "_loopTerminate#{@loop_counter} = #{node.to.name};"
compile "for(var _loopVar#{@loop_counter} = 0; _loopVar#{@loop_counter} < _loopTerminate#{@loop_counter}; _loopVar#{@loop_counter}++) {"
@loop_counter += 1
end

def visit_loop_end(node)
compile "}"
end

def run
compile "sys.puts(\"xa = \" + xa);"
nodejs = IO.popen("/usr/local/bin/node", "r+")
nodejs.puts @target
nodejs.close_write
puts nodejs.gets
end


private

def compile(source)
#p source
@target += "#{source}"
end

end
16 changes: 16 additions & 0 deletions lib/gen/symboltable.rb
@@ -0,0 +1,16 @@
class SymbolTable

@@symbols = []
@@identifiers = []

def self.getVar(symbol)
@@symbols[symbol] || 0
end

def self.addVar(symbol, value = 0)
@@symbols[symbol] = value
end

def self.identifiers; @@identifiers; end;

end
35 changes: 3 additions & 32 deletions lib/lexer.rb
@@ -1,40 +1,11 @@
class Token; end;

class TIdentifier < Token
attr_accessor :name
def initialize(name)
@name = name
end
end

class TNumber < Token
attr_accessor :number
def initialize(number)
@number = number
end
end

class TBinOp < Token
attr_accessor :op
def initialize(op)
@op = op
end
end

class TColon < Token; end;
class TEq < Token; end;
class TTerminate < Token; end;
class TEnd < Token; end;
class TLoop < Token; end;
class TDo < Token; end;
class TSemicolon < Token; end;
require "token/all"


class Lexer

def initialize
def initialize
@source = ""
read_input("source.loop")
read_input(ARGV.first)
@pos = -1
end

Expand Down
Empty file removed lib/loop.js
Empty file.
8 changes: 8 additions & 0 deletions lib/mult.loop
@@ -0,0 +1,8 @@
a := a + 3;
b := b + 4;

loop a do
loop b do
xa := xa + 1
end
end
8 changes: 8 additions & 0 deletions lib/nodes/node_assignment.rb
@@ -0,0 +1,8 @@

class NodeAssignment
attr_accessor :lvalue, :op1, :op, :op2

def accept(visitor)
visitor.visit_assignment self
end
end
11 changes: 11 additions & 0 deletions lib/nodes/node_loop.rb
@@ -0,0 +1,11 @@
class NodeLoop < ParentNode
attr_accessor :to

def accept(visitor)
visitor.visit_loop_start self
stmts.each do |stmt|
stmt.accept visitor
end
visitor.visit_loop_end self
end
end
12 changes: 12 additions & 0 deletions lib/nodes/node_parent.rb
@@ -0,0 +1,12 @@
class ParentNode

attr_accessor :stmts

def initialize
@stmts = []
end

def <<(it)
@stmts << it
end
end
8 changes: 8 additions & 0 deletions lib/nodes/node_start.rb
@@ -0,0 +1,8 @@
class NodeStart < ParentNode
def accept(visitor)
visitor.visit_start self
stmts.each do |stmt|
stmt.accept visitor
end
end
end
86 changes: 34 additions & 52 deletions lib/parser.rb
@@ -1,43 +1,8 @@
class Node
@@target = ""

def translate(src)
@@target += src
end
end


class NodeStart < Node
attr_accessor :children

def accept(visitor)
visitor.visitStart self
end
end


class NodeAssignment < Node
attr_accessor :lvalue, :rvalue

def accept(visitor)
visitor.visitAssignment self
end
end


class NodeLoop < Node
attr_accessor :to, :children

def accept(visitor)
visitor.visitLoop self
end
end






require "nodes/node_parent"
require "nodes/node_assignment"
require "nodes/node_loop"
require "nodes/node_start"
require "gen/jsvisitor"



Expand All @@ -56,35 +21,42 @@ def test_tokens
end

def parse_start
#test_tokens
#exit

parse_p
raise parse_error unless token.is_a?TTerminate
# test_tokens
# exit

@node_start = NodeStart.new
parse_p(@node_start)
raise parse_error unless token.is_a?TTerminate
traverse_ast
end

def parse_p
def parse_p(parent_node)
input_token
if token.is_a?TIdentifier
@node_assignment = NodeAssignment.new
@node_assignment.lvalue = token
parse_a
parent_node << @node_assignment
elsif token.is_a?TLoop
@node_loop = NodeLoop.new
parent_node << @node_loop
match TIdentifier
@node_loop.to = token
match TDo
parse_p
parse_p(@node_loop)
raise parse_error unless token.is_a?TEnd
else
raise parse_error
end
#
input_token
if token.is_a?TSemicolon
parse_x
parse_x parent_node
end
end

def parse_x
parse_p
def parse_x(parent_node)
parse_p parent_node
end

def parse_a
Expand All @@ -99,12 +71,16 @@ def parse_b

def parse_c
match TIdentifier
SymbolTable.identifiers << token
@node_assignment.op1 = token
parse_d
end

def parse_d
match(TBinOp)
match(TNumber)
match TBinOp
@node_assignment.op = token
match TNumber
@node_assignment.op2 = token
end


Expand All @@ -126,5 +102,11 @@ def parse_error
"Syntaxfehler, Token is: #{@token.class}."
end

def traverse_ast
visitor = JSVisitor.new
@node_start.accept visitor
visitor.run
end


end
5 changes: 0 additions & 5 deletions lib/source.loop

This file was deleted.

6 changes: 6 additions & 0 deletions lib/sub.loop
@@ -0,0 +1,6 @@
xa := xa + 7;
xb := xb + 3;

loop xb do
xa := xa - 1
end
30 changes: 30 additions & 0 deletions lib/token/all.rb
@@ -0,0 +1,30 @@
class Token; end;

class TIdentifier < Token
attr_accessor :name
def initialize(name)
@name = name
end
end

class TNumber < Token
attr_accessor :number
def initialize(number)
@number = number
end
end

class TBinOp < Token
attr_accessor :op
def initialize(op)
@op = op
end
end

class TColon < Token; end;
class TEq < Token; end;
class TTerminate < Token; end;
class TEnd < Token; end;
class TLoop < Token; end;
class TDo < Token; end;
class TSemicolon < Token; end;

0 comments on commit 32f1745

Please sign in to comment.