2.1 程序语言的定义
字母表、单词符号、语法单位
- 语法
- 语义
语义描述方法:属性文法和基于属性文法的语法制导翻译方法。
2.2 高级语言的一般特性
高级语言的分类
- 范型(4种)
- 编译时的类型检查(2种)
- 类型检查强弱(2种)
程序设计语言的一般特性:
(1)程序结构
(2)数据类型与操作
数据类型:基本数据类型、构造数据类型、自定义数据类型
数据类型的三要素
(3)语句
表达式由操作数和操作符组成。前缀、中缀、后缀
(4)控制结构
2.3 程序语言的语法描述
概念:字母表、符号串、符号串的前缀 后缀 子串
正则闭包和正闭包相比,没有空串
上下文无关文法(独立性、不能用来描述自然语言)
包括终结符、非终结符、开始符号、产生式
产生式的推导:最左、最右
如果一个文法存在某个句子对应两棵不同的语法分析树,则称这个文法是二义的。
消除二义性:给产生式定义优先级
名称 | 表达式 | 限制 |
0型文法(短语文法) | a->b | a、b属于终结符非终结符集合的并 a至少含有一个非终结符 |
1型文法(上下文有关文法) | a->b | a的长度要小于等于b的长度 S->ε 除外,但S不得出现于任何产生式的右部 |
2型文法(上下文无关文法) | A->a | A为非终结符,a为终结符和非终结符组成的符号串,可以是空串 |
3型文法(正规文法) | A->aB或者A->Ba | A、B为非终结符, a为终结符组成的符号串,可以是空串 |
语言表达能力依次减弱
课后题
6. 是0~9组成的数字串
0127:
N->ND->NDD->NDDD->DDDD->0DDD->01DD->012D->0127
N->ND->NDD->NDDD->DDDD->DDD7->DD27->D127->0127
34:
N->ND->DD->3D->34
N->ND->DD->D4->34
568:
N->ND->NDD->DDD->5DD->56D->568
N->ND->NDD->DDD->DD8->D68->568
7. G->1|3|5|7|9
O->1|2|3|4|5|6|7|8|9
T->0|O
R->O|OT
S->G|RG
8. 最左
E->E+T->T+T->F+T->i+T->i+T*F->i+F*F->i+i*F->i+i*i
E->T->T*F->F*F->i*F->i*(E)->i*(E+T)->i*(T+T)->i*(F+T)->i*(i+T)->i*(i+F)->i*(i+i)
最右
E->E+T->E+T*F->E+T*i->E+F*i->E+i*i->i+i*i
E->T->T*F->T*(E)->T*(E+T)->T*(E+F)->T*(E+i)->T*(T+i)->T*(F+i)->T*(i+i)->F*(i+i)->i*(i+i)
9. 句子iiiei有两个语法树:
S->iSeS->iSei->iiSei->iiiei
S->iS->iiSeS->iiSei->iiiei
10. s->TS|T
T->(S)|()
11. L1
S->AB
A->aAb|ab
B->cB|c
L2
S->AB
A->aA|a
B->bBc|bc
L3
S->AB
A->aAb|ab
B->aBb|ab
L4
S->A|B
A->1A0|B
B->0B1|01
感想:
关于几种语法的区分整理完笔记也一头雾水,通过百度搜索了解了具体的区分方法。
在语法设计的逻辑方面感觉比较难一点。