当前位置:首页 » 编程语言 » c语言ll1文法

c语言ll1文法

发布时间: 2022-11-12 04:57:46

① 满足甚么条件的文法是LL1文法

对文法G的句子进行肯定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的产生式A—α|β满足以下条件:(1)如果α、β均不能推导出ε,则FIRST(α)∩FIRST(β)=Φ。(2)α和β最多有1个能推导出ε。(3)如果β*═ε,则FIRST(α)∩FOLLOW(A)=Φ。将满足上述条件的文法称为LL(1)文法。

编译原理的LL(1)文法是什么意思

1.文法不含左递归,没有公共左因子
2.对于文法中的每个非终结符A的产生式的候选首符集两两不相交。
3.对于文法中的每个非终结符A,它存在某个候选首符集包括ε,则FIRST(A)∩FOLLOW(A)=空
满足以上条件的文法为LL(1)文法

③ 请问在 c语言中 1LL的意义

C语言中的printf、scanf、 sprintf、sscanf等函数中需要用格式字符串来控制数据的输出格式。

比如: printf("%lx", 65535); /* 将65535输出为十六进制格式 */

输入参数"%lx"就是格式控制串,其中的%是格式控制符, l表示数据为长整型,x表示输出十六进制

执行该函数输出的内容为: ffff

更详细的格式控制符说明如下:

语法: %[-][width][.prec]type

其中中括号中的内容是可选项,每项的含义分别如下:

-: 表示输出时按左对齐的格式,否则为右对齐。

width:输出的总宽度(包括后面的prec),如果给的宽度不够,则会自动增加宽度,而不会截断。

prec: 用于控制浮点数的输出小数位数

type: 类型控制符,具体如下:

d或i: 有符号整数

u: 无符号整数

x: 用十六进制表示整数

o: 用八进制表示整数

f: 浮点数

g: 用科学计数法表示浮点数

s: 字符串

c: 字符

其中 d、i、u、x、f、g前面可以加上字母l或ll表示long或者long long,

比如 "%ld"可以输出32位整数,"%lld"可以输出64位整数。

以上内容仅供参考,因为不同的编译器可能会根据需要定义自己的控制符。

④ 如何判断一个文法是LL文法

1.
对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的产生式A->α|β
满足下列条件:
(1)如果α、β均不能推导出ε,则
FIRST(α)

FIRST(β)
=
Φ。
(2)α

β
至多有一个能推导出
ε。
(3)如果
β
*═>
ε,则
FIRST(α)

FOLLOW(A)
=
Φ。
将满足上述条件的文法称为LL(1)文法。
2.
第一个L代表从左向右扫描输入符号串,第二个L代表产生最左推导,1代表在分析过程中执行每一步推导都要向前查看一个输入符号——当前正在处理的输入符号。
3.
LL(1)文法既不是二义性的,也不含左递归,对LL(1)文法的所有句子均可进行确定的自顶向下语法分析。
4.
并不是所有的语言都可以用LL(1)文法来描述,而且不存在判定某语言是否是LL(1)文法的算法。也就是说,确定的自顶向下分析只能实现一部分上下文无关语言的分析,这就是LL(1)文法所产生的语言。另外,在上述LL(1)文法的条件中,要求:ε

FIRST(α1),ε

FIRST(α2),…ε

FIRST(αn)
中至多有一个成立。

⑤ LL(1)文法的介绍

对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的产生式A—>α|β 满足下列条件:(1)如果α、β均不能推导出ε,则 FIRST(α) ∩ FIRST(β) = Φ。(2)α 和 β 至多有一个能推导出 ε。(3)如果 β *═> ε,则 FIRST(α) ∩ FOLLOW(A) = Φ。将满足上述条件的文法称为LL(1)文法。

⑥ 编译原理的LL(1)文法是什么意思

L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将用最左到推倒,1表明只需向右看一个符号便可决定如何推倒即选择哪个产生式(规则)进行推导,类似也可以有LL(k)文法,也就是需要向前查看k个符号才能确定选用哪个产生式、、

⑦ 如何判断一个文法是LL文法

LL(1)是一种自顶向下的分析文法,是非二义的。所以你如果能为一个输入串构造两棵语法树就不是LL(1)。另外一种直观的判定。LL(1)是向后展望1个字符,如果出现规约冲突就不是LL(1).例子可以参考:
判断下列文法是否是
LL(1)
文法
文法
G
[S]...

⑧ 编译原理-LL1文法详细讲解

我们知道2型文法( CFG ),它的每个产生式类型都是 α→β ,其中 α ∈ VN , β ∈ (VN∪VT)*。

例如, 一个表达式的文法:

最终推导出 id + (id + id) 的句子,那么它的推导过程就会构成一颗树,即 CFG 分析树:

