FreeKill/docs/fkp/dev/how_does_it_work.rst

110 lines
3.9 KiB
ReStructuredText
Raw Normal View History

.. SPDX-License-Identifier: GFDL-1.3-or-later
fkparse的运行原理
=================
本章大致介绍了fkparse的工作流程和源码分析。
工作流程
--------
词法和语法分析
~~~~~~~~~~~~~~
| 词法分析器和语法分析器由Flex与Bison生成。在成功打开输入文件后程序就会调用yyparse()进行语法分析具体怎么分析的我自己也不太清楚应该是按照LR分析的那种算法总之这个函数具体怎么运行的对掌握大概内容不重要分析完成并没有出现语法错误后就会往全局变量extension声明在main.h中存入一个分析完成的ExtensionObj对象。
| 关于Flex和Bison的语法这里不会十分详细的说明但会在下面稍微提一下。
分析并生成代码
~~~~~~~~~~~~~~
| 在进行完没有语法错误或者成功从语法错误中恢复了的语法分析后yyparse()将返回0然后main.c中调用函数继续分析extension并据此生成Lua代码。
| 以上就是fkparse工作的大概流程十分简单下面详细看看。
基础设施
--------
list.c
~~~~~~
基础设施之链表。里面定义了链表的创建、尾插、头插、取下标、删除某个元素、获取元素下标、获取链表长度、链表销毁等操作。
在声明其的structs.h中还含有一些常用宏如链表遍历、链表判断为空、判断是否包含某个元素等。以及从链表的函数中宏定义出来的一些栈的操作也在里面。
hash.c
~~~~~~
作为整个符号表的基础而存在的哈希表数据结构。
定义了哈希表的创建、销毁、取得数据、存放数据等等,以及许多跟哈希表内部算法有关的内容。
symtab.c
~~~~~~~~
基于哈希表而制作的跟符号表操作有关的函数。
| 为了实现全局变量和局部变量fkparse在一次分析过程中使用了许多符号表大体上每个代码块一个符号表。由于在分析代码时分析函数成为一个栈所以fkparse的符号表也是以栈的形式组织的。在一次对符号表的搜索中程序会从栈顶向栈底逐一检索当一个代码块分析完了它的符号表就从栈中弹出然后销毁掉。
| 本文件具体包括了符号表的检索、设定键值以及销毁。符号表的创建直接用创建哈希表的函数即可。
分析与中间结构
--------------
fkparse不产生语法树而是在分析过程中直接创建中间结构。
ast.c
~~~~~
曾经里面含有各种语法树的构造函数现在里面只剩个checktype了不久后将与error.c合并掉。
object.c
~~~~~~~~
含有各种中间对象的构造和析构函数以及一个很方便调用的对所有Object均适用的析构函数。
lex.c
~~~~~
Flex根据lex.l生成的词法分析器被语法分析器调用。它会读取文件中的字符串并返回合乎词法规则的token。
Flex按照贪心原则进行匹配也就是多种情况下按照最长字符串来所以它能成功区分“摸牌阶段摸牌时”和“摸”这两个词语。
grammar.c
~~~~~~~~~
Bison根据grammar.y生成的语法分析器代码。它是自底向上进行分析的在分析过程中会根据文法规则和语义动作创建相应的对象。
代码生成
--------
builtin.c
~~~~~~~~~
含有各种各样的内置函数和内置变量,以及一个初始化内置符号表的函数。
error.c
~~~~~~~
含有报错相关的各种函数。可以根据行列号将源文本输出到屏幕上考虑了汉字和其他UTF-8字符的特殊情况。
generate.c
~~~~~~~~~~
根据各种对象对症下药生成对应的Lua代码。
main.c
~~~~~~
主函数说实话不是那么重要fkparse到后期估计会以dll/so这样库的形式登场吧。
其他
----
fkparser.lua
~~~~~~~~~~~~
生成的Lua运行起来所必备的种种函数毕竟直接生成神杀的Lua难度很高。
test/\*.txt
~~~~~~~~~~~
fkparse开发时的测试用例。