现在我将对lua的的EBNF范式进行说明 , 为了能够和我们后面的实现逻辑相契合 , 本章展示的EBNF与Part5展示的略有出入 , 一切以本章的为主 , 其EBNF范式如下所示:
exprstat ::= func | assignmentassignment ::= suffixedexp {, suffixedexp} ['=' explist]func ::= suffixedexpsuffixedexp ::= primaryexp {'.' NAME | '[' expr ']' | ':' NAME funcargs | funcargs}primaryexp ::= NAME | '(' expr ')'explist ::= expr {',' expr}expr ::= (simpleexp | unop expr) {binop expr}simpleexp ::= FLT|INT|STRING|NIL|TRUE|FALSE|...|constructor|FUNCTION body|suffixedexpFUNCTION body ::= 'function' '('parlist')' statlist 'end'parlist ::= {param [',' param]}param ::= NAME | ...constructor ::= '{' [field { sep field } [sep]] '}'field ::= listfield | recfieldlistfield ::= exprrecfield ::= (NAME | '[' expr ']') '=' exprsep ::= ','|';'funcargs ::= '('[explist]')' | constructor | STRINGunop ::= '-'|not|'#'|bnotbinop ::= '+' | '-' | '*' | '/' | '%' | '^' | '&' | '|' | '~' | '<<' | '>>' | '..' | '>' | '<' | '=' | '>=' | '<=' | '==' | '~=' | and | or
我们已经通过EBNF范式 , 来描述了我们即将实现的的语法结构和逻辑层次 , 可以看到 , EBNF范式的表述比较抽象且复杂 , 为此 , 我绘制了一张图 , 用来展现它的逻辑层次:
图6
图文的内容展示的很小 , 读者可以点击图片 , 显示大图 , 如果觉得图片还是不够大 , 可以右键点击在新的页签查看 。该图是对上述EBNF范式的归纳 , 之所以要画这张图 , 是为了向读者自顶向下地展示完整的的语法结构 , 展示完整的解析层次 , 展示各个部件的构成和联系 , 它也是我们展示Parse Tree生成的绝佳利器 。我们后续需要根据这张图来实现的编译逻辑 。本章实现的部分 , 只会对符合语法的代码进行编译 , 否则将抛出错误 。
所涉及的基本数据结构
本节 , 我将来介绍的一些基本的数据结构 , 但是并不会一次性将所有的数据结构都在这里展示出来 。有些数据结构在具体应用到的章节再进行展示 , 有利于帮助读者消化和理解 。在lua的语法分析器中 , 最终要的数据结构分别是和Proto这两个结构了 , 我们先来看看结构 , 它的定义如下所示:
// luaparser.htypedef struct FuncState {int firstlocal;// 第一个local变量的位置struct FuncState* prev;struct LexState* ls;Proto* p;// 主要存放虚拟机指令 , 常量表等int pc;// 下一个指令 , 应当存放在Proto结构中的code列表的位置int jpc;// 当一个statement中同时存在 , and和or的逻辑语句时 , // 用来标记jump指令位置的int last_target;int nk;// 当前常量的数量int nups;// 当前upvalue的数量int nlocvars;// 当前local变量的数量int nactvars;// 当前活跃变量的数量int np;// 被编译的代码 , Proto的数量int freereg;// 下一个可被使用的 , 空闲寄存器的位置} FuncState;
上面对结构的一些主要的变量进行了说明 , 关于 , 后续我会单独抽出一章节来详细讨论 , 因此这里不会深入研究这个部分 , local变量 , 则会在下一章进行讲解 。现在我们只要结构的变量 , 有一个初步的概念即可 , 要彻底理解它们 , 需要在编译流程的论述之后才能做到 , 我们接下来看看Proto的数据结构定义:
- 世界上最大的鹰 世界上最大的鹰雕
- 球面镜 球面镜
- 上 一篇文章读懂用户体验
- 何处惹尘埃的上一句是什么 何处惹尘埃的上一句是什么意思
- 石榴树上的洋辣子用什么农药杀死?
- wow剥皮 wow剥皮刀
- 干货献上 2019年蚂蚁金服、头条、拼多多的面试总结
- 桥模式
- 车管所上班时间是什么时候
- 小赢科技纽交所成功IPO:唐越二度将公司带到美国上市