Skip to content

Instantly share code, notes, and snippets.

@ykst
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ykst/ac33df4062716d01d95d to your computer and use it in GitHub Desktop.
Save ykst/ac33df4062716d01d95d to your computer and use it in GitHub Desktop.
method_missingと内部DSL ref: http://qiita.com/ykst/items/5b7b2903c71b43797a8e
struct(:data) {
int :x;
int :y;
};
class Parser
def initialize
@env_stack = [[]]
end
def parse(program)
eval(program)
p @env_stack
end
private
def int(name)
var = { :id => name, :type => :int }
@env_stack.last.push var
end
def struct(name)
var = { :id => name, :type => :struct }
@env_stack.push []
yield if block_given?
var.merge! :fields => @env_stack.pop
@env_stack.last.push var
end
end
Parser.new.parse(%Q(
struct(:data) {
int :x;
int :y;
}
))
=>
[[
{
:id => :data, :type => :struct,
:fields => [
{ :id => :x, :type => :int },
{ :id => :y, :type => :int },
]
}
]]
def method_missing(name, *args)
name
end
struct(data) {
int x;
int y;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment