文法的二义性和化简

1,判断一个文法是否存在二义性

一个文法,如果它的一个句子有两棵或两棵以上的语法树,则称此句子具有二义性。如果一个文法含有二义性的句子,则该文法具有二义性。这里的二义性是指语法结构上的。如果一个句子具有二义性,那么对于这个句子的结构可能有多种“正确”的解释。通常情况下,句子的语义要通过其语法结构来定义,所以,二义性一般是有害的。

2,文法的二义性是否能够判定呢???

文法的二义性是不可判定的。即不存在一个算法,它能在有限的步骤内确切地判定一个文法是否具有二义性。

3,怎么消除文法的二义性

a,从语义解释方面加以限制

b,重新构造一个等价的无二义性文法

4,文法的化简

a,无用非终结符号和不可达文法符号的产生式应删除

b,单产生式应删除 (对于形如 A→A 的产生式,即使A是一个有用的符号,此类产生式也是不必要的。并且,如果一个句型中含有非终结符号A,那么可任意多次使用产生式A→A,这除了使同一句型具有不同的语法树即引起二义性外,别无其它作用。因而一开始我们就可将这样的产生式从文法中删去)

PS:把右部仅含一个非终结符号的产生式,即形如A→B (A,B∈Vn)的产生式称为单产生式。

c,ε 产生式应删除

PS:所谓 ε 产生式,是指右部为单一空符号串 ε 的产生式。

5,无用非终结符号

如果文法的某个非终结符不出现在文法的任何一个句型中,并且不能从它推导出终结符号串,则称该非终结符为无用非终结符号。

for example:

设文法G[A]:

A→aaBbb

B→aBb|ab

C→cD|c

D→Ef

PS:此文法中的非终结符号D 与E ,不可能出现在任何一个句型中,而且不能从它们推导出终结符号串,所以,D与E是无用非终结符号(且非终结符C 是一个不可达的文法符号)。

6,不可达文法符号

如果一个非终结符号不出现在文法的任何一条产生式的右部,则称该非终结符为不可达文法符号。对于上例文法G[A] 中非终结符C 就是一个不可达的文法符号。

PS:不可达文法符号和无用非终结符号都不可能出现在文法的句型中,也就是说,它们对于生成文法的语言都毫无意义,或者说包含不可达文法符号和无用非终结符号的产生式对于文法来讲都是多余的。

7,可空非终结符

对2 型文法可进行扩充,允许产生式中包含空产生式。如果某个非终结符号能直接推导出 ε(A→ ε) ,那么这个非终结符号称为可空非终结符。2 型文法添加空产生式之后,文法的语言除了增加一个空串 ε 之外,并没有改变文法的类型。

时间: 2024-10-29 19:13:27

文法的二义性和化简的相关文章

第九次 DFA化简

1.将DFA最小化:教材P65 第9题 I {1,2,3,4,5} {6,7} {34}b->{6,7} {1,2}b->{2} {5}-> {6}b->{6} {7}b->{6} {6,7}不可区别 II {1,2},{3,4},{5} {6,7} {1}b->{2},{2}b->{2} {3}c->{3},{4}c->{3} {1,2}不可区别,{3,4}不可区别 不可区别 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→

卡诺图简单逻辑化简与五变量卡诺图化简

一.格雷码编码规则 画卡诺图的时候需要先将所有变量可能以格雷码的形式排列在方格两侧,所有变量有2^n个,虽然我们常用的变量为四个及以下,可以熟记格雷码,但为了学习还是有必要了解格雷码的编码规则.格雷码的基本特点就是任意两个相邻的代码只有一位二进制数不同,这样在数字电路中变化时每次就只有一位发生变化,提高了电路的稳定性. 规则: 自然二进制数到格雷码: 保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似. 格雷码到自然二进制数

逻辑函数的化简 【数字电路】

逻辑函数的化简 先补点各种门的 basic knowledge NAND 与非 NOR或非 XOR异或 XNOR 同或 对于同或,异或之前一直没搞明白....那个该死的标记老是混淆,也不知道为嘛标记的发明人为嘛要那么标记 ...现在知道了XOR...所以异或的标记是一个圈中间一把×             化简: 上面预设的ABCD的值输出结果是1 至于化简过程是为嘛...这个就是一步步化简....各种求并消项 切记!不要搞这种傻事! 然后就是另外一个很重要的化简方法--卡诺图 将n变量的全部最

HDU 5912 Fraction(模拟——分子式化简求解)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5912 Problem Description Mr. Frog recently studied how to add two fractions up, and he came up with an evil idea to trouble you by asking you to calculate the result of the formula below: As a talent, c

线性代数-矩阵-【5】矩阵化简 C和C++实现

点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/HongYi-Liang/p/7275278.html [3]矩阵加减:http://www.cnblogs.com/HongYi-Liang/p/7287403.html [4]矩阵点乘:http://www.cnblogs.com/HongYi-Liang/p/7287324.html [5]矩

UVA - 10886 - Standard Deviation(化简 + 暴力)

题意:求如下函数产生的值的前 n 项的标准差(1 <= n <= 10000000,0 <= seed < 2^64). long double gen(){ static const long double Z = ( long double )1.0 / (1LL<<32); seed >>= 16; seed &= ( 1ULL << 32 ) - 1; seed *= seed; return seed * Z; } 写出方差的式

ios开发小技巧-用宏化简代码

在IOS开发中,要做字典转模型一般情况如下: 1 /** 2 * 声明方法 3 */ 4 - (instancetype) initWithDictionary:(NSDictionary *)dict; 5 + (instancetype) carWithDictionary:(NSDictionary *)dict; 6 7 /** 8 * 实现方法 9 */ 10 - (instancetype)initWithDictionary:(NSDictionary *)dict 11 { 12

YZOI Easy Round 2_化简(simplify.c/cpp/pas)

Description 给定一个多项式,输出其化简后的结果. Input 一个字符串,只含有关于字母x 的多项式,不含括号与分式,没有多余的空格. Output 一个字符串,化简后的多项式,按照次数从大到小的顺序输出各项. Input Sample x^3+3*x^4-2*x^3+1-x Output Sample 3*x^4-x^3-x+1 Hint 每项系数<10,次数<6,项数<20.字符串长度不超过100. 很烦的模拟   代码如下: #include<iostream&g

HDU 4565 So Easy! 数学 + 矩阵 + 整体思路化简

http://acm.hdu.edu.cn/showproblem.php?pid=4565 首先知道里面那个东西,是肯定有小数的,就是说小数部分是约不走的,(因为b限定了不是一个完全平方数). 因为(a - 1)^2 < b < (a ^ 2),所以其不是完全平方数,假如是,那么设其为c,则有a - 1 < c < a,这是矛盾的 所以,向上取整这个步骤,是必不可少的了. 那么,我在它后面加上一个< 1的数,同时使得它们结合成为整数,那就相当于帮它取整了.根据二项式定理 (