从分析树可以看出,我们从文法开始符号起,不断地利用产生式的右部替换产生式左部的非终结符,最终推导出我们想要的句子。这种方式我们称为自顶向下分析法。

从文法开始符号起,不断用非终结符的候选式(即产生式)替换当前句型中的非终结符,最终得到相应的句子。
在每一步推导过程中,我们需要做两个选择:

因为一个句型中,可能存在多个非终结符,我们就不确定选择那一个非终结符进行替换。
对于这种情况,我们就需要做强制规定,每次都选择句型中第一个非终结符进行替换(或者每次都选择句型中最后一个非终结符进行替换)。

自顶向下的语法分析采用最左推导方式,即总是选择每个句型的最左非终结符进行替换。

最终的结果是要推导出一个特定句子(例如 id + (id + id) )。
我们将特定句子看成一个输入字符串,而每一个非终结符对应一个处理方法,这个处理方法用来匹配输入字符串的部分,算法如下:

方法解析:

这种方式称为递归下降分析( Recursive-Descent Parsing ):

当选择的候选式不正确,就需要回溯( backtracking ),重新选择候选式,进行下一次尝试匹配。因为要不断的回溯,导致分析效率比较低。

这种方式叫做预测分析( Predictive Parsing ):

要实现预测分析,我们必须保证从文法开始符号起,每一个推导过程中,当前句型最左非终结符 A 对于当前输入字符 a ,只能得到唯一的 A 候选式。

根据上面的解决方法,我们首先想到,如果非终结符 A 的候选式只有一个以终结符 a 开头候选式不就行了么。
进而我们可以得出,如果一个非终结符 A ,它的候选式都是以终结符开头,并且这些终结符都各不相同,那么本身就符合预测分析了。

这就是S_文法,满足下面两个条件:

例子:

这就是一个典型的S_文法,它的每一个非终结符遇到任一终结符得到候选式是确定的。如 S -> aA | bAB , 只有遇到终结符 a 和 b 的时候,才能返回 S 的候选式,遇到其他终结符时,直接报错,匹配不成功。

虽然S_文法可以实现预测分析,但是从它的定义上看,S_文法不支持空产生式(ε产生式),极大地限制了它的应用。

什么是空产生式(ε产生式)?

例子

这里 A 有了空产生式,那么 S 的产生式组 S -> aA | bAB ,就可以是 a | bB ,这样 a , bb , bc 就变成这个文法 G 的新句子了。

根据预测分析的定义,非终结符对于任一终结符得到的产生式是确定的,要么能获取唯一的产生式,要么不匹配直接报错。

那么空产生式何时被选择呢?

由此可以引入非终结符 A 的后继符号集的概念:
定义: 由文法 G 推导出来的所有句型,可以出现在非终结符 A 后边的终结符 a 的集合,就是这个非终结符 A 的后继符号集,记为 FOLLOW(A) 。

因此对于 A -> ε 空产生式,只要遇到非终结符 A 的后继符号集中的字符,可以选择这个空产生式。
那么对于 A -> a 这样的产生式,只要遇到终结符 a 就可以选择了。

由此我们引入的产生式可选集概念:
定义: 在进行推导时,选用非终结符 A 一个产生式 A→β 对应的输入符号的集合,记为 SELECT(A→β)

因为预测分析要求非终结符 A 对于输入字符 a ,只能得到唯一的 A 候选式。
那么对于一个文法 G 的所有产生式组,要求有相同左部的产生式,它们的可选集不相交。

在 S_文法基础上,我们允许有空产生式,但是要做限制:

将上面例子中的文法改造:

但是q_文法的产生式不能是非终结符打头,这就限制了其应用,因此引入LL(1)文法。

LL(1)文法允许产生式的右部首字符是非终结符,那么怎么得到这个产生式可选集。
我们知道对于产生式:

定义: 给定一个文法符号串 α , α 的 串首终结符集 FIRST(α) 被定义为可以从 α 推导出的所有串首终结符构成的集合。

定义已经了解清楚了,那么该如何求呢?
例如一个文法符号串 BCDe , 其中 B C D 都是非终结符, e 是终结符。

因此对于一个文法符号串 X1X2 … Xn ,求解 串首终结符集 FIRST(X1X2 … Xn) 算法:

但是这里有一个关键点,如何求非终结符的串首终结符集?

因此对于一个非终结符 A , 求解 串首终结符集 FIRST(A) 算法:

这里大家可能有个疑惑,怎么能将 FIRST(Bβ) 添加到 FIRST(A) 中,如果问文法符号串 Bβ 中包含非终结符 A ,就产生了循环调用的情况,该怎么办?

