Skip to content

Instantly share code, notes, and snippets.

@hasefumi23
Created November 1, 2019 07:39
Show Gist options
  • Select an option

  • Save hasefumi23/6cb17cf043b4be2fe692700db96c76be to your computer and use it in GitHub Desktop.

Select an option

Save hasefumi23/6cb17cf043b4be2fe692700db96c76be to your computer and use it in GitHub Desktop.
# !/usr/bin/env ruby
def parse_let(tokens)
let_token = ["keyword", tokens.slice!(0)]
var_token = ["identifier", tokens.slice!(0)]
eq_token = ["symbol", tokens.slice!(0)]
exp = parse_expresssion(tokens)
["let_statement", let_token, var_token, eq_token, exp]
end
def parse_expresssion(tokens)
parsed = parse_term(tokens)
["expression", parsed]
end
def parse_term(tokens)
parsed = ["term"]
if tokens[0] == "+"
parsed << ["symbol", tokens.slice!(0)]
end
parsed << ["integer_constant", tokens.slice!(0)]
if tokens[0] == "+"
parsed << parse_term(tokens)
end
parsed
end
tokens = %w[let var = 1 + 1]
tree = parse_let(tokens)
pp tree
@ind = 0
def parse!(t)
case t[0]
when "keyword", "symbol", "identifier", "integer_constant"
print ' ' * (@ind * 2)
pp "<#{t[0]}> #{t[1]} </#{t[0]}>"
else
print ' ' * (@ind * 2)
pp "<#{t[0]}>"
@ind += 1
case t[0]
when "let_statement"
parse!(t[1])
parse!(t[2])
parse!(t[3])
parse!(t[4])
when "expression"
parse!(t[1])
when "term"
parse!(t[1])
parse!(t[2]) unless t[2].nil?
end
@ind -= 1
print ' ' * (@ind * 2)
pp "</#{t[0]}>"
end
end
parse!(tree)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment