lr分析法

编译系统中的LR与LL理解

女生的网名这么多〃 提交于 2020-01-26 00:39:17
编译原理:LL(1),LR(0),SLR(1),LALR(1),LR(1)对比 LL(1)定义: 一个文法G是LL(1)的,当且仅当对于G的每一个非终结符A的任何两个不同产生式 A→α|β,下面的条件成立:SELECT( A→α) ∩ SELECT( A→ β ) =dd,其中,   α|β不能同时 ε.    解释:LL(1)的意思是,第一个L,指的是从左往右处理输入,第二个L,指的是它为输入生成一个最左推导 。 1指的是向前展望1个符号 。   LL(1)文法是 上下文无关文法 的一个子集。它用的方法是 自顶向下的(递归式的处理 )。它要求生成的 预测分析表 的每一个项目至多只能有一个生成式 。   上面的定义说的是,任何两个不同的产生式 A→α和 A→β,选择A→α或者 A→β是不能有冲突的,即SELECT( A→α)∩SELECT( A→β)=,具体来说,就是,   第一:First( A→α) ∩First( A→β)=,首符集不能有交集, 否则当交集中的元素出现时,选择哪个产生式进行推导是不确定的 ,(这其中也包含了α|β不能同时ε,否则交集就是{ε}不为空);   第二:若任何一个产生式β,有ε属于First(β),应有First(A)∩Follow(A)为空(当ε属于First(β),则A有可能被空串代替,那么就要看 A的下一个字符,即Follow集

实验四 LR(1)分析法

夙愿已清 提交于 2020-01-19 07:52:52
一、实验目的 构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法 二、实验题目: 1 、对下列文法,用 LR(1)分析法对任意输入的符号串进行分析: (0)E->S (1)S->BB (2)B->aB (3)B->b 2 、 LR(1) 分析表为: 状态 ACTION GOTO a b # S B S0 S3 S4 1 2 S1 acc S2 S6 S7 5 S3 S3 S4 8 S4 r3 r3 S5 r1 S6 S6 S7 9 S7 r3 S8 r2 r2 S9 r2 (1) 若输入 baba# ,则输出为: 步骤 状态栈 符号栈 输入串 ACTION GOTO 1 0 # baba# S4 2 04 #b aba# r3 2 3 02 #B aba# S6 4 026 #Ba ba# S7 5 0267 #Bab a# error (2) 若输入 bb# ,则输出为: 步骤 状态栈 符号栈 输入串 ACTION GOTO 1 0 # bb# S4 2 04 #b b# r3 2 3 02 #B b# S7 4 027 #Bb # r3 5 5 025 #BB # r1 1 6 01 #S # acc 四、参考程序代码 #include<stdio.h> #include