【发布时间】:2017-06-01 05:44:34
【问题描述】:
我正在尝试学习 Ruby 词法分析器和解析器 (whitequark parser),以了解更多关于从 Ruby 脚本进一步生成机器代码的过程。
关于解析以下 Ruby 代码字符串。
def add(a, b)
return a + b
end
puts add 1, 2
它会产生以下 S 表达式符号。
s(:begin,
s(:def, :add,
s(:args,
s(:arg, :a),
s(:arg, :b)),
s(:return,
s(:send,
s(:lvar, :a), :+,
s(:lvar, :b)))),
s(:send, nil, :puts,
s(:send, nil, :add,
s(:int, 1),
s(:int, 3))))
谁能解释一下:send 关键字在生成的S 表达式符号中的定义吗?
【问题讨论】:
-
我不知道这是否正确,但如果我不得不猜测,
send只是 Object#send,它调用了一个方法。 -
旁注:如果你想检查 Ruby 解析器的输出,首先清理你的 ruby 代码,例如从方法体中删除一个多余的
return,它会使生成的AST更干净。是的,它是Object#send。
标签: ruby parsing abstract-syntax-tree s-expression ruby-ripper