按照往年题来看,题型较为固定,一般为 10 道大题。
1. 语言的封闭性问题
往年题中有出现。所以简单过一下。
1.1 上下文无关语言的封闭性
对并、积、闭包、置换封闭,对交和补不封闭。仅讲述并和积的构造方法。
1.1.1 并封闭
对于上下文无关语言 L(G1) 和 L(G2) 分别由文法 G1=(N1,T1,P1,S1) 和 G2=(N2,T2,P2,S2) (N1∩N2=ϕ)产生,L(G)=L(G1)∪L(G1) 也为 2 型语言。
只需构造 G=(N,T,P,S) ,其中:
- N=N1∪N2∪{S} ;
- T=T1∪T2 ;
- P=P1∪P2∪{S→S1∣S2} ;
- S=S ;
1.1.2 积运算封闭
对于上下文无关语言 L(G1) 和 L(G2) 分别由文法 G1=(N1,T1,P1,S1) 和 G2=(N2,T2,P2,S2) (N1∩N2=ϕ)产生,L(G)=L(G1)⋅L(G1) 也为 2 型语言。
只需构造 G=(N,T,P,S) ,其中:
- N=N1∪N2∪{S} ;
- T=T1∪T2 ;
- P=P1∪P2∪{S→S1S2} ;
- S=S ;
与上面的区别只有新加入的产生式。
1.2 右线性语言的封闭性
仅讲述并和积的构造。
1.2.1 并封闭
文法角度,对于右线性语言 L(G1) 和 L(G2) 分别由文法 G1=(N1,T,P1,S1) 和 G2=(N2,T,P2,S2) (N1∩N2=ϕ)产生,L(G)=L(G1)∪L(G1) 也为右线性语言。
只需构造 G=(N,T,P,S) ,其中:
- N=N1∪N2∪{S} ;
- P=P1∪P2∪{S→S1∣S2} ;
自动机角度,其实就是添加了一个新的初始状态然后连接。
%EF%BC%9A%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0/1.png)
1.2.2 积运算
文法角度,只需构造 G=(N,T,P,S) ,其中:
- N=N1∪N2 ;
- 如果 A→αB∈P1 ,则 A→αB∈P ;
- 如果 A→α∈P1 ,则 A→αS2∈P ;
- P2⊆P1 ;
自动机角度,头尾连接。
%EF%BC%9A%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0/2.png)
2. Chomsky 文法体系
%EF%BC%9A%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0/3.png)
3. 右线性文法、正则式和有限自动机
%EF%BC%9A%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0/4.png)
4. 米兰机 and 摩尔机
5. Pumping 引理
6. 上下文无关文法的变换
7. 下推自动机与上下文无关文法的变换
8. 构造语言的图灵机
9. 一些问答题
- 为什么要消除左递归?
以后的句法分析算法不适用于左递归,会引起死循环。如果在编写 E 的递归下降解析函数时,直接在函数的开头递归调用自己,输入字符串完全没有消耗,这种递归调用就会变成一种死循环。
- 2 型语言有什么用?
可定义程序设计语言、进行语法分析、简化语言翻译。可以解析递归结构。
- 正则语言有什么用?
编译器中使用正则表达式、正则语言和 DFA 等工具实现了词法分析,即将输入的字符串分解成一个个的单词流,也就是诸如编程语言中的关键字、标识符这样有特定意义的单词。
- 上下文无关文法构造等价的下推自动机时,为什么这么构造?
由于对栈中非终结符的替换总是在栈顶进行,因此,PDA 实际上模拟的是文法的最右推导过程。