C语言词法分析程序
词法分析原理:
词法分析是作为相对独立的阶段来完成的(对源程序或中间结果从头到尾扫描一次,并作相应的加工处理,生成新的中间结果或目标程序)。在词法分析过程中,编译程序是通过操作系统从外部介质中读取源程序文件中的各个字符的。同时,为正确地识别单词,有时还需进行超前搜索和回退字符等操作。因此,为了提高读盘效率和便于扫描器进行工作,通常可采用缓冲输入的方案,即在内存中设置一个适当大小的输入缓冲区,让操作系统直接将磁盘上的源程序字符串分批送入此缓冲区中,供扫描器进行处理。
词法分析程序的一般设计方案是:
程序设计语言词法规则⇒正规文法⇒ FA;
或:词法规则⇒正规表达式⇒ FA;NFA确定化⇒ DFA;
DFA最简化;
确定单词符号输出形式;
化简后的DFA+单词符号输出形式⇒构造词法分析程序。
从设计方案可知,要构造词法分析程序,必须掌握以下三个知识点:文法.
正规表达式和FA。
文法与语言的形式定义如下:
一个形式文法 G 是下述元素构成的一个元组(VN ,VT ,P,S )。其中:
- VT —非空有限的终结符号集,即 Σ;
终结符:一个语言不可再分的基本符号。
- VN—非空有限的非终结符号集;
非终结符:也称语法变量,用来代表语法范畴。一个非终结符代表一个一定的语法概念,是一个类(集合)记号,而不是一个体记号。
S —开始符号/识别符号,S∈ VN ;
P —产生式规则集(或叫规则或生成式或重写规则);
产生式:形如α → β或α ::=
β的表达式,其中α为左部,β为右部。α∈(VT∪VN)+且至少含一个VN;β∈(VT∪VN)*。
- VT∪VN =Ф。
仅由字母表A={ai=1,2,…,k}上的正规式α所组成的语言称为正规集,记为L(α
)。正规集的形式化描述式称为正规式。
字母表Σ上的正规表达式和正规集递归定义如下:
Σ 中的a是正规表达式,其正规集为{a};
空串ε是Σ上的正规表达式,其正规集为{ε};
空集Φ是Σ上的正规表达式,其正规集为Φ ;
如果e1和e2是Σ上的正规表达式,它们所表示的正规集分别为L(e1)与L(e2) ,则:
e1|e2也是Σ上的正规表达式,其正规集为L(e1|e2)=L(e1) ∪L(e2)。
e1e2也是Σ上的正规表达式,其正规集为L(e1e2)=L(e1) L(e2)。
(e1)* 也是Σ上的正规表达式,其正规集为L((e1)* )=L(e1)*。
而确定有限自动机(DFA)理论定义DFA M=(Q ,Σ ,t ,q0 ,F)。其中:
Q —有穷非空状态集;
Σ —有穷输入字母表;
t — 映射Q × Σ → Q(单值映射,下态确定);
q0 —q0∈Q,称为开始状态(唯一);
F —非空终止状态集;
非确定有限自动机(NFA M) 定义与DFA M的比较可知:
NFA可有多个初态,并可能含ε弧或字符串弧;在NFA中,t是多值的,即t(s,
a)无法唯一地确定下一状态。
对于FA,最重要的是给出其映射。可以由状态转换表,状态转换图或者直接给出。
直接给出:t(q ,a)=q’;
状态转换表:状态为表列,字母为表行;
3.
状态转换图:是由一组矢线连接的有限个结点所组成的有向图。每一结点均代表在识别或分析过程中扫描器所处的状态。它是设计和实现扫描器的一种有效工具,是有限自动机的直观图示。下面是标识符的状态图:
(正规式与有限自动机的等价性)定义:对任何两个有限的自动机M1和M2,若有L(M1)=L(M2),则称M1与M2等价。
可通过子集法或造表法求解NFA的等价DFA(NFA的确定化方法)。
NFA的确定化方法算法(造表法):
画一张具有n+1列的矩阵表P,n =NFA中出现的符号的个数。各应列的名字分别为I,Ia,Ib,IC,…,其中,a,b,c…是NFA中出的所有字符。
令I = ε-CLOSURE(S0)。S0:NFA的初态集。ε-CLOSURE(S0) = S0∪Sε
Sε= {s| 从S0的某一状态出发经过任意条ε弧可达s}把I填入乘P的I列
计算Ia,Ib,IC,…,并填入相应的列。Ia = ε-CLOSURE(Ja) Ja = {s | 从I的某一状态出发经过一条a弧可到s}
若J∈{ Ia,Ib,IC,…}未在I列出现,则令I =
J。并重复3~5直列所有的J均在I列中出现过。
把P中的各子集作为状态,并重新命名。
确定终态和初态:
初态:I列的第一个元素。 终态:含有原NFA任一终态的子集。
- 画出相应的DFA
正规文法到有穷自动机的转变步骤:
VT ⇒ Σ;
VN ⇒ Q,其中S⇒q0;
A中增加新状态Z作为终态;
U →aV ⇒ t(U,a)=V;
a∈VT或 a=ε,V∈VN 。
U →a (a∈VT) ⇒ t(U,a)=Z。
正规表达式到有穷自动机的转变,对于任意的一个正则表达式e,从
开始,按照变换规则,逐步扩弧. 扩结,直到转换图上所有的弧上都是∑中的单个符号为止。对于引入的每一个新状态,应该赋予一个独有的名字。其变换规则如下:

对于一个语言来说,如何对其单词进行分类和编码并没有一个原则性的规定,而主要取决于处理上的方便。通常按照语法分析的需要设置,用整数表示。
代码
|
|