编译原理规约终结符
⑴ 编译原理中终结符具有什么属性,非终结符具有什么属性
终结符,通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行 推导。
不是终结符的都是非终结符。非终结符可理解为一个可拆分元素,而终结符是不可拆 分的最小元素。
⑵ 请问编译原理中的终结符和非终结符是什么意思
终结符,通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行
推导。
不是终结符的都是非终结符。非终结符可理解为一个可拆分元素,而终结符是不可拆
分的最小元素。
⑶ 编译原理中FIRSTVT和LASTVT是什么意思
Firstvt和Lastvt是为了画算符优先关系表的(就是表里面填优先大于小于等于的那个)。
然后要注意他们可都是终结符的集合。
Firstvt
找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
A->a.......,即以终结符开头,该终结符入Firstvt
A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt
Lastvt
找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
A->.......a,即以终结符结尾,该终结符入Lastvt
A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt
⑷ 编译原理 终结符集合 包不包括空 ε 为什么
因为空符既不是终结符,也不是非终结符,所以不包括。
⑸ 计算机科学与技术中编译原理简答题
时间有点久记得不太真切,用通俗语言说,希望题主尽量查阅书籍参考资料自行验证理解。
1、什么是移进项目,什么是规约项目
这个是自顶向下和自下向上分析时候用到的。所谓移进就是不处理,所谓规约就是处理,合并,替换。比如当前符合某个正规式左部,就用这个正规式右部替换左部,称为规约。两种操作的目的都是为了分析整体是否符合语法树。
2、请给出生成C语言语句序列的文法(假定s表示任意一个语句,它为终结符)
关于这个,我感觉你描述的不是很清楚,因为C语言文法包含的正规式还是挺多的,如果单指statement的话,
statement_listà
statement
| statement_list statement
Statementà
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
再配合上相应的终结符。
3、能用上下文无关文法生成正规集吗?为什么?
可以。不过无法保证不含冲突。
4、计算first集和follow集对于构造自顶向下的语法分析器有什么作用?
可以用来排除冲突。例如移进-移进冲突,移进-规约冲突。
5、是否可能存在这样一个DFA,它的所有状态都是接受状态,包括其实状态,为什么?
这个爱莫能助,据我的构想是可以的,但是这样的DFA最终都会成为单一状态DFA。
⑹ 编译原理中 文法 文法G定义为四元组(Vn ,Vt,P,S)这4个是什么意思 另外 终结符和非终结符是什么意思
文法G是一个四元式(Vt,Vn,S,P)
其中Vt是一个非空有限集,它的每个元素称为终结符号
Vn是一个非空有限集,它的每个元素称为非终结符号(Vt和Vn的交集为空)
S是一个非终结符号,称为开始符号
P是一个产生式集合(有限),每个产生式的形式是P-->a
开始S必须在某个产生式的左部出现一次
终结符指组成语言的基本符号(如基本字、标识符、常数、算符、界符)
非终结符号(也称语法变量)表示一定符号串的集合。
你看到小写字母一般是终结符,大写字母肯定是非终结符
不明白可以联系。
⑺ 编译原理——LR分析表
自底向上的语法分析
LR分析表的结构如上,其分为两个部分 Action Goto
两个参数状态i,终结符号a(s(i)代表第i个状态,r(i)代表第i条表达式)
Goto[i,A]=j
文法
容易得知这个文法可以推出 0 1 00 01 等的字符串。因为它是 左递归 。不适用于 LL 文法分析,只能使用 LR 分析。
因为本题入口有两个—— S → L·L S → L ,所以需要构造额外的产生式 S'->S
2.1 第一次遍历
我们从 [S -> . L·L] 开始,构造这个状态的闭包,也就是加上所有能从这个产生式推出的表项。
首先,判断 . 后面是否为 非终结符号A 。如果是,那我们就得找所有由 A-> 推出的产生式,并将它们添加进入 闭包 里(也就是State包里)。循环做即可。
因此我们可以得到 State 0 有
下一步,就是我的 . 往下一位移动。对每个符号X后有个 . 的项,都可以从 State 0 过渡到其他状态。
由以上6条式子可以得知下一位符号可以是 S L B 0 1 。所以自然可以得到5个状态。
State 1 是由 State 0 通过 S 转移到这里的,所以我们找出所有 State 0 中在 S 前有 . 的项。
此状态作为结束状态 Accept ,不需要继续状态转移了。
State 2 是由 State 0 通过 L 转移到这里的,所以我们找出所有 State 0 中在 L 前有 . 的项。
S -> . L·L S -> . L L -> . LB
有3条式子,现在我们将 . 向后推一格,就得到 State 1 的项了。
但是 . 之后的符号分别是 · $ B , B 为非终结符号,我们得包含 B -> 的项
State 3 是由 State 0 通过 B 转移到这里的,所以我们找出所有 State 0 中在 B 前有 . 的项。
因为 . 后没有其他符号了,因此这个状态不需要继续转移了。
State 4 是由 State 0 通过 0 转移到这里的,所以我们找出所有 State 0 中在 0 前有 . 的项。
因为 . 后没有其他符号了,因此这个状态不需要继续转移了。
很简单,同样的道理找 State 5
State 5 是由 State 0 通过 1 转移到这里的,所以我们找出所有 State 0 中在 1 前有 . 的项。
因为 . 后没有其他符号了,因此这个状态不需要继续转移了。
好的,现在我们第一次遍历完成。
2.2 第二次遍历
第二次遍历自然从 State 2 开始。
我们回到 State2 ,可以看出 . 之后的符号有 · B 0 1 。
State 6 是由 State 2 通过 · 转移到这里的,所以我们找出所有 State 2 中在 · 前有 . 的项。
S -> L. ·L 只有1条,我们往后移发现 L 又为非终结符号,参考 State 0 做的操作,我们得找出所有的式子。
共有5条式子,共同组成 State 6 ,由上面的式子可以看出我们还得继续下一次遍历。先不管着,我们进行下一次状态查找。
State 7 是由 State 2 通过 B 转移到这里的,所以我们找出所有 State 2 中在 B 前有 . 的项。
L -> L. B 也是只有1条,我们往后移发现没有非终结符号了,那就不需要再继续添加其他式子了。
这个状态也不需要继续进行转移了。
接下来很关键,因为我们通过 State2 的 . 后的符号找出了 State 6 State 7 ,接下来还差符号 0 1 ,那么是否像之前一样按例添加状态呢, 答案是不是的 ,因为我们发现通过 0 1 找到的闭包集分别是 B -> 0 B -> 1 ,这与我们的之前的 State 4 State 5 相同。所以我们得将其整合起来,相当于 State 2 通过 0 1 符号找到了 State 4 State 5 状态。
2.3 第三次遍历
回头看第二次遍历,可以看出只有 State 6 可以进行状态转移了。
那么就将 State 6 作为第三次遍历的源头,可以看出 . 之后的符号有 L B 0 1 。
State 8 是由 State 6 通过 L 转移到这里的,所以我们找出所有 State 6 在 L 前有 . 的项。
S -> L· .L L -> . LB 有两条式子,往后移发现有非终结符号 B ,所以经过整合可以得到
可以看出 . 的后面还有一个符号,所以这里我们还得再进行一次遍历。
接下来,又是遇到重复的包的情况,可以看出我们由 State 6 通过 B 0 1 得到的闭包分别是 L->B B->0 B->1 ,很明显,这分别对应于 State 3 State 4 State 5 。
第三次遍历也就结束了。
2.4 第四次遍历
回看第三次遍历,可以看出只有 State 8 可以进行状态转移,其 . 之后的符号分别是 B 0 1 。
诶,感觉很熟悉,就是上面几行刚说的情况,也就是说通过这三个符号找到的闭包是我们之前遇到的状态,分别是 State 3 State 4 State 5 。
做到这里,我们发现我们已经全部遍历完毕!
总共有8个状态,通过以上流程做成个图是什么样子的?来看看!
这么一看就很清晰明了了,我们就可以通过这个图做出我们的 LR分析表
其实就是我们之前呈现的表
在状态 I2 和 I8 中,既有 移入 项目,也有 规约 项目,存在 移入 - 规约的冲突 ,所以不是 LR(0) 文法,但是因为 FOLLOW(S) ∩ {0, 1} = ∅,所以可以用 FOLLOW 集解决冲突,所以该文法是 SLR(1) 文法。
上表我们发现还有 r1,r2,r3 等。这个其实就是代表状态停止转移时为 第几条表达式 ,r3代表第三条表达式 L -> LB 。
当我们构建了表之后,我们如何运用起来呢?
下面我们通过一个例子来说明
以上字符串是如何被SLR分析器识别的呢?
⑻ 编译原理中V*是什么意思
v表示终结符和非终结符集合。
+表示集合中的一个或多个元素构成的串的集合。
所以v+表示由一个或多个终结符或非终结符构成的串的集合。比如如果a∈vt,a∈vn,那么a,a,aa,aa,aaa,aaa等都是v+中的元素。
⑼ 编译原理中 FIRSTVT 和LASTVT
Firstvt:找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
A->a.......,即以终结符开头,该终结符入Firstvt;
A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt;
A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt。Lastvt:找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
A->.......a,即以终结符结尾,该终结符入Lastvt;
A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt;
A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt。
⑽ 【编译原理】在算符优先分析中,栈顶元素可以是终结符,非终结符和#号三种,这三种分别对应什么操作
当栈顶元素为终结符时,比较栈顶元素和当前输入符之间的优先关系,若是“小于”或“等于”则移进,若是“大于”则归约
当栈顶元素为非终结符时,则考虑栈顶指针减一的元素(应是终结符)同当前输入符之间的优先关系,若是“小于”或“等于”则移进,若是“大于”则归约
当栈顶元素为#号时,则与当前输入符进行比较,若当前输入符也是#,则分析成功(即输入串是合法的句子),否则出错