最近正在研究JS动态解析的基本结构,希望自己能够将研究成果前前后后总结出来。
以方便自己复习,也希望能够和大家分享这样一套拥有悠久历史的编译技术实现。
按照编译原理的运行特点,一套解释系统最前面也是最简单的就是词法分析。
这里首先研究的是V8引擎的词法分析结构,头文件定义在 src/scanner.h中,具体实现在对应的src/scanner.cc中。
所有的构件
- Scanner [v8::internal]
- UC16CharacterStream [v8::internal]
- UnicodeCache [v8::internal]
- LiteralBuffer [v8::internal]
- LiteralScope [v8::internal::Scanner]
在头文件中共声明有五个类,但是对外提供词法分析服务的就是Scanner类。其他四个类为词法分析提供基本基础服务:譬如字符流编码、结果存取、输入流缓冲等。
UC16CharacterStream [v8::internal]
对外主要提供三个接口:
- Advance [v8::internal::UC16CharacterStream] 向前扫描一个字符,并返回扫描到的字符,如果到文件尾部则返回一个负数。
- pos [v8::internal::UC16CharacterStream] 返回当前字符流扫描到的位置
- SeekForward [v8::internal::UC16CharacterStream] 向前N步步进
- PushBack [v8::internal::UC16CharacterStream] 回溯一个字符
其是一个抽象类,与其相关的子类如图:
UnicodeCache [v8::internal]
用于对Unicode字符进行类型分析。其内部专门实现了用于支持Unicode的相关类包。主要是便于词法分析器在扫描到当前字符时可以进行当前字符状态的查询。
其内部含有各种类型分辨数据单元:
- unibrow::Predicate<IdentifierStart, 128> kIsIdentifierStart;
- unibrow::Predicate<IdentifierPart, 128> kIsIdentifierPart;
- unibrow::Predicate<unibrow::LineTerminator, 128> kIsLineTerminator;
- unibrow::Predicate<unibrow::WhiteSpace, 128> kIsWhiteSpace;
例如IndentifierStart数据题用于判断是否为起始字符:
struct IdentifierStart { static inline bool Is(uc32 c) { switch (c) { case '$': case '_': case '\\': return true; default: return unibrow::Letter::Is(c); } } };
LiteralBuffer [v8::internal]
当前分析结果的字符流存储缓存结构。
内部用 Vector<byte> backing_store_ 保存扫描的字符流数据。
LiteralScope [v8::internal::Scanner]
用于记录在完成词法扫描后的词法分析状态
Scanner [v8::internal]
词法分析主体类,原先感觉是否会使用lex等自动生成器,没想到时完全手写版本。
字符流的基本分析方法时DFA,如果有时间,我考虑把分析器的DFA逆向画出来。
Scanner内部主要维护了current_,next_两步的token,具体的维护策略需要看语法分析的维护。
相关推荐
词法分析器前端实验报告 仅供参考哈 ~~~~~
该实验实现简单词法分析器的构造,包括带多位小数点的数的判错等,通过调用文本文档的形式实现。
编译原理实验词法分析器-算符优先的设计,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
编译词法分析器编译词法分析器编译词法分析器编译词法分析器编译词法分析器编译词法分析器编译词法分析器
词法分析器的设计与实现 实验目的 掌握正规式、状态转换图、C语言单词符号的划分及词法分析器的实现。 掌握词法分析程序的作用和接口
只能进行简单的词法分析,但结构明了,适合初学习者
构造语言识别器的过程为:首先,从词法分析器生成工具读入正则表达式,将该正则表达式转换成等价的不确定的有限自动机,从而构造出确定的有限自动机,然后构造出确定的有限自动机的状态转换表,词法分析器生成工具...
对某种语言进行词法分析,根据保留字和特殊符号表能区分出源文件中的保留字、普通标识符和特殊符号,并能进行简单的错误处理。 设计词法分析器模块调用结构图和各模块流程图。
实验目的: (1) 掌握词法分析的原理。 (2) 熟悉保留字表等相关的数据结构与单词的分类方法。 (3) 掌握词法分析器的设计与调试。
通过对给定源语言词法分析程序...借助于词法分析程序提供的分析结果,设计一个算符优先语法分析程序,程序能进行语法结构分析和错误检查并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。
C编写的简易词法分析器,主要功能是:当你从文件输入一段c语言代码之后,程序能分析代码结构,解析代码的各种关键字,自定义标识符,数字等。
对一句话的关键词进行分析,挑出关键词的一种工具
可以包括任何你想用来分析的代码;我们这里包括了忽略所有注释中字符的功能,传送ID名称和字符串常量内容到主调函数和main函数的功能. (3)实现原理 程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,...
用C++ 手工编写的词法分析器 结构非常清晰很容易扩展 可以分析大多数C源码的 不支持转义字符 不支持尖括号 当比较运算符处理 . 没有完善的处理 当时做了几个小时头晕了 现在想想 ID 中不包含点就行了 没必要加上...
内含代码无法运行。原理包括词法分析表的例图、标识符表结构的构造例图、类型位向量的构造说明。此报告不够严谨、细节不明确,但做上交报告应付足矣。
手工构造Tiny语言的词法分析器(C/C++语言) 1、熟悉Tiny语言词法; 2、构造DFA; 3、设计数据类型、数据结构; 4、用C++实现Tiny语言的词法分析器 。
赋值语句作为基本结构,构造概念有顺序执行、条件执行和重复执行,分别由BEGIN/END、IF和WHILE语句表示。
基于c语言的词法分析器,简单的课程演示。以(标示符,自身值)结构输出结果。
用java语言编写的词法分析器、语法分析器和语义分析器,已经内置了静态的基本语言,通过文件读入代码,上传供各位学习交流使用。
3、 编写词法分析器的总程序,能完成界面输出; 三、实验方案设计 词法分析程序的功能是从源程序中读入一个个字符,一句sample语言的语法规则,识别出每个单词,若有错误,这报告错误,并指出错误所在位置。 1.定义...