编译原理

编译原理 七

我是研究僧i 提交于 2019-12-02 03:56:43
1.正规式转换到正规文法 对任意正规式R选择一个非终结符Z生成规则Z→R 1.对形如A→ab的规则,转换成A→aB,B→b 2.将形如A→a|b的规则,转换成A→a,A→b(A→a|b) 3.将形如A→a*b的规则,转换成A→aA,A→b 将形如A→ba*的规则,转换成A→Aa,A→b 不断利用上述规则进行转换,直到每条规则最多含有一个终结符为止. 一、1(0|1)*101 S->1(0|1)*101 S->A1 A->B0 B->C1 C->C0|C1|1 二、(a|b)*(aa|bb)(a|b)* S->(a|b)*(aa|bb)(a|b)* S->AaaA|AbbA A->aA|bA|ε 三、((0|1)*|(11))* S->((0|1)*|(11))* S->ε|0S|1S|1AS A->1 四、(0|11 0) S->(0|110) S->0|A0 A->B1 B->1 2. 自动机M=({q0,q1,q2,q3},{0,1},f,q0,{q3}) 其中f: (q0,0)=q1 (q1,0)=q2 (q2,0)=q3 (q0,1)=q0 (q1,1)=q0 (q2,1)=q0 (q3,0)=q3 (q3,1)=q3 画现状态转换矩阵和状态转换图,识别的是什么语言。               状态转换矩阵           状态转换图 3.由正规式R 构造

编译原理——自底向上分析

♀尐吖头ヾ 提交于 2019-12-01 17:40:59
自底向上分析 1.移进-规约分析(自底向上的一般过程,存在缺陷) 准备工作: 一个符号栈、一个待分析的符号串#xxxxx# 要点: 初始状态 仅将最左侧#移进符号栈 之后 每次根据符号栈的情况在两个操作之间二选一: 移进 规约 如果当前符号栈中没有形成当前句型新的句柄,将符号串的一个字符移进(自左向右依次) 如果当前符号栈中形成了当前句型新的句柄,则规约——弹出句柄并将得到的非终结符入栈 重复这个过程 结束 最终最终符号栈只剩下#和识别符号,则分析成功,否则失败 注意 句柄一定位于栈顶。若不在栈顶,该句柄应该在之前就已经被规约才对 栈内符号串+未处理输入符号串=当前句型 上述方法并没有给出识别句柄的有效算法,取而代之的 识别句柄的依据是看 栈顶符号串是否形成规则的右部 , 但这种方法不一定正确。因为不能认为:对句型 xuy 而言,若有U∷ = u,即 U=>u 就断定u是简单短语, u 就是句柄,而是要同时满足 Z=*> xUy。 【导致这种情况的本质原因是,只给一个静态的句型和文法,严格意义上是无法确定短语的,见https://www.cnblogs.com/Ivan-Luo/p/11694447.html。短语的定义是,或者说,有一个规则A::=b,某个句型中恰好有b,但不能保证用A去规约这个b之后得到的仍是该文法的句型。】 算符优先分析 适用于上下文无关文法 来源:

编译原理之了解基本的正规文法与正规式

℡╲_俬逩灬. 提交于 2019-12-01 16:58:41
1.分别写出描述以下语言的正规文法和正规式: (1)L1={ab n a|n≥0}。   正规文法为:   A -> aB   B -> Ca   C ->bC | ε 正规式为:   ab*a (2)L2={a m b n |n≥1,m ≥1}   正规文法为:   A -> aA | aB | a | ε   B -> Bb | b | ε 正规式为:   aa*bb* (3)L3={(ab) n |n≥1}   正规文法为:   A -> aB | ε   B -> Ab 正规式为:   ab(ab)* 2.将以下正规文法转换到正规式 (1) Z→0A A→0A|0B B→1A|ε   正规式为:   A = 0A+0B    = 0A+01A+0    = (0+01)A0    = (0|01)*0   即   Z = 0 (0|01)*0 (2) Z→U0|V1 U→Z1|1 V→Z0|0   正规式为:   Z = U0 + V1    = Z10+10+Z01+01    = Z(10+01)+10+01    = (10|01)*1001 (3) S→aA A→bA|aB|b B→aA   正规式为:   A = bA + aaA + b    = A(b+aa)+b    = (b|aa)*b   即S = a(b|aa)*b (4) I→l|Il|Id

编译原理——关于文法、推导、规约、句柄、语法树、二义性的理解

