编译原理和是非终结符吗
① 编译原理问题:求解
E是文法开头。ε代表终结符号(推理中代表终点或结果,程序语言中代表常量等)。E T 这些大写字母一般代表非终结符号(这些代表中间过程,非结果。程序中代表函数等等)。开始是E。因为有个G(E)。E就是文法开始符号。推导就有E开始,它也是一个非终结符(代表函数、或者一个推导过程,类似于程序中的main(c++)、winmain(vc++)、dllmain(dll)等主函数)。
1算术表达式文法:这个文法是一个递归文法。计算机进行逻辑推导时会走很多弯路(类似于遍历一颗树的过程)。为了不让计算机走弯路(提高效率的目的),可以变换为第二种文法。这种文法消除了递归(消除了歧义,类似于后缀表达式),使计算机可以一条直线走到底儿推导出结果。
我也很久没看编译原理了。 呵呵
② 编译原理 终结符集合 包不包括空 ε 为什么
因为空符既不是终结符,也不是非终结符,所以不包括。
③ 缂栬疟铡熺悊涓鏂囨硶镄勪骇鐢熷纺镄勫乏閮ㄧ﹀彿涓瀹氭槸涓涓闱炵粓缁撶﹀彿鍢涳纻杩栾瘽瀵逛笉
涓嶅圭殑锛屼笂涓嬫枃镞犲叧鏂囨硶鍜屾h勫纺婊¤冻杩欎釜𨱒′欢锛屼笂涓嬫枃链夊叧鏂囨硶鍜岀煭璇鏂囨硶涓嶆弧瓒宠繖涓𨱒′欢銆
④ 什么是文法(编译原理)
【定义】
文法G定义为四元组(VN,VT,P,S)
其中 VN :非终结符号(即语法变量)集
VT : 终结符号集
VN∩VT =Φ,令V= VN∪VT,V称为文法G的字母表或字汇表。
P :产生式(α→β)集
S :开始符号,且S∈VN ,S至少要在一条规则的左部出现。
【约定】
一般地,文法G的 四元组 不用全部给出 ,而只将产生式写出。
约定:
(1)第一条产生式的左部是开始符号
(2)用尖括号括起来的(或 大写字母 )是非终结符号
(3)不用尖括号括起来(或 小写字母 )是终结符号
(4)还有一种习惯写法,即 G[S] ,其中 S 是 开始符号 。
【举例】
例: G=(VN,VT,P,S)
其中 VN={S},
VT ={0,1},
P={S→0S1,S→01}
S是开始符号
⑤ 【编译原理】第二章:语言和文法
上述文法 表示,该文法由终结符集合 ,非终结符集合 ,产生式集合 ,以及开始符号 构成。
而产生式 表示,一个表达式(Expression) ,可以由一个标识符(Identifier) 、或者两个表达式由加号 或乘号 连接、或者另一个表达式用括号包裹( )构成。
约定 :在不引起歧义的情况下,可以只写产生式。如以上文法可以简写为:
产生式
可以简写为:
如上例中,
可以简写为:
给定文法 ,如果有 ,那么可以将符号串 重写 为 ,记作 ,这个过程称为 推导 。
如上例中, 可以推导出 或 或 等等。
如果 ,
可以记作 ,则称为 经过n步推导出 ,记作 。
推导的反过程称为 归约 。
如果 ,则称 是 的一个 句型(sentential form )。
由文法 的开始符号 推导出的所有句子构成的集合称为 文法G生成的语言 ,记作 。
即:
例
文法
表示什么呢?
代表小写字母;
代表数字;
表示若干个字母和数字构成的字符串;
说明 是一个字母、或者是字母开头的字符串。
那么这个文法表示的即是,以字母开头的、非空的字符串,即标识符的构成方式。
并、连接、幂、克林闭包、正闭包。
如上例表示为:
中必须包含一个 非终结符 。
产生式一般形式:
即上式中只有当上下文满足 与 时,才能进行从 到 的推导。
上下文有关文法不包含空产生式( )。
产生式的一般形式:
即产生式左边都是非终结符。
右线性文法 :
左线性文法 :
以上都成为正则文法。
即产生式的右侧只能有一个终结符,且所有终结符只能在同一侧。
例:(右线性文法)
以上文法满足右线性文法。
以上文法生成一个以字母开头的字母数字串(标识符)。
以上文法等价于 上下文无关文法 :
正则文法能描述程序设计语言中的多数单词。
正则文法能描述程序设计语言中的多数单词,但不能表示句子构造,所以用到最多的是CFG。
根节点 表示文法开始符号S;
内部节点 表示对产生式 的应用;该节点的标号是产生式左部,子节点从左到右表示了产生式的右部;
叶节点 (又称边缘)既可以是非终结符也可以是终结符。
给定一个句型,其分析树的每一棵子树的边缘称为该句型的一个 短语 。
如果子树高度为2,那么这棵子树的边缘称为该句型的一个 直接短语 。
直接短语一定是某产生式的右部,但反之不一定。
如果一个文法可以为某个句子生成 多棵分析树 ,则称这个文法是 二义性的 。
二义性原因:多个if只有一个else;
消岐规则:每个else只与最近的if匹配。