本次新增了FileMap
类,扩充了stmlib.hpp
、ArrayList.hpp
。
stmlib.hpp
主要更新了各种数据类型(诸如int
、bool
)转为String的方法。
ArrayList.hpp
重载了+
运算符和+=
运算符(详见源码)。
在stamon中导入一个代码文件,需要输入对应的文件位置。FileMap
就负责处理这份工作。
当stamon导入一个新的代码文件时会向FileMap进行申请(即调用AddSource
方法),FileMap会检查这个代码文件是否已经被导入。如果没有,则会标记这个文件“已经被导入过”,并且返回打开这个文件的LineReader
。(详见LineReader.cpp
)
分析一个单独的源码文件,我们可以使用Parser。
但是如果若干个源码互相引用,构建出了一个项目。则需要用预处理器来对整个项目进行分析。
本次新增了Preprocessor.cpp
和ParsingQueue.cpp
个文件。
我们先来看看ParsingQueue.cpp
。
ParsingQueue类用于Parser和Preprocessor两个类交互数据。这个类存储着带分析的源码。
Preprocessor每次会从ParsingQueue当中弹出一个待分析的源码。并用Parser进行分析。
Parser在分析该源码的过程中,如果要导入新的文件,会把这个文件加入到ParsingQueue中。
由此我们实现了多个文件的编译能力。
Preprocessor(STMException* e)
:构造函数。
ArrayList<SourceSyntax> ParseSource(String origin, bool isSupportImport)
:分析整个源码项目。origin
为分析的入口文件名(即整个项目的总文件);isSupportImport
这个代表这个项目是否支持引用,如果该值为false,代表只支持分析一个源文件,否则代表支持分析多个文件。
ArrayList<String> ErrorMsg
:在分析一个项目的过程中,难免会有多个源文件出现多个报错。这个数组就存储着所有的报错。如果整个项目没有任何报错则该数组为空。
预处理器的具体用法和案例,详见测试样例test_case/preprocessor/
预处理器的测试样例位于test_case/preprocessor/
中。
在该目录当中,附有code.st
,这是测试用的Stamon代码。当然,你也可以更改code.st,来进行多次调试。
使用样例,应该这么做:
test_case/preprocessor/test.cpp
覆盖到test/test.cpp
当中test_case/preprocessor/code.st
复制并粘贴到源码根目录当中doc/调试指南.md
)test.ast.txt
本文档采用语音转文字编写,出现个别错别字请谅解。
但是不得不说语音转文字写文档就是快。