“Ruby Under a Microscope”的版本间的差异
来自Dennis的知识库
Dennis zhuang(讨论 | 贡献) |
Dennis zhuang(讨论 | 贡献) |
||
第22行: | 第22行: | ||
* Ripper.sexp 输出 parse 结果,也可以使用命令行 ruby --dump parsetree xxxx.rb 得到。前者是 Ripper 的 AST 展示格式,后者是实际内部的 c 语言 node 节点信息。 | * Ripper.sexp 输出 parse 结果,也可以使用命令行 ruby --dump parsetree xxxx.rb 得到。前者是 Ripper 的 AST 展示格式,后者是实际内部的 c 语言 node 节点信息。 | ||
− | * Ruby 使用手写的 tokenizer ,以及 bison 写的 | + | * Ruby 使用手写的 tokenizer ,以及 bison 写的 parser —— [https://github.com/ruby/ruby/blob/510f0ec86912e31babaadf1f66bf2a82351c1359/parse.y parse.y] ,bison生成的解释器是 [https://en.wikipedia.org/wiki/LALR_parser LALR Parser]。 |
2016年12月9日 (五) 00:03的版本
分词与语法解析
- 使用 Ripper 输出 lex 结果。
<code> require 'ripper' require 'pp' #ripper is not parser, it can't find error. code = <<STR 10.times do |n| puts n end STR puts code pp Ripper.lex(code) </code>
- Ripper.sexp 输出 parse 结果,也可以使用命令行 ruby --dump parsetree xxxx.rb 得到。前者是 Ripper 的 AST 展示格式,后者是实际内部的 c 语言 node 节点信息。
- Ruby 使用手写的 tokenizer ,以及 bison 写的 parser —— parse.y ,bison生成的解释器是 LALR Parser。