程序设计语言
一、程序语言基础
1.基本概念
- 低级语言:机器语言、汇编语言
- 高级语言:
- Fortran 科学计算,执行效率高
- Pascal 为教学开发,表达能力强
- Prolog 逻辑性程序设计语言
- C语言 指针操作能力强,可以开发系统级软件,高效
- C++ 面向对象,高效
- Java 面向对象,中间代码,跨平台
- C# 面向对象,中间代码,.net架构
- Python 面向对象解释型语言
2.分类
- 命令式和结构化:Fortran、Pascal、C
- 面向对象:C++、Java、C#、Python、Smarttalk
- 函数式:Scala、LISP、APL、Haskell、Scheme
- 逻辑性:Prolog
3.成分
- (1)数据成分:数据类型、变量、常量、全局/局部变量
- (2)运算成分:运算符
- (3)控制成分:顺序结构、选择结构、循环结构
- (4)传输成分:允许数据传输的方式,如赋值处理、输入输出等
- (5)函数:函数首部、函数体
- 值调用:传递值
- 引用调用:传递引用
二、语言处理程序
1.编译程序原理
- 词法分析:读取源程序的字符流
- 语法分析:输入的是记号流
- 语义分析
- 中间代码生成
- 前缀表达式+ab、中缀表达式a+b、后缀表达式ab+
- 代码优化
- 目标代码生成
2.文法
字母表、字符、字符串集合及运算
-
字母表∑ = {a,b} a和b是字符
-
字符串的长度 |abc| = 3
-
空串ε
-
连接 字符串S和T的连接表示为S·T,连接号可省略
-
∑是指包括ε在内的所有字符串任意组合 ∑={a,b} , ∑={aa,bb,ab,ba,aaa...}
-
字符串的方幂,把字符串a自身连接n次得到的串,成为a的n次方幂
-
字符串集合运算
- 或(合并):A∪B = {α|α∈A或α∈B}
- 积(连接):AB={αβ|α∈A且β∈B}
- 幂:A的n次幂=A*A^(n-1) n>0 并规定A^0 = {ε}
- 正则闭包+:A+ = A^1∪A^2∪A^3∪A^n∪.... 不包含空串ε
- 闭包*:A* = A^0∪A+
-
文法G是一个四元组,G=(V,T,P,S)
- V 非终结符 不是语言的组成部分,不是最终结果,可以推导其他元素
- T 终结符 是语言的组成部分,是最终结果,不能再推导其他元素
- S 起始符 是语言的开始符号
- P 产生式 用终结符代替非终结符的规则,a->b
-
乔姆斯基文法分类
- 0型文法:短语文法
- 1型文法:上下文有关文法
- 2型文法:上下文无关文法
- 3型文法:等价于正规式
3.正规式
正规式 | 正规集 |
---|---|
ab |
字符串ab构成的集合 |
a丨b |
字符串a、b构成的集合 |
a* |
由0个或者多个a构成的字符串集合 |
(a丨b)* |
所有字符a和b构成的串的集合 |
a(a丨b)* |
以a为首字符的a、b字符串的集合 |
(a丨b)*abb |
以abb结尾的a、b字符串的集合 |
4.有限自动机
- 是一个识别装置的抽象概念,能准确识别正规集
- 分为确定有限自动机DFA和不确定有限自动机NFA
- 输入一个字符能得出唯一后继就是DFA,得出多个后继则是NFA
5.语法分析方法
-
自上而下的语法分析:从左到右,递归下降的思想
给定文法G和源程序串r,从G的开始符号出发, 反复使用产生式对句型中的非终结符进行替换(推导), 逐步推导除r
-
自下而上的语法分析:从右往左,移进-规约的思想
从给定的输入串r开始, 不断寻找字串与文法G中某个产生式的候选式进行匹配, 并用产生式的左部代替(规约)之,逐步规约到开始符号