[toc]

编译程序和解释程序


程序设计语言的控制成分

  • 顺序结构
  • 选择结构
  • 循环结构
题目


函数

题目

解析:常量和表达式没有地址


编译、解释程序翻译阶段

符号表

记住蓝色的两句话即可

词法分析

正规式

词法分析的工具

a|b表示a或b

(a|b)*,就是每一位可以是a,也可以是b

有限自动机

词法分析的工具

  • 箭头所指的为初态,双圆圈为终态
  • 合法的字符识别后要到终态
  • a,b表示a或b
  • \(\varepsilon\)表示为空,就是可以直接转移到下一个状态
语法分析

语义分析

动态语义错误

语义分析只能检测出程序的静态语义错误,不能检测出动态的语义错误,要到程序运行时才能检测出来。

中间代码生成

目标代码生成

题目

注意:不要和语法分析中的未定义变量类型弄混了(a = 3), 这个是未赋初值。

除数为0是动态语义错误

整除只能为整数是静态语义错误

死循环了,注意:循环体可以只有一个分号

M1在A处的如果为0转移状态是不确定的


上下文无关文法

题目

解析:S->A0|B1

A->S1|1 , B->S0|0(则可以发现一定包含0和1)


中缀、后缀表达式转换

逆波兰式(后缀表达式)

后缀转中缀,从左往右遍历,遇到两个数就看后面的运算符,把ab?转换成a?b

优先级相同,从右向左

比如:在(3+4)转换成34+之后,有乘除,先弄右边的除号,转成34+5/

语法树中、后序遍历

中序遍历后,需判断要不要在某处加括号

题目

解析:

优先级:与>异或>或

算术(+ - * / %)>关系(> < >= == !=)>逻辑(逻辑与 逻辑或)

逻辑非(!)比以上三中操作符优先级都高


其他题目

正规集可用正规式表示,用有限自动机识别

数据类型应该是数据结构体