CPT316 PROGRAMMING LANGUAGE IMPLEMENTATION AND PARADIGMS
CPT316 PROGRAMMING LANGUAGE IMPLEMENTATION AND PARADIGMS

CPT316 PROGRAMMING LANGUAGE IMPLEMENTATION AND PARADIGMS

编程语言实现与范式

1.词法分析(Lexical Analysis):

1.1词法分析的作用是什么:

读取源代码中的字符流,并将这些字符转化为令牌。
notion image
这是词法分析器的工作流程:
首先Source program输入到词法分析器中,词法分析器将SP转化为令牌流输入到parser中,parser再将语言的语法规则进行语法分析。为后面的语义分析和代码生成做准备。在这期间,Parser还会再向LA索取新的字符流。LAparser都有可能像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