1. 前言
前面的文章中,我们从理论和实践的角度,围绕着代码解析做了相关工作。理论和实践密不可分,通过实践,我们可以加强对理论的理解。本篇文章我们主要总结对生成式理论的补充理解。
2. 生成式与词法解析
生成式主要用作词法解析。
生成式就是词法公式,使用它,我们可以实现上下文无关的代码解析。
上下文无关,只是一个相对的概念。它是指,解析本条词法,只需要生成式即可,不需要其他信息。即上下文无关,只和生成式相关。
首先指出一个理解误区:
- 解析代码并不是在每次解析时,都需要先判断将要出现的代码内容,根据内容去判断该怎么去解析。如果是这样,那么内容出现的可能性太多,很难去进行解析。
其实,只有在识别起始符的时候,才需要判断被解析的代码内容是什么。识别出起始符后,随着越来越多的信息被确定下来,后续的解析将变成:我们希望出现什么内容,如果没有出现生成式预期的内容,只需要报错即可。也就是说,起始符解析完成后,解析会越来越简单。
所以,任何生成式对应的词法解析过程,主要分成以下几个步骤:
- 分辨起始符
- 期望中间符号
- 期望结束符号
之所以要期望结束符号,是因为只有前一个生成式对应的语法结束了,此生成式对应的所有字符消耗完后,下一个生成式的起始符号才能刚好被解析到。
进一步地,一个代码文件的所有代码,将不再是一个一个字符组成的字符流,而应该是一个一个生成式对应的词法/语法结构,一个紧挨着一个。正因为整个代码文件被划分成一个一个的独立的,上下文无关的“小模块”,解析整个文档才成为代码可以完成的事情。相反,如果无法简单的独立成一个一个上下文无关的小模块,例如人类的自然语言,那么解析起来就比较困难。我们也可以理解成,编程语言是自然语言的简化版本,简化到可以被解析程序在较快的时间内进行解析,以满足实际使用需求。
3. 总结
通过实际编码,可以加深对生成式的理解。理论本身的创造过程应该是从实践中总结出来的,但是我们在学习理论的时候,往往是从理论开始的,这就造成了理论很难理解,理论本身有时候并不是很难,而是没有和实践结合起来。
词法解析部分的基本原理,我们基本弄明白了。后面我们将进行语法解析的理论学习及程序设计。