- 编译执行和解释执行的区别
把计算机高级语言编写的程序(源程序)翻译成该计算机的汇编语言或机器语言书写的程序(目标程序)的计算机程序称为编译器
或编译程序
。
解释程序
是和编译器类似的一种语言翻译程序,与编译器的不同之处在于它以源程序为输入,在执行过程中不产生目标程序,而是边解释边执行。边解释边执行工作效率低,可能需要重复翻译和执行语句,经常用于执行命令语言和交互式会话语言。 - 词法分析程序
词法分析程序是逐个读入源程序的字符并按照构词规则切分成一系列单词(token)。
- 正则表达式
用特定的运算符及运算对象按规则构造的表达式,每个正则表达式匹配一个字符串集合。 -
确定性有穷自动机
- 非确定性有穷自动机
有穷自动机在一个状态上,对于某个输入符号,存在不止一种转换,称该有穷自动机为不确定性有穷自动机。 -
正则表达式是一种描述单词的工具,可以根据正规式构造等价的DFA,而DFA描述单词被识别的过程,可以根据DFA构造词法分析程序。
- 语法分析程序
语法分析程序以词法分析程序输出的单词序列作为输入,分析源程序的语法结构,并可以确定单词序列中违反语法结构规则的错误。语法分析的结果一般表示为分析树或语法树。
在保证语义信息不丢失的情况下,去掉语法分析树的冗余节点形成抽象语法树。多个终结符都可提到根节点上。
-
上下文无关文法又称为2型文法,是语法结构描述的标准方式
- 推导和规约
推导:从开始符号S开始,逐步用产生式右部替换左部
规约:从表达式开始,逐步用产生式左部替换右部 -
句子和句型
句子是句型,开始符号S是句型,由终结符构成的字符串是句子
- 最左推导和最右推导
最左推导:每一次直接推导都是用字符串中最左边的非终结符对应的产生式规则进行推导
同理有最右推导,最右推导也称规范推导,由最右推导所得的句型称为规范句型 - 自上而下的语法分析程序
已知文法G[S], 对任意输入串w, 若从文法的开始符号S出发,能为w构造一个最左推导,则w是一个合法的句子,否则w有语法错误。该算法自上而下的为w的分析结果建立一棵语法树。- 递归下降分析
该方法执行一组递归函数判断输入的单词序列是否符合语法规则。为每个产生式规则撰写一个函数,终结符匹配,非终结符调用其所在产生式对应的函数。 - LL(1)分析:只走一条唯一可能成功的道路
L:从左向右处理输入
L:为输入串找出一个最左推导
1:使用输入单词序列中的一个单词预测分析
构造LL(1)分析表的步骤:
1)求First集合
2)求Follow集合
3)构造LL(1)分析表
M[N,T]表示当前分析栈的栈顶符号为N, 而当前词法分析的输入单词为T时,查看LL(1)分析表应该按照哪个产生式进行推导。
- 递归下降分析
- 自下而上的语法分析
从输入单词序列开始,自左至右逐步进行规约,试图将其规约为文法的开始符号。从左到右规约对应的逆过程为最右推导(规范推导),故称之为规范规约。
自下而上的语法分析工作的每一步,都是从当前串中选择一个子串,将它规约到某个非终结符。
句柄:最左边的可规约的子串
活前缀:包含句柄以及句柄之前的所有前缀
可归前缀:包含句柄的前缀,也就是最长活前缀
LR(k)分析是一种有效的自下而上的语法分析技术,它能适用于大部分上下文无关文法的分析。
L:自左向右分析输入单词序列
R:分析过程都是构造最右推导的逆过程(规范规约)
k:在当前分析动作时向右看的单词个数- LR(0):只要当前可规约就规约,不看后面的字符
- SLR(1): 仅在发生冲突时才向右看一个符号,从而确定该采取什么动作
- LR(1): 在LR(0)项目中放置一个向右搜索符号 [A->a., b]
- 语义分析程序
语义分析是在语法分析程序确定出语法短语后,审查有无语义错误,并为代码生成阶段收集符号属性信息。如形参和实参不匹配,类型检查,数组下标是否为整数等。
程序设计语言的语义分为静态语义和动态语义:
静态语义:在编译阶段能够检查的语义
动态语义:在目标程序运行阶段能够检查的语义
- 语义分析的任务
计算各类语法成分的语义信息(属性信息),一般将收集的语义信息存放到相应的信息表中。在编译程序中符号表是用来存放源程序中标识符相关属性信息的一种信息表 - 属性文法的作用
根据已求得的各产生式的语义规则,计算任意句子推导过程中各文法符号(终结符或非终结符)对应的属性值,根据属性值进行相关语义分析。