目录
既然要做一个编译/解释器,首先确定基本目录模型:
bin/ 和 build/ 不用解释
.gitnore 和 LICENSE 不用解释 test/用于临时测试
架构表:
生成文件[3]:
parser.dll
dogc.dll
dogc.exe
parser.dll BY parser/
这个是解析和生成语法树专门的组件,即parser,编译过程:
flex解析.l文件,生成一个.c;
bison -d --yacc 解析.y文件,模拟yacc,生成一个.c和一个.h
两个c包含.h分别编译,然后连接自己的一些组件(给解析器提供支持,生成语法树的必要支持函数)
生成parser.dll 供dogc.dll依赖
dogc.dll BY src/ && include/
这个生成编译器主程序,但是不可执行.为dogc.exe提供依赖,接收由主程序传参的参数分批编译,解析器依赖parser.dll,其他程序包括核心程序集成在这个动态库里.
包含一个"主函数"接收文件名,接收前台的单个文件名传入接口编译.
dogc.exe BY dogc/
直接依赖dogc.dll ,这个程序里解析命令行参数,解析成后台可接收的数据,然后传参,控制权交给dogc.dll,最后退出执行一些清理参数(已封装在dll中).
这样做还有个好处,分开了yacc/lex的一些全局变量,更安全,单独运行在parser的dll例程中,起到一个隔离的作用.