热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析JavaScript词法分析的具体流程与常见问题

在学习Javascript词法分析的过程,有一点疑惑,动态解析JS的过程分为两个阶段,语法检查和运行阶段。语法检查包括词法分析和语法分析,在词法分析过程中,看到网上较多是这样描述的,比如这一篇:原文描

在学习Javascript词法分析的过程,有一点疑惑,动态解析JS的过程分为两个阶段,语法检查和运行阶段。语法检查包括词法分析和语法分析,在词法分析过程中,看到网上较多是这样描述的,比如这一篇:
原文描述:
在词法分析阶段,Javascript解释器先把Javascript代码(字符串)的字符流按照ECMAScript标准转换为记号流。
例如:把字符流:

1
a = (b - c)

;
转换为记号流:

1
2
3
4
5
6
7
8
NAME "a"

EQUALS

OPEN_PARENTHESIS

NAME "b"

MINUS

NAME "c"

CLOSE_PARENTHESIS

SEMICOLON

然后在语法分析阶段:Javascript语法分析器在经过词法分析后将记号流,按照ECMAScript标准把词法分析所产生的记号生成语法树。

上面的描述过程和在书上《你不知道的JS 上》有差别,在书中,将词法分析过程描述为:
分词/词法分析:这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元(token).
解析/语法分析:这个过程将词法单元流(数组)转换成一个有元素逐级嵌套所组成的代表了程序语法结构的树,这个树被称为"抽象语法树"(AST).

上文中的词法分析后的记号流和书中的词法单元token有区别吗?

还有在这篇文章:如何用Javascript编写简单的解释器中,和书中的描述一致,原文大致如下:

在词法阶段,词法分析器将由字符组成的字符串作为输入,然后将字符串分解成词法单元(token),比如对

1
( 12 + 4 ) / 6

这段代码,词法分析器将其分割为各个独立的部分,即token,输出列表形如:

1
2
3
4
5
6
7
8
9
{

     ["operator", "("],

       ["number", 12],

       ["operator", "+"],

       ["number", 4],

       ["operator", ")"],

       ["operator", "/"],

       ["number", 6]

  }

分析器把词法分析器产生的token列表作为输入,根据某种语法规则进行分析,并输出表现语法结构的分析树:

1
2
3
4
5
6
7
8
9
   {

       operation: "/",

       left: {

         operation: "+",

         left: 12,

         right: 4

       }

       right: 6

   }

那么抽象语法树和这里的输出的语法结构分析树又有什么区别呢?
请问,在词法分析阶段是先产生记号流(记号流是什么?),由语法分析器产生语法树,还是将字符串分解为token,再产生AST??
网上版本较多,也没有学过编译原理,对上面的过程比较模糊,希望能得到比较详细的解答,谢谢。


推荐阅读
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 全面解析Java虚拟机:内存模型深度剖析 ... [详细]
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • 在本教程中,我们将详细介绍如何使用 ArcGIS API 3.x for JavaScript 绘制风向流动图。如果您对所涉及的 API 类不熟悉,建议参考 Esri 官方网站上的 ArcGIS API 3.x for JavaScript 文档,其中提供了详尽的类介绍和使用说明。此外,我们还将提供完整的源代码,帮助您更好地理解和实现这一功能。 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • Java 9 中 SafeVarargs 注释的使用与示例解析 ... [详细]
author-avatar
jystmj-2009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有