对于 串首终结符集 ,我想大家疑惑的点就是,串首终结符集到底是针对 文法符号串 的,还是针对 非终结符 的,这个容易弄混。
其实我们应该知道, 非终结符 本身就属于一个特殊的 文法符号串
而求解 文法符号串 的串首终结符集,其实就是要知道文法符号串中每个字符的串首终结符集:

上面章节我们知道了,对于非终结符 A 的 后继符号集 :
就是由文法 G 推导出来的所有句型,可以出现在非终结符 A 后边的终结符的集合,记为 FOLLOW(A) 。

仔细想一下,什么样的终结符可以出现在非终结符 A 后面,应该是在产生式中就位于 A 后面的终结符。例如 S -> Aa ,那么终结符 a 肯定属于 FOLLOW(A) 。

因此求非终结符 A 的 后继符号集 算法:

如果非终结符 A 是产生式结尾,那么说明这个产生式左部非终结符后面能出现的终结符,也都可以出现在非终结符 A 后面。

我们可以求出 LL(1) 文法中每个产生式可选集:

根据产生式可选集,我们可以构建一个预测分析表,表中的每一行都是一个非终结符,表中的每一列都是一个终结符,包括结束符号 $ ,而表中的值就是产生式。
这样进行语法推导的时候,非终结符遇到当前输入字符,就可以从预测分析表中获取对应的产生式了。

有了预测分析表,我们就可以进行预测分析了,具体流程:

可以这么理解:

我们知道要实现预测分析,要求相同左部的产生式,它们的可选集是不相交。
但是有的文法结构不符合这个要求,要进行改造。

如果相同左部的多个产生式有共同前缀,那么它们的可选集必然相交。
例如:

那么如何进行改造呢?
其实很简单,进行如下转换:

如此文法的相同左部的产生式,它们的可选集是不相交,符合现预测分析。

这种改造方法称为 提取公因子算法

当我们自顶向下的语法分析时,就需要采用最左推导方式。
而这个时候,如果产生式左部和产生式右部首字符一样(即A→Aα),那么推导就可能陷入无限循环。
例如:

因此对于:

文法中不能包含这两种形式,不然最左推导就没办法进行。

例如:

它能够推导出如下:

你会惊奇的发现,它能推导出 b 和 (a)* (即由 0 个 a 或者无数个 a 生成的文法符号串)。其实就可以改造成:

因此消除 直接左递归 算法的一般形式:

例如:

消除间接左递归的方法就是直接带入消除,即

消除间接左递归算法:

这个算法看起来描述很多,其实理解起来很简单:

思考 : 我们通过 Ai -> Ajβ 来判断是不是间接左递归,那如果有产生式 Ai -> BAjβ 且 B -> ε ,那么它是不是间接左递归呢?
间接地我们可以推出如果一个产生式 Ai -> αAjβ 且 FIRST(α) 包括空串ε,那么这个产生式是不是间接左递归。

⑨ 关于LL(1)文法

(1)first(E)={(,i},first(D)={+,-,ε},first(T)={(,i},first(S)={*,/,ε}
first(F)={(,i}
follow(E)={#,)},follow(D)={#,)},follow(T)={+,-,#,)} follow(S)={+,-,#,)} follow(F)={*,/,+,-,#,)}
(2)select(E->TD)=FIRST(TD)={(,i}
SELECT(E->+TD)={+}
SELECT(E->-TD)={-}
SELECT(E->ε)={#,)}
SELECT(T->FS)={(,i}
SELECT(S->*FS)={*}
SELECT(S->/FS)={/}
SELECT(S->ε)={+,-,#,)}
SELECT(F->(E))={(}
SELECT(F->i)={i}
预测分析表:
+ - * / ( ) i #
E ->+TD ->-TD ->TD ->ε ->TD ->ε
D
T ->FS ->FS
S ->ε ->ε ->*FS ->/FS ->(E) ->ε ->ε
F ->i

(3)i/i-i的分析过程:
步骤 输入串 剩余串 移进或规约
1 # i/i-i#
2 #i /i-i# E->TD
3 #DT ......
...
剩余的只要按照书上的步骤填就行了。

热点内容
车载wince和安卓哪个好用 发布:2025-01-12 05:58:18 浏览:838
vb6遍历文件夹 发布:2025-01-12 05:58:13 浏览:364
c在C语言中代表什么 发布:2025-01-12 05:52:59 浏览:46
政府PHP 发布:2025-01-12 05:34:30 浏览:651
转码算法 发布:2025-01-12 05:24:02 浏览:418
哪个国家开发安卓系统 发布:2025-01-12 05:08:58 浏览:407
华师数据库 发布:2025-01-12 05:07:03 浏览:505
爱情空间源码 发布:2025-01-12 04:51:53 浏览:892
mongodbphp安装 发布:2025-01-12 04:41:08 浏览:580
sql存储文件路径 发布:2025-01-12 04:37:31 浏览:243