Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 136|回复: 0

词法分析器、解析器和 AST,天哪!:Ruby 是如何执行的

[复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2024-2-13 14:31:31 | 显示全部楼层 |阅读模式
红宝石 词法分析器、解析器和 AST,天哪!:Ruby 是如何执行的 红宝石教程 大卫·布什 大卫·布什 2016 年 12 月 19 日 分享 我们理所当然地认为它将ruby my_app.rb执行我们的代码。但它是如何运作的呢?幕后发生了什么?让我们通过内部结构来了解一下。 词法分析器 第一个调用点是词法分析器。词法分析器读取您的代码并将其分解为“令牌”(因此,您可能会听到 Tokenizer 和 Lexer 互换使用)。你问什么是令牌?好问题!让我们看一个例子: 5.times do |x| puts x end 当您运行时ruby my_app.rb,Ruby 打开文件并按顺序读取每个字符。第一个是整数 (5),因此词法分析器知道它正在处理的类型是整数对象。也是0一个整数(有趣的是,.也算作整数,因为它可能表示浮点数),但一旦它到达t,词法分析器就会识别出此过程的数字部分已结束,回溯并将类型分配tINTEGER给令牌。


之后.,词法分析器遇到times.这是一种identifier表示类、变量或方法名称的技术方式。接下来,它遇到do这是一个保留字,因为它是该语言中的关键字。词法分析器如何区分保留字和标识符?好吧,Ruby 本身必须知道什么是关键字,什么不是,因此它在内部保留了一个保留字列表。这是 象牙海岸 WhatsApp 号码列表 一个示例 - 您可以看到它导入到我们稍后将深入研究的解析文件顶部。 事实上,我稍微简化了事情。现代 Ruby 中的词法分析和解析过程已得到简化,更加高效。实际发生的情况是,词法分析函数作为解析过程的一部分被调用。这是在名为parse.y 的语法规则文件中完成的- 11,000 行复杂逻辑和源文件的低级争论。看到这个600 多行的 case 语句了吗?那是你的词法分析器。 足够的理论。让我们来做一些实际的事情吧!从 Ruby 1.9 开始,Ruby 附带了一个 API 来与其 Lexer 交互。



它被称为 Ripper,这是一个有趣的练习。那么,我们来尝试一下吧。启动优秀的Pry或irb并按照以下步骤操作希望这个输出中的一些现在有意义:tINTEGER是词法分析器分配给令牌的令牌类型,状态由解析器处理,并且Reducing是Shifting遍历令牌流的解析器。 解析的结果是什么?抽象语法树 抽象语法树 Lisp)用户在这里会感到熟悉。抽象语法树 (AST) 由“符号表达式”(sexpressions或sexprs简称)树组成,它是 Ruby 程序转换为字节码之前的最后阶段。 AST 非常适合这一点,因为程序中可能的路径都被映射出来,这使得生成字节码成为一种衍生练习。正是在编译过程的这一点上,我们的程序被检查语义分析的正确性),如果您正在编写一个转译器来将您的 Ruby 代码更改为不同的目标语言(或者可能是您的 Rack 应用程序的模板引擎),那么这就是你要加入的地方。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2024-9-20 09:08 , Processed in 0.039153 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表