词法分析 的作用是把输入的源语句转化成单词形式
第五个最右推导没给要推出的句子 如果是 cbb 那过程也不对
E->CB
C->c
B->b
最右推导的分析为
1 CB
2 Cb
3 cb
你给的文法有问题吧,最右推导通俗的说 就是只按照最右边的非终结符推导
你这些都是要干什么的题,如果要考试,后面那几道的类型几乎必考!!!
1、FIRSTVT(T)=FIRSTVT(TF)=;
2、FIRSTVT(T)=FIRSTVT(F)
(1)FIRSTVT(F)=FIRSTVT((E))=(;
(2)FIRSTVT(F)=FIRSTVT(id)=id;
如此,FIRSTVT(T)={,(,id}。
算符优先分析 [上一节] [下一节]
521 算符优先文法及其优先表构造
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法。
在后面的定义中,a、b代表任意终结符;P、Q、R代表任意非终结符;‘…’代表由终结符和非终结符组成的任意序列,包括空字。
假定G是一个不含e-产生式的算符文法。对于任何一对终结符a、b,我们说:
1 a≖b当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
2 a⋖b当且仅当G中含有形如P→…aR…的产生式,而Rb…或RQb…;
3 a⋗b当且仅当G中含有形如P→…Rb…的产生式,而R…a或R…aQ。
如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a≖b,a⋖b, a⋗b
则称G是一个算符优先文法。
现在来研究从算符优先文法G构造优先关系表的算法。
通过检查G的每个产生式的每个候选式,可找出所有满足a≖b的终结符对。为了找出所有满足关系⋖和⋗的终结符对,我们首先需要对G的每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
FIRSTVT(P)={a | Pa…或PQa…,aÎVT而QÎVN}
LASTVT(P)={a | P…a或P…aQ,aÎVT而QÎVN}
522 算符优先分析算法
所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语。所谓最左素短语是指处于句型最左边的那个素短语。如上例,PP和i是句型PP+i的素短语,而PP是它的最左素短语。
现在考虑算符优先文法,我们把句型(括在两个#之间)的一般形式写成:
#N1a1N2a2…NnanNn+1# (54)
其中,每个ai都是终结符,Ni是可有可无的非终结符。换言之,句型中含有n个终结符,任何两个终结符之间顶多只有一个非终结符。必须记住,任何算符文法的句型都具有这种形式。我们可以证明如下定理(证明留给有兴趣的读者作练习):
一个算符优先文法G的任何句型(54)的最左素短语是满足如下条件的最左子串Njaj…NiaiNi+1,
aj-1⋖aj
aj≖ aj+1,…,ai-1≖ai
ai⋗ai+1
根据这个定理,下面我们讨论算符优先分析算法。为了和定理的叙述相适应,我们现在仅使用一个符号栈S,既用它寄存终结符,也用它寄存非终结符。下面的分析算法是直接根据这个定理构造出来的,其中k代表符号栈S的使用深度。
523 优先函数
在实际实现算符优先分析算法时,一般不用表51这样的优先表,而是用两个优先函数f和g。我们把每个终结符q与两个自然数f(q)和g(q)相对应,使得
若q1⋖q2 则 f(q1)<g(q2)
若q1≖q2 则 f(q1)= g(q2) (55)
若q1⋗q2 则 f(q1)>g(q2)
函数f称为入栈优先函数,g称为比较优先函数。使用优先函数有两方面的优点:便于作比较运算,并且节省存储空间,因为优先关系表占用的存储量比较大。其缺点是,原先不存在优先关系的两个终结符,由于与自然数相对应,变成可比较的了。因而,可能会掩盖输入串的某些错误。但是,我们可以通过检查栈顶符号q和输入符号a的具体内容来发现那些原先不可比较的情形。
如果优先函数存在,那么,从优先表构造优先函数的一个简单方法是:
1 对于每个终结符a(包括#)令其对应两个符号fa和ga,画一张以所有符号fa和ga为结点的方向图,如果a ⋗≖b,那么,就从fa画一箭弧至gb;如果a⋖≖b,就画一条从gb到fa的箭弧。
2 对每个结点都赋予一个数,此数等于从该结点出发所能到达结点(包括出发结点自身在内)的个数。赋给fa的数作为f(a),赋给gb的数作为g(b)。
3 检查所构造出来的函数f和g,看它们同原来的关系表是否有矛盾。如果没有矛盾,则f和g就是所要的优先函数。如果有矛盾,那么,就不存在优先函数。
现在必须证明:若a≖b,则f(a)=g(b);若a⋖b,则f(a)< g(b);若a⋗b,则f(a)> g(b)。第一个关系可从函数的构造直接获得。因为,若a≖b,则既有从fa到gb的弧,又有从gb到fa的弧。所以,fa和gb所能到达的结是全同的。至于a⋗b和a⋖b的情形,只须证明其一。如果a⋗b,则有从fa到gb的弧。也就是,gb能到达的任何结fa也能到达。因此,f(a)³ g(b)。我们所需证明的是,在这种情况下,f(a)=g(b)不应成立。我们将指出,如果f(a)=g(b),则根本不存在优先函数。假若f(a)=g(b),那么必有
a⋗b, a1⋖≖b, a1⋗≖b1,…am⋗≖bm, a⋖≖bm
因为对任何优先函数都必须满足(55) 所规定的条件,而上面的关系恰恰表明,对任何优先函数f和g来说,必定有
f(a)> g(b)³ f(a1)³ g(b1)³ … ³ f(am)³ g(bm)³ f(a)
从而导致f(a)> f(a),产生矛盾。因此,不存在优先函数f和g。
524 算符优先分析中的出错处理
524 算符优先分析中的出错处理
使用算符优先分析法时,可在两种情况下,发现语法错误:
1 若在栈顶终结符号与下一输入符号之间不存在任何优先关系;
2 若找到某一“句柄”(此处“句柄”指素短语),但不存在任一产生式,其右部为此“句柄”。
针对上述情况,处理错误的子程序也可分成几类。首先,我们考虑处理类似第2种情况错误的子程序。当发现这种情况时,就应该打印错误信息。子程序要确定该“句柄”与哪个产生式的右部最相似。例如,假定从栈中确定的“句柄”是abc,可是,没有一个产生式,其右部包含a,b,c在一起。此时,可考虑是否删除a,b,c中的一个。例如,假若有一产生式,其右部为aAcB,则可给出错误信息:“非法b”;若另有一产生式,其右部为abdc,则可给出错误信息:“缺少d”。
以上就是关于提问 编译原理问题(高分)全部的内容,包括:提问 编译原理问题(高分)、编译原理中的算符文法,怎样才能用java代码实现求firstvt集和lastvt集,急急急、解释最左素短语的含义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)