自底向上的语法分析解读
第五章 语法分析-自底向上分析方法
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
Stack
LR分析模型
LR分析表
Action矩阵:行代表状态,列代表输入 符,而矩阵元素则表示相应的分析动作: Shift / Reduce / Accept / Error 。 GoTo矩阵:行代表状态,而列则代表语 法符号(非终极符,终极符),而矩阵 元素则表示移入或归约后的转向状态。 定义 若IS是一个LR(0)项目集,X是一个 文法符号,函数GO(IS, X)定义为 GO(IS, X)=CLOSURE(IS(X)),其中 IS(X)为LR(0)项目集IS的投影。
id
E→E+ T T→ id T→ (E)
E
7
S→E $ E→E +T
+
T→(E ) E→E +T
$
2 4
T
8
)
T→(E)
S→E $
E→E+T
GE的LRSM
LRSM给出了所有的可归活前缀
LRSM中的每个状态将对应一个饱和项目集: (1)其中一部分是由先驱状态分出来 (称为基本项目); (2)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
识别规约活前缀的LRSM的构造
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
chap04 语法分析4- 自底向上LR分析法
栈
3. 活前缀不含有句柄的任何符号。
说明句柄中的文法符号没有一个出现在 栈顶
23
为了刻画分析过程中文法的每一个产生式 的右部符号已有多大一部分被识别(出现在栈 顶),在产生式的右部加上一个圆点指示位置。 1. 活前缀已含有句柄的全部符号; A 2. 活前缀含有句柄的部分符号; A 1 2 3. 活前缀不含有句柄的任何符号。 A
4
Sm Xm . . . . . . S1 X1 S0 #
总控程序
输出
输入
id
*
id
+
id
#
LR
sm
Xm sm-1 Xm-1
驱动程序
输出
…
s0
action
goto
栈
分析表
5
2.分析表的组成 分析表由两部分组成,分析动作表和状态转换表。
分析表 action
goto
6
(1) 分析动作表以一个二维数组表示,行代表分析栈栈顶状 态,列代表当前的输入符号,数组元素表示当前栈顶为状 态为Si,而输入符号为aj时,所执行的分析动作Action[Si,aj]。
9
输入
si ai
a1
…
ai
…
an
$
LR
驱动程序
输出
sm 动作( action)表 Xm sm-1 action[sm,ai] Xm-1
action goto 状 当前状态sm面临当前输 … 态 ai … … 入符号 ai时应采取什么 s0 动作:移进(shift) 、归约 … … … (reduce) 、 栈 、接受(accept) sm si 出错(error)。 … … …
上例规范句 型是什么?
5第五章 自底向上语法分析法1
• 总结: 采用图的遍历完成自底向上的分析。
分析过程中有个急需解决的问题:谁先规约?
解决方法:通过比较终结符号之间的优先关系来确定谁 先规约。 由于自底向上的分析过程就是一个图的遍历过程,因此 分析程序通常会使用一个分析栈来辅助分析。 自底向上的分析开始时栈是空的,在成功分析的末尾就 只有开始符号。
文法G[A]={A→(A) | a}分隔如下:
A→.(A)
表示正准备开始分析
A→(.A)
表示(已被吸收,准备吸收A
A→(A.)
表示(A已被吸收,准备吸收)
A→(A).
表示(A)已被吸收,可以归约了
A→.a
表示正准备开始分析
A→a.
表示a已被吸收,可以归约了
有两个开始的地方,到底从谁开始? 解决方法:引入新的开始符号,扩充文法。
• LR(0)文法(LR(0) grammar): LR(0) 项DFA图的 所有状态均不存在移进-归约冲突(shift-reduce conflict) 和归约-归约冲突(reduce-reduce conflict) 。
移进-归约冲突:即某个状态不能既包含一个“移 进的”项目A→.X (X是一个终结符),又包含 一个如B→.的归约项。
$V+V *n
$V+V* n
$V+V*n
$V+V*V
$V+V
$V
• 试分析文法G[A]={A→(A) | a}所对应的串((a))。
(1)构造终结符优先关系表 (2)分析过程
分析栈 $ $( $(( $((a $((A $((A) $(A $(A) $A
输入串 ((a)) (a)) a)) )) )) ) )
主要内容
第5章 语法分析——自底向上分析
(d) aAcBe归约为S
(e)
5.2自底向上分析方法的一般过程
自底向上分析方法,也称为移进归约法,其过程是: 设置一个寄存符号的先进后出栈,称为符号栈。在 分析进行时,把输入符号逐个按扫描顺序移进栈里, 当栈顶符号串形成句柄(即为某条规则的右部)时,就 归约,把栈顶构成句柄的那个符号串用相应规则左 部的非终结符号来代替。再检查栈顶是否又出现了 新的句柄,若有,继续归约;若没有形成新的句柄, 则再从输入符号串移进新的符号,如此继续直到整 个输入符号串处理完毕。最终如果栈里只有识别符 号,则所分析的输入符号串为合法的句子,报告成 功;否则,输入串是不合法的符号串,报告错误。
5.3.2 LR分析表的构成
分析表的动作有下列四种:
1. 移进(Sn):将输入符号aj移进符号栈,将状态n移进状态栈, 输入指针指向下一个输入符号。
2. 归约(R):当栈顶形成句柄时,按照相应的产生式U→W进 行归约。若产生式右部W的长度为n,则将符号栈栈顶n个 符号和状态栈栈顶n个状态出栈,然后将归约后的文法符号 U移入符号栈,并根据此时状态栈顶的状态Si及符号栈顶的 符号U,查GOTO标,将GOTO[Si,U]移入状态栈。
第5章 语法分析——自底向上分析
在自底向上的分析方法中,分析过程从输入符号串开始, 通过反复查找当前句型的句柄,并使用规则,将找到的 句柄归约成相应的非终结符号,直到归约到开始符号。
5.1 规范推导、规范句型和规范归约
规范推导就是最右推导,而通过规范推导能得到的句型 就是规范句型。规范归约也称为最左归约,是规范推导 的逆过程,即在分析的每一步,将当前句型的句柄归约 成相应的非终结符号。
5.3.2 LR分析表的构成
LR分析表是LR分析器的核心部分,它由两部分组成,一是动作部 分ACTION表,二是状态转换部分GOTO表。表中S1、S2、…、Sn 为分析器的各个状态;a1、a2、…、am为文法的全部终结符号及 右界符#;X1、X2、…、Xk为文法的非终结符号。
语法分析--自底向上分析技术
• 质短语 • 算符优先识别算法
第五章 语法分析----自底向上分析技术
5.3算符优先分析技术
5.3.4算符优先文法句型的识别
• 质短语 • 算符优先识别算法
例 文法G[Z]: Z∷=E E∷=T|E+T T∷=F|T*F F∷=(E)|i 设有输入符号串i+(i+i)*i, 试识别它是否是文法的句子。
第五章 语法分析----自底向上分析技术
5.2 简单优先分析技术
5.2.1 优先关系与优先文法
5.2.2 简单优先分析技术的实现 5.2.3 简单优先分析技术的局限性及克服
第五章 语法分析----自底向上分析技术
5.2 简单优先分析技术
5.2.1优先关系与优先文法
• 寻找句柄的基本思想 • 优先关系及其应用 • 简单优先文法
5.3.1算符优先分析技术的引进 Tj<Ti 当且仅当文法G中存在形如U∷=…TjV…的规则,其中V=>Ti…或V=>WTi…;
+
Tj >Ti 当且仅当文法G中存在形如U∷=…VTi…的规则,其中V=>…Tj 或V=>…TjW。
+ 5.3.2算符文法 Z∷=E E∷=T|E+T T∷=F|T*F F∷=(E)|i 例 设有文法G[Z]:
例5.1
步骤 ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) ( 10) ( 11)
设有文法G[E]:E∷=E+E|E*E|(E)|i
栈 # #i #E #E* #E*i #E*E #E #E+ #E+i #E+E #E 输入 i*i+i# *i+i# *i+i# i+i# +i# +i# +i# i# # # # 动作 移入 归约 移入 移入 归约 归约 移入 移入 归约 归约 接受 E∷ =i E∷ =E+E E∷ =i E∷ =E*E E∷ =i 规则
在自底向上的语法
在自底向上的语法一、什么是自底向上的语法自底向上的语法(Bottom-Up Parsing)是一种常用的语法分析方法,用于将一个字符串根据给定语法规则转化为语法分析树。
与之相对的是自顶向下的语法分析方法,自顶向下的语法分析从根节点开始,逐步将输入的字符串分解为非终结符和终结符,直到得到语法分析树。
而自底向上的语法分析则相反,它从叶子节点开始,逐步合并成非终结符,直到得到语法分析树。
自底向上的语法分析方法通常采用的是操作符优先分析法(Operator Precedence Parsing),也称为算符优先文法。
这种分析方法可以通过构造一个算符优先关系表来进行分析,从而判断字符串是否符合给定的语法规则。
自底向上的语法分析方法适用于各种类型的语言和文法,包括正则文法、上下文无关文法等。
这种方法具有较高的灵活性和适应性,并且能够处理大型复杂的文法和语言。
二、自底向上的语法分析步骤自底向上的语法分析过程可以分为以下步骤:1. 词法分析首先,将输入的字符串进行词法分析,将其划分为一个个单词或记号(Token)。
每个单词或记号都具有一个特定的含义,表示了输入字符串中的一个基本语义单元。
2. 初始化构建一个栈(Stack)用于保存已识别的单词或记号,并初始化一个语法分析表(Parsing Table)用于记录语法规则和操作符的优先级关系。
3. 移入操作从输入的字符串中读取一个未处理的单词或记号,并将其压入栈中。
4. 归约操作不断检查栈中的记号序列是否满足某一语法规则,如果满足,则将该记号序列替换为相应的非终结符,并执行相应的语义动作。
重复这个过程,直到不能再进行归约操作。
5. 接受或错误处理如果最终栈中只剩下一个元素,且该元素为起始符号,则语法分析成功,接受输入的字符串。
如果栈中无法进行归约操作,或者最终栈中还有多余的元素,或者无法匹配到输入字符串的所有部分,则语法分析失败,进行错误处理。
三、算符优先文法算符优先文法是自底向上分析方法的代表,它以操作符的优先级和关联性为基础,构造一个优先关系表来进行分析。
编译原理_自底向上的语法分析方法高等教学
P→(E ) 则(<first(E) 所以 ( < +, ( < *, ( <↑, ( < ( , ( < i
26
(4) 求 >关系 E’ →#E# 则 lastVT(E) ># 所以 + > #, * > # ,↑># , ) >#, i > # E→E+T 则lastVT(E) >+ 所以 + >+, * > +, ↑>+ , ) >+, i > + T→T*F 则lastVT(T) >* 所以 *>*, ↑> *, i > *, ) > * F→P↑F 则lastVT(P) >↑ 所以 i >↑, ) >↑ P→(E) 则lastVT(E) >) 所以 + >) , *>) , ↑>) , i >) , ) >)
29
•算符文法的任一句型有如下形式: #N1a1N2a2......NnanNn+1#,若Niai......NjajNj+1为句柄, 则有 ai-1<ai=ai=...= aj-1 = aj> ai+1 •对于算符优先文法,若句型r中含有aNb(或ab)
若a<b,则在r中必有含b而不含a的短语存在 若a>b,则在r中必有含a而不含b的短语存在 若a=b,则在r中含有a的短语必含有b,反之 亦然
(= )
(3) 求 < 关系
E’ → #E# 则 # <first(E)
编译原理 第5章
例:有文法G(S):
S→bAb A→( B | a B→Aa ) 解:文法符号优先关系推导如下: (1) 求=· 关系: 由S→bAb , A→( B, B→Aa ) b =· A, A =· b, (=· B , A =· a, a =· )
自底向上的语法分析
• 核心问题
– 寻找可归约串。对“可归约串”概念的不同定义, 就形成了不同的自底向上的分析方法。在算符优 先分析法中我们用“最左素短语”来刻画“可归 约串”,在“规范归约”中,则用“句柄”来刻 画“可归约串”
分析方法
• 输入串:
abbcde
S → a A c B e A → A b|b B → d
S
b
>·
=· <·
>·
A
(
=·
<· <· =·
=·
<·
B
a
>·
>·
>·
>· =· =·
)
#
寻找句柄
>·
<· <·
>·
简单优先文法的定义: (1)在文法符号集中,任意两个符号之间最多只有 一种优先关系; (2)在文法中任意两个产生式没有相同的右部。
语法树结构如下:
S S S b S b
b
A b
B
b
U S0…Sj-1SjSj+1Sj+2… …Si-1SiSi+1…Sn
算符优先分析
• 我们要通过两个相邻符号SiSi+1之间的关系来找到句 柄: – SiSi+1在句柄内:必然有规则U …SiSi+1… – Si在句柄内部,但是Si+1在句柄之后:必然有规则 U …Si,且存在规范句型…USi+1…。 – 如果Si+1在句柄内,而Si在句柄外,那么必然存在 规范句型…SiU…,且U Si+1…。
5-自底向上语法分析 小结
算符优先分析 重点
• 计算FIRSTVT集和LASTVT集 • 算符优先关系表
• 对给定的算符文法构造算符优先关系表 • 利用算符优先关系表判断该文法是否是算符优先
文法
• 算符优先分析过程
• 应用算符优先分析算法对给定的输入串进行移进-
归约分析,在分析的每一步能确定当前应移进还 是归约,并能判断所给的输入串是否是该文法的 句子。
算符优先分析 一般掌握
• 算符文法、算符优先文法的定义 • 算符优先关系的定义 • 了解算符优先分析法的优缺点和实际应用中的
局限性
LR分析 重点
• 概念: 活前缀、LR(0)项目、LR(k)项目、识别 • • • •
文法所有活前缀的DFA 构造LR(0)项目集规范族、 LR项目集规范族 构造LR(0)、SLR、LR 、LALR分析表 判断文法是否LR(0)、SLR、LR 、LALR文法 LR分析器的工作过程
第五章 语法分析
5.1 自下而上分析基本问题 5.2 算符优先分析 5.3 LR分析 5.4 YACC
重要概念
• • • • • •
自下而上分析面临的问题及解决 可归约串 短语、直接短语、句柄、素短语、最左素短语 移进-归约分析过程 ቤተ መጻሕፍቲ ባይዱ范归约过程 分清句柄和最左素短语的区别,进而分清算符优 先归约和规范归约的区别
第5章+自底向上的语法分析
OPG优先关系的构造
1. 由算法构造算符优先关系 2. 由关系图构造算符优先关系(自学)
36
由算法构造算符优先关系 定义: FIRSTVT(B)={b|B=>+ b…,或B=>+ Cb…} LASTVT(B)={a|B=>+… a,或B=>+… aC} 构造优先关系: 1. ±关系:若有形如A→…ab… A→…aBb…的 产生式,则a ± b。 2. ≮关系:若有形如A→…aB…的产生式,b ∈ FIRSTVT(B),则a ≮b。 3. ≯关系:若有形如A→…Bb…的产生式,a 37 ∈ LASTVT(B),则a ≯ b。
7
自底向上分析方法的分类
寻找句柄的方法不同,就形成了不 同的自底向上分析方法。 优先分析法
简单优先分析法(句柄)
算符优先分析法(最左素短语)
LR分析法(句柄)
8
§5.2 短语、直接 短语及句柄
9
刻画“可归约串”
句型的短语 S =>* αAδ且 A =>+ β,则称β是句型αβδ 相对于非终结符A的短语。 句型的直接短语 若有A β,则称β是句型αβδ相对于非终 结符A 的直接短语。 句型的句柄 一个句型的最左直接短语称为该句型的句 柄。
直观算符优先分析法
为了易于理解算符优先分析法,先介绍 一种简单的算符优先分析法—直观算符优 先分析法。 四则运算的例子说明了运算的次序只与 运算符有关,而与运算对象无关。 因而直观算符优先分析法的关键是对一 个给定文法G,人为地规定其算符(终结符) 的优先关系,再根据任何两个可能相继出 现的终结符的优先关系对输入串进行归约。31
e
B A a S5
a
在自底向上的语法
在自底向上的语法
自底向上的语法是一种从最小的语言单位,如单词和词组,一步
一步构建语法结构的方法。
在这种语法中,语句是通过将一个个短语
和从句连接而成的。
首先,自底向上的语法从单词开始,将它们组合成词组,再将词
组组合成短语,最后将短语连接成句子。
每一层的结构都必须合乎语
法规则,这些规则可以通过语法书或语法软件来学习和应用。
这种语法方法适用于各种语言,包括中文。
在中文中,我们可以
从单字开始,将它们组合成词语,再将词语组合成短语,最后将短语
连接成句子。
例如,以下是一个简单的自底向上的中文语法结构:
单字 -> 词语 -> 短语 -> 句子
在这个结构中,单字是最小的语言单位,如“我”、“你”、“他”等。
词语是由单字组合而成的,如“我爱你”、“你是谁”等。
短语则是由词语组合,如“我对你的爱”、“你的生日礼物”等。
最后,句子是由短语连接而成的,如“我对你的爱是永恒的,就像你送
给我的生日礼物一样珍贵。
”
总之,自底向上的语法是一种有效的语言学习方法,可以帮助学
习者轻松理解语法结构,提高语言表达能力。
自底向上优先分析法
A
c a b d c a b d c a 归约过程形成的推导:S cAd cabd
A
b d
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
步骤 符号栈
简单优先分析法
简单优先分析法是按照文法符号(终结符和非 终结符)的优先关系确定句柄的,因此我们首 先介绍任意两个文法符号之间的优先关系是怎 样确定的,及如何构造优先关系表。
按照文法符号(包括终结符和非终结符)的优先 关系确定句柄。 首先定义优先关系的表示: X≖Y 表示X和Y的优先关系相等。 X⋗Y 表示X的优先性比Y的优先性大。 X⋖Y 表示X的优先性比Y的优先性小。
– 且B Y· · ·
– X⋗Y 文法G中存在产生式A→· · · BD· · · ,
* – 且B · · · X,D Y· · ·
如何确定两个文法符号之间的优先关系?
优先关系
文法G[S]: S→bAb A→(B|a B→Aa) 根据上面≖、⋗、⋖关系的定义,由文法的产生式 可求得文法符号之间的优先关系如下: (1)求≖关系:由S→bAb,A→(B,B→Aa) 可得: b≖A,A≖b,( ≖B,A≖a,a≖)
可得:(⋖(,(⋖a ,(⋖A
S→bAb
A→(B|a
B→Aa)
X⋗Y 文法G中存在产生式A→· · · BD· · · , 且 B · · · X, * D Y· · ·
(3)求⋗关系: a 由S→bAb且A · · · ,B⋗b
由B→Aa)且A · · · ),A a,A · · · B
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序4-4 简单优先分析驱动程序
int parser(void){ int i=0,k=0,r;stack[0]='#'; r=a[k++]; do{ int j,LeftSide; while(!IsHigherThan(stack[i],r)) {stack[++i]=r;r=a[k++];} j=i; while(! IsLowerThan (stack[j-1], stack[j])) j--; LeftSide= RightSideOfAProduction (stack[j],stack[i],i-j+1); if(LeftSide){ /*LeftSide!=0 means the production exists */ i=j;stack[i]=LeftSide; }else /* There is no production which matches the right side */ if(i==2 && r=='#' && stack[i] == STARTSYSBOL) return SUCCESS; else return ERROR; } while (1); } /* end of parser */
与的句柄之间的关系必有下述情况之一: A A
A
… … s t ... … … s t … ... … … s t … ... 1. s在句柄中, 3. s不在句柄中,而t 2. s与t均在句 而t不在句柄中 在句柄中 柄中 对于上述情况,我们规定, 情况1: s>t; 情况2: s=t; 情况3: s<t 另外,还有一种情况,就是s和t均不在句柄中,那么一定存在某句 型使得它们进入上述三种情况之一.
符号串i+i*i的语法分析过程
步骤 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 分析栈 # #i #F #T # T1 # E1 # E1 + # E1 + i # E1 + F # E1 + T # E1 + T * # E1 + T * i # E1 + T * F # E1 + T # E1 + T1 # E1 #E 优先关系 < > > > > = < > > = < > > > > > > r i + + + + + i * * * i # # # # # # 余留输入串 +i*i# i*i# i*i# i*i# i*i# i*i# *i# i# i# i# # # # # # # # 句柄 i F T T1 所用产生式 F→i T→F T1→T E1→ T1
E E E1 T1 T F + * ( ) i E1 T1 T F + = > > > = = < < < < < = < > > > > * ( ) = > > > > i
= > < < <
< < < > >
(二) 简单优先分析的算法
利用优先矩阵进行分析的方法是,逐次查看当前句型
X1X2…Xm相邻两个符号的优先关系,一旦出现 Xi+k>Xi+k+1, Xi+k即为句柄的尾符号,然后从Xi+k开始向 左查看已扫描过的符号,直到发现Xi-1<Xi,Xi即为句柄的 头符号. 可以证明, Xi到Xi+k 之间的符号恰好构成了当前句型的 句柄. 教材中P128程序4-4给出了简单优先分析的驱动程序.
若s和t在任何句型中都不可能相邻出现,则我们规定二者无关系. 注意,这种优先关系是不对称的!
简单优先文法的定义
定义4.1 若一文法G的任何两个符号之间至多存在一 种优先关系,且任意两个不同的产生式无相同的右部,则 称G为简单优先文法
例4.4 考虑文法G’[E]:
EE1 E1E1+T1 |T1 T1T TT*F | F F(E) | i 由文法的产生式可直接看出: E=>E1=>E1+T1=>E1+T =>E1+T*F =>E1+T*i =>E1+F*i =>E1+i*i E=> E1=> T1=> T =>T*F => T*(E) =>T*(E1) =>T*(E1+T1)
优先关系矩阵的构造(续)
<? 由定义4.6, si<sj WVN: si= W >? W =? LEAD+ sj
si (= )(LEAD+) sj; 由定义4.7, 有si<sj W1= W2 W1 LAST+ si W2 LEAD* Sj; 其中 W1 LAST+ si si TRANSPOSE(LAST+) W1 (或:~(LAST+);以及 LEAD* = I+LEAD+ ,I为恒等关系 综上所述, si<sj si ~(LAST+) (=) (LEAD*) sj 利用上述结论我们可构造出相应的关系矩阵(见P131). 对于所得的矩阵(三个), 若无冲突的单元,则相应文法G 就是简单优先文法,可进行简单优先分析.
i F
F→i T→F
i T*F T E1 + T1 E1 成功
F→i T→T*F T1→T E1→ E1 + T1 E→E1
(三) 简单优先分析矩阵的构造
首先,我们在V上定义若干二元关系
定义4.2 LEADV2 A LEAD B iff AB…P; A LEAD+ B iff A=>+ B…; 定义4.3 LASTV2 A LAST B iff A…BP; A LAST+ B iff A=>+ …B 定义4.4 逆关系: TRANSPOSE(R)或 ~R; 定义4.5 si= sj iff U…sisj... P; 定义4.6 si<sj iff U... siW... P W=>+sj…, sj VT; 定义4.7 si>sj iff U…W1W2...P W1=>+…siw2=>*sj… sjVT
(三)算符优先分析的算法
在算符优先文法中,由于优先关系仅定义于VT符中,所以
当句柄仅由一个VN符构成时,无法通过优先关系识别出; 在扫描句型时,利用两个VT符之间的关系,我们总能找出 一个被归约的子串(不一定是句柄),称为最左素短语. 素短语 (1)是一个短语,(2)它至少含有一个VT符,(3) 满足(1),(2)的最小短语. 算符优先分析的句型具有形式 w=#N1a1N2a2…NnanNn+1#, 其中,aiVT , NiVN{ } 寻找最左素短语的方法: 从左到右扫描w,找到第一个 ai>ai+1时,记下ai,再回扫,找到第一个aj-1 < aj,此时, NjajNj+1aj+1…NiaiNi+1就是应被子归约的最左素短语
4.2.2 算符优先分析法
一、算符文法与算符优先文法
定义4.8 若文法G的产生式右部不含两个VN符相邻的情况, 则称G为算符文法.G的VT符被称为算符 可以证明,算符文法不会含有两个VN符相邻的句型 常见语言不一定是算符文法,但可容易地对其进行改造 例 PASCAL中的循环语句:
<循环语句><循环子句><语句> <循环子句>for<变量>:= <循环表> do<语句> 可将其改为 <循环语句> for <变量> := <循环表> do <语句> <循环表> <表达式> to <表达式>
自底向上语法分析的例子
文法: SAB|c AbA|a BaSb|c, 输入为bbaacb
步 骤 0 1 2 3 4 5 6 7 8 9 10 11 12 分析栈内容 # #b #bb #bba #bbA #bA #A #Aa #Aac #AaS #AaSb #AB #S 余留符号串 bbaacb# baacb# aacb# acb# acb# acb# acb# cb# b# b# # # # 下步动作 移进 移进 移进 按 A→a 归约 按 A→bA 归约 按 A→bA 归约 移进 移进 按 S→c 归约 移进 按 B→aSb 归约 按 S→AB 归约 分析成功
方法:在文法的符号之间建立一种(实际是
三种)优先关系RVV,在分析的过程中, 利用优先关系的比较,来确定当前句型的 句柄; 在找到句柄后按相应的产生式归约之,并 将归约出的VN符号压入栈,再进行新的比 较,…,直到出错或分析成功.
(一)简单优先关系的定义
设G是已化简的文法,s,tV,若G中存在规范句型 =…st…, 则s,t
关于自底向上分析
分析过程是最左归约的(规范的);
注意,在分析过程中,一旦句柄在栈顶形成,则立
即归约; 有时栈顶出现了某产生式的右部,但它不一定是 句柄(如前例中第七步,栈顶的a不是句柄); 从分析过程可容易地建立一棵语法树,可用作语 法分析的输出.建立树的方法见P125,这里略.
4.2.1 简单优先分析法
4.2 自底向上的语法分析
自底向上()的语法分析是从给定的符号串出发,试图逐