See代码阅读
一、概述:
See是github上用ANTLR实现的开源脚本语言,网址在
https://github.com/MihaiB/mihaib的forge/antlr-ex/old-see下
https://github.com/MihaiB/see(已失效)
https://github.com/MihaiB/antlr-ex(失效)
它的语法像C,或者说像JavaScript。
例如:
void main()
{
int i = 0;
while(i < 10)
{
print(i);
i = i + 1;
}
}
输出:
0123456789
二、符号信息:
表示符号信息的类集中在see.symbol包中
1. Symbol(接口类,代表符号)
getName : 名称(String)
setType / getType : 类型(Type)
getScope : 作用域(Scope)
getDefNode : 定义ID的节点,用于数组类型(SeeAST)
getDefLocation : 定义的位置(String)
2. Type(接口类,继承自Symbol接口,代表类型符号)
getTypeIndex : 类型索引
3. Scope(代表可向上查找的符号表信息,是作用域树的一个节点)
name : 作用域名称(String)
parent : 父级(Scope)
members : 符号表(私有),String->Symbol(Map)
Scope : 受保护,确保Scope只能用于继承。
define : 在作用域中创建符号
getOrderedMembers : 把符号表转为Set
resolve : 把符号名转为Symbol对象(可能需要向上查找父级Scope)。
resolveMember : 把符号名转为Symbol对象(不向上查找)
4. NamedSymbol(包内可见的类,继承自Symbol,表示没有嵌套符号的符号)
NamedSymbol内部不能有其它Symbol。
例如ArrayType是NamedSymbol,但FunctionSymbol不是。
构造函数封装名称(非空)、作用域(非空)、SeeAST节点(可以为空),
如果SeeAST节点为空,则判断它是否为内置类型或内置类型的数组。
5. SymbolTable(符号表,单实例)
全局的符号信息,包含内置符号和脚本中的符号。
还包含语法信息。
作为单实例,用在语法解析器和运行解析器。
6. TypeTables(类型表)
一些语法信息,用于SymbolTable。
7. ArrayType(继承NamedSymbol,实现Type,单实例)
作为单实例用于构造指定Type和维数的数组。
同时它代表了带[]的数组类型节点.
它的SeeAST节点由参数的Type决定
8. BuiltInType(继承NamedSymbol,实现Type)
在SymbolTable中构造实例。
用于加入内置类型,例如boolean。
它不需要SeeAST节点.
9. FunctionSymbol(继承Scope,实现Symbol)
代表函数定义。
NamedSymbol是成员变量(相当于多继承)
它是Scope,所以可以嵌套其它Symbol。
10. StructType(继承Scope,实现Symbol)
代表结构体定义。
NamedSymbol是成员变量(相当于多继承)
它是Scope,所以可以嵌套其它Symbol。
11. VariableSymbol(继承NamedSymbol)
代表变量定义
它不能嵌套Symbol
三、运行时解析器
与运行时解析器相关的类定义在see.interp包中
1. FunctionReturnException(继承RuntimeException)
当return执行完后抛出(见Interpreter.java:returnStat)
2. UserArrayIndexOutOfBoundsException(继承ArrayIndexOutOfBoundsException)
当数组元素赋值或索引时下标超出范围时抛出。
(见Interpreter.java:arrayElemAssign和Interpreter.java:index)
3. UserNullPointerException(继承RuntimeException)
当操作数出现null时抛出(null通常来自用户类型实例的默认值或null关键词)
(见Interpreter.java中的arrayElemAssign,fieldAssign,index,lenOp,loadField)
4. MemorySpace
变量实例表(?)
5. Interpreter
运行时解析器(相当于虚拟机)。
运行SeeAST根节点。
入口点在run(),
Interpreter内部根据SeeAST节点的类型进行跳转和递归调用。
四、AST生成
1. Def(继承TreeFilter)
由Def.g生成
2. Ref(继承TreeFilter)
由Ref.g生成
3. Types(继承TreeFilter)
由Trees.g生成
4. SeeLexer(继承Lexer)
由See.g生成
5. SeeParser(继承Parser)
由See.g生成
6. SeeAST(继承CommonTree)
7. ErrorNode(继承SeeAST)
8. Listener
错误输出(包括位置和消息)
9. Main
程序主入口
五、关键代码:
1. see.symbol.SymbolTable.java:makeSingleton
& see.symbol.SymbolTable.java:SymbolTable
创建global作用域,
构造内置类型。
SymbolTable的作用是处理SeeLexer产生的Token流,
在SeeParser启动前完成符号表的构建。
2. Interpreter.java:exec
AST语法成分判断分支
3. Main.java:main
主入口
六、技术细节:
1. 使用SeeParser.setTreeAdaptor()更改默认的树适配器
由于默认生成的SeeParser的适配器是CommonTreeAdaptor。
需要用这种方法把Token封转为SeeAST(CommonTree的子类),
携带更多信息。
CommonTreeAdaptor的代码注释中是这样说明的:
To get your parser to build nodes of a different type, override
create(Token), errorNode(), and to be safe, YourTreeClass.dupNode().
dupNode is called to duplicate nodes during rewrite operations.
【翻译】为了使你的解析器构建不同类型的节点,请覆盖create(Token)和errorNode(),
还有出于安全起见,覆盖<你的树类>.dupNode()。
调用dupNode是为了在重写操作期间复制节点。
更多信息见官网介绍:
Using custom AST node types
http://www.antlr.org/wiki/display/ANTLR3/Tree+construction
2. Main类中获取流的情况:
CommonTokenStream tokens = new CommonTokenStream(lexer);
从SeeLexer中获取CommonTokenStream
CommonTree t = parser.program().tree;
CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
nodes.setTokenStream(tokens);
从SeeParser中获取CommonTree,再获取CommonTreeNodeStream。
然后把CommonTokenStream放进CommonTreeNodeStream中
3. 树解析器(tree grammar)的使用。
(1) Def:符号定义。
(2) Ref:解析引用,把它们指向SymbolTable的Symbol(不能向前引用)。
(3) Types:计算引用类型(向前引用?)和表达式。
共通之处:
1. nodes.reset(); 在执行树解析器前重置CommonTreeNodeStream
2. TreeFilter.downup(t); 让每个树解析器运行(自下而上,深度遍历)
3. 逐个用downup写入CommonTree,最后把CommonTree传给Interpreter运行虚拟机。
4. 树模式匹配
官方介绍:
Tree pattern matching
http://www.antlr.org/wiki/display/ANTLR3/Tree+pattern+matching
它的明显特征是使用在.g文件中使用filter=true;的options选项:
这样,生成代码的树解析器类不是继承自TreeParser,而是继承自TreeFilter
TreeFilter实际上是TreeParser的子类,拥有执行downup的能力。
(TODO)
相关推荐
代码实现部分,"Learning-to-See-in-the-Dark-master"可能包含了以下内容: 1. 数据预处理脚本:用于准备训练和验证数据集,包括图像的读取、预处理、配对和划分。 2. 模型定义文件:定义了所使用的深度学习模型...
"see5" 标签明确了这是与See5相关的文件,而 "see5_public" 暗示这可能是See5的一个公开版本,可能不包含私有的或受版权保护的代码。"zip" 标签则说明这是一个被压缩的文件集合。 【压缩包子文件的文件名称列表】:...
**Laravel 开发详解:Laravel-See-Me 短信发送程序** 在 Laravel 开发领域,构建高效、安全且可扩展的...在 `laravel-see-me-master` 文件夹中,包含了该包的源代码,供开发者学习和参考,以更好地理解和定制这个包。
《See MIPS Run》是一本深度探讨MIPS架构和汇编语言的经典教材,旨在帮助读者深入理解计算机...通过阅读这本书,你将不仅掌握MIPS汇编语言,还能更深入地理解计算机系统的工作原理,提升你的编程技能和系统设计能力。
通过阅读和理解这些源代码,你将能掌握C5.0算法的实现细节,包括数据结构设计、特征选择算法、决策树的生长和剪枝策略等。这对于提升你的机器学习和编程技能,尤其是针对分类问题的解决能力,大有裨益。同时,了解C...
INCU V1.0有以下几大功能: 1.远程桌面鼠标控制 2.远程驱动器文件浏览与上传下载 3.文本消息传递 4.远程关机 5.多线程一网段同时控制 6.客户端控制服务端升级更新 INCU V1.0的特点: ...
### MIPS体系结构与See MIPS Run 2nd Edition #### 一、MIPS体系结构概述 MIPS(Microprocessor without Interlocked Pipeline ...通过阅读本书,不仅可以掌握MIPS的基本原理,还能了解到最新的发展动态和技术趋势。
《数据挖掘:经典See5软件源代码解析》 在信息技术领域,数据挖掘是一种重要的技术手段,它通过分析海量数据,揭示隐藏的模式和规律,为决策提供依据。在这个专题中,我们将聚焦于一个名为"see5"的数据挖掘工具,它...
【标题】"see5-public.gz_C50_See5" 提供的是一个经典的机器学习算法——...此外,通过阅读和分析源代码,我们可以深入理解算法的内部工作机制,这对于机器学习和数据挖掘的理论研究以及实际应用开发都具有重要意义。
Go-Seelog是一个专门为Go语言设计的日志处理库,它的出现为开发者提供了强大的日志...通过阅读`cihub-seelog-d2c6e5a`中的代码和文档,你可以更深入地了解这个库的使用方法和各种功能,进一步提升你的Go日志处理能力。
《Making Things See》是一本关于使用传感器,特别是微软的Kinect设备进行计算机视觉和互动设计的权威书籍。这本书深入浅出地介绍了如何利用Kinect的3D深度感应能力,为各种创新项目提供动力。Java版的源代码是作者...
通过阅读本书,读者可以深入了解MIPS架构的特点,掌握系统移植的关键技术,为今后在嵌入式系统开发、高性能计算等领域的工作打下坚实的基础。无论是对于计算机科学领域的学生,还是对于从事系统级软件开发的专业人士...
为了更深入地理解 Seelog 的用法,你需要阅读 "TestGo" 示例中的代码,了解其配置和调用方式。同时,参考提供的链接(https://daolizhe.blog.csdn.net/article/details/118696592)中的文章,文章会给出更多关于如何...
《See MIPS Run Linux》是一本深受读者喜爱的计算机科学教材,专注于MIPS架构下的处理器设计与Linux操作系统在MIPS上的实现。这本书对于那些想要深入理解现代CPU架构以及如何在硬件层面上运行操作系统的人来说,无疑...
《iOS游戏应用源代码——akopanev-iOS-Scratch-n-See-6ca51ac.zip》是一个关于iOS游戏开发的资源包,其中包含了完整的项目源代码。这款名为"Scratch-n-See"的游戏可能是一个互动式的、基于触摸屏的儿童教育应用,...
通过阅读本书,你可以学习到如何在MIPS平台上构建和调试Linux应用程序,以及如何优化代码以充分利用硬件资源。 总之,《See MIPS Run 2nd Edition》是学习MIPS架构和Linux操作系统的宝贵资源,无论你是硬件工程师、...
通过阅读《See MIPS Run》,读者可以全面了解MIPS处理器的内部工作机制,这对于计算机硬件爱好者、系统设计师、嵌入式开发者以及计算机科学的学生来说,都是极有价值的参考资料。无论是为了学术研究,还是为了实际的...
"color see see.rar"这个压缩包文件很可能是包含了一个示例项目或代码库,用于演示这一功能。 首先,我们要了解的是Windows 10系统颜色。在Windows 10中,用户可以根据个人喜好调整系统的主题颜色,包括标题栏、...