编程语言实现与范式
1.词法分析(Lexical Analysis):
1.1词法分析的作用是什么:
读取源代码中的字符流,并将这些字符转化为令牌。
这是词法分析器的工作流程:
首先Source program输入到词法分析器中,词法分析器将SP转化为令牌流输入到parser中,parser再将语言的语法规则进行语法分析。为后面的语义分析和代码生成做准备。在这期间,Parser还会再向LA索取新的字符流。LA和parser都有可能像Symbol table中加入新的条目,并且在编译过程中查询符号的信息。
整体上看,词法分析的过程就好比做饭,源程序是食谱,厨师是LA,食材和指令是token,parser是做饭的过程。准备下一个步骤的食材和工具就是GetNextToken。符号表就是食材表,语义分析就是确保食材和步骤的准确性。
2.令牌化(Tokenizing):
Tokenizing的目的是为了将输入的字符流分解成单词或者是令牌,输出令牌流,包括名称,关键字和标点符号等等。
过程中的副作用就是会丢弃空白字符和注释。
比如:
if (b==0) a = “Hi”;
如果令牌化后则会变成:
if ( b == 0) a = “Hi”;
所以显而易见,tokenizing的过程就是LA将源代码中的每个字符序列都转化为令牌,并且一处不必要的空格和注释,为后续的解析步骤准备令牌流。
3.文本分解(Breaking up Text)
- 示例:将文本
elsex=0;
正确地分解为else x = 0 ;
。
- 点评:
- 仅仅使用正则表达式(REs)是不够的,还需要有选择合适令牌的规则。
- 多数编程语言采用最长匹配令牌获胜的规则。
- 如果长度相同,需要有一套优先级规则来决定选择哪个令牌。
- 正则表达式、优先级和最长匹配令牌规则共同定义了词法分析器(lexer)
123432143214321