那年仲夏 提交于 2019-12-01 16:58:29
短语:直观理解,该句型中的连续一部分,这部分能被某个非终结符推出。则这部分是该句型相当于那个终结符的短语。 简单短语: 句柄:一个句型只能有一个句柄。(前提默认非二义性文法) 推导和规约过程理解 推导过程 : 对每一个句型,该句型一定有一个推导过程(可能不唯一),推导过程一定对应一颗语法树(推导过程可能不唯一,当然语法树也可能不唯一) 推导不唯一,规约不唯一,规范推导 规范推导 :最右推导,每次拆最右边的非终结符 规约过程 : 规约直观理解就是,“剪子树(但留子树的根)【对应到表达式就是用短语替代那个非终结符】,每剪一次对应一次规约,直到剪到只剩树根” 规范规约 :最左规约,每次对最左简单短语进行的规约 一个文法的句型,必能通过一次一次的规范推导获得。同时也能通过一次一次的规范规约规约至开始符号, 每次规约都对应一个句柄 。所以用规约简单短语的方法检查文法是可行的。 规范推导和规范规约互为逆过程 :规范推导倒着看就是规范规约 规范句型 :由规范推导或规范规约得到的句型 二义性文法——不可判定的 文法所定义的某个句子存在两棵不同的语法树。 文法中存在某个句子,它有两个不同的规范(最右)推导。 文法中存在某个句子,它有两个不同的规范(最左)规约,即在规约中某些规范句型的句柄不唯一。 注意: 如果存在两种推导,那么不能说明一定是二义性文法,因为两种推导可能对应同一个语法树 二义性的例子

编译原理:编译代码

岁酱吖の 提交于 2019-12-01 16:13:54
一.简介 对C/C++编译时,首先对源代码进行预处理,预处理器(preprocessor)来执行 编译一般进行两遍,第一遍对预处理过的代码进行语法分析,生成树形结构的语法树。第一遍到第二遍之间也可能使用全局优化器(global optimizer) 第二遍由代码生成器(code generator)遍历语法分析树,把树的每个节点转化为汇编语言或机器代码,生成目标模块(.obj) 连接器(linker)把一组目标模板连接成为一个可执行程序 来源: https://www.cnblogs.com/k5bg/p/11692329.html

编译原理第五次作业

廉价感情. 提交于 2019-12-01 05:01:22
词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0      首先先说下我的思路,先建立map<string, string> m;存储符号及其种别码 map<string, string> m; void init(){ m["begin"]="1"; m["if"]="2"; m["then"]="3"; m["while"]="4"; m["do"]="5"; m["end"]="6"; m["+"]="13"; m["-"]

编译原理:词法分析程序的设计与实现

谁说我不能喝 提交于 2019-12-01 05:01:16
词法分析程序( Lexical Analyzer )要求: 从左至右扫描构成源程序的字符流 识别出有词法意义的单词( Lexemes ) 返回单词记录(单词类别,单词本身) 滤掉空格 跳过注释 发现词法错误 程序结构: 输入 :字符流(什么输入方式,什么数据结构保存) 处理 : 遍历(什么遍历方式) 词法规则 输出 :单词流(什么输出形式) 二元组 单词类别: 标识符(10) 无符号数(11) 保留字(一词一码) 运算符(一词一码) 界符(一词一码) 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0 程序词法分析代码: #include <iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; //关键字 string key[6]={"main","int","if","else","while","do"}; //关键字的种别码 int keyNum[6]={1,2,3,4,5,6}; /

编译原理5 词法分析程序的设计与实现

独自空忆成欢 提交于 2019-12-01 04:54:27
编译原理5 词法分析程序的设计与实现 此程序要逐个检查运行情况,并能当场补全代码。 词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0  源代码如下: #include<stdio.h> #include<string.h> #include<iostream.h> char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0; char *rwtab[6]={"begin"

编译原理 作业五

人盡茶涼 提交于 2019-12-01 04:19:55
词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0 word类: public class word { //二元组类结构 private int typenum; //种别码 private String word;// 扫描得到的词 public int getTypenum() { return typenum; } public void setTypenum(int typenum) { this.typenum =

编译原理 五

这一生的挚爱 提交于 2019-12-01 02:37:20
此程序要逐个检查运行情况,并能当场补全代码。 词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0  源代码如下 #include<stdio.h> #include"stdlib.h" #include <string.h> char* keyword[6]={"begin","if","then","while","do","end"}; int a[99]; char b[20]; int num=0; bool