您的位置:首页 > 其它

编译原理

2016-04-24 21:10 495 查看
短语:子树末端结点符号串

直接短语:两层子树的末端结点符号串

句柄:最左直接短语

单词的描述工具: 正规表达式(正则表达式) 有穷自动机

运算符优先级: ()* . |

重写:

A -> xy : A -> xB

B -> y

A -> x|y A -> x

A -> y

A -> x*y A -> xA

A -> y

正规式转正规文法:

正规式:R = a(a|d)*
文法:  S -> a(a|d)*

S -> aB
B -> (a|d)*

S -> aB
B -> (a|d)B
B -> &

S -> aB
B -> aB
B -> dB
B -> &
练习:R = 1(0|1)*101

正规文法转正规式:

G[S]:   S -> aA -----+
S -> a  -----+--- S -> a|aA   S -> a(&|A)  【1】

A -> aA ----+
A -> dA ----|
A -> a  ----|
A -> d  ----+---- A -> aA|dA|a|d  A -> (a|d)A|(a|d)  A -> (a|d)*(a|d)  A -> (a|d)+ 带入【1】中

S -> a(&|(a|d)+)  S -> a(a|d)*

编译原理(二)确定的有穷自动机DFA与不确定的有穷自动机NFA

有穷自动机:只有一个初态,可以有多个终态

NFA与DFA的转换

1.a弧转换:move(I, a) I状态,输入a,可到达的状态

2.状态集合I的闭包:&-closure(I): 1:I自身 2:I经过任意多个连续空弧能到达的状态

如果有多个初态,把多个初态放在一起求闭包

有穷自动机的化简——去多余,合等价

两个状态等价的条件:

一致性条件:s,t同为可接受状态或同为不可接受状态(同为终态,同为非终态)

蔓延性条件:对于所有的输入符号,s,t必须转换到等价状态里

编译原理(三)正规式和有穷自动机的等价性



e.g. R = (a|b)*abb

编译原理(四)语法分析与FIRST,FLLOW,SELECT集

G: S -> cAd
A -> ab
A -> a

识别输入串 w = cabd是不是该文法的句子

因为A能推出两种情况,所以是不缺定的自顶向下方法

确定的自顶向下方法有三种情况:

1.文法右侧都是非终结符,非终结符的首部不同

2.产生式右侧不全是非终结符,右部首字符不同,无空产生式

3.文法中含空产生式--->FOLLOW集

FIRST集

FIRST(a)

1.经过若干步推导,求出首部为a的集合

2.若a能推出空集,则空集属于FIRST(a)

S -> axc 则 FIRST(S) = {a}

FOLLOW集

FOLLOW(U)

1.对文法的识别符号Z,令#属于FOLLOW(Z)

2.若文法中有形如A->aUb的规则,则FIRST(b)中的非空元素属于FOLLOW(U)

3.若文法中有形如A->aU或A->aUb且FIRST(b)含有这样的规则,则FOLLOW(A)的元素属于FOLLOW(U)

A -> ccdUb 则 FOLLOW(U) = FIRST(A) = c

A -> ccdU 则 FOLLOW(U) = FOLLOW(A) = ....

SELECT集

SELECT(A -> a)

1.若a不能推出,则SELECT(A -> a) = FIRST(a)

2.若a能推出,则SELECT(A -> a) = (FIRST(a) - 空) 并 FOLLOW(A)

LL(1)文法

第一个L:自顶向下分析是从左向右扫描输入串

第二个L:分析时用最左推导

1:表明只需向右看一个符号就能决定哪个产生式进行推导

如何判断一个文法是否是LL(1)文法

同一个非终结符推导出的任意两个SELECT集的交集为空

例2

判断以下文法是否是LL(1)文法

G: S -> aAbDe|d
A -> BSD|e
B -> SAc|cD|空
D -> Se|空
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: