导航:首页 > 源码编译 > 编译lr法课程设计报告

编译lr法课程设计报告

发布时间:2023-03-03 10:21:00

编译原理用C语言实现基于LR(1)或SLR(1)语法分析程序代码,最好还有报告,急。。。

这个是精简的语法分析程序,如果符合的话,hi我
给你实验报告

#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>
char a[50] ,b[50];
char ch;
int n1,i1=0,n=5;
int E();int T();int E1();int T1();int F();
void main() /*递归分析*/
{
int f,j=0;
printf("请输入字符串(长度<50,以#号结束)\n");
do{
scanf("%c",&ch);
a[j]=ch;
j++;
}while(ch!='#');
n1=j;
ch=b[0]=a[0];
f=E();
if (f==0) return;
if (ch=='#') printf("accept\n");
else printf("error\n");
}

int E() // E→TE'
{ int f,t;
f=T();
if (f==0) return(0);
t=E1();
if (t==0) return(0);
else return(1);
}

int T() // T→FT'
{ int f,t;
f=F();
if (f==0) return(0);
t=T1();
if (t==0) return(0);
else return(1);
}

int E1()/*E’*/ // E'→+TE'
{ int f;
if(ch=='+') {
b[i1]=ch;
ch=a[++i1];
f=T();
if (f==0) return(0);
E1();
return(1);
}
return(1);
}

int T1()/*T’*/ // T'→*FT'
{
int f,t;
if(ch=='*') {
b[i1]=ch;
ch=a[++i1];
f=F();
if (f==0) return(0);
t=T1();
if (t==0) return(0);
else return(1);}
a[i1]=ch;
return(1);
}

int F() // F→(E)
{ int f;
if(ch=='(') {
b[i1]=ch;
ch=a[++i1];
f=E();
if (f==0) return(0);
if(ch==')') {
b[i1]=ch;
ch=a[++i1];
}
else {
printf("error\n");
return(0);
}
}
else if(ch=='i') {
b[i1]=ch;
ch=a[++i1];
}
else {printf("error\n");return(0);}
return(1);
}

⑵ 编译原理LR(1)中的R和1分别是什么意思

LR分析法是一种自下而上进行规范归约的语法分析法,L指从左到右扫描输入符号串,R是指构造最右推导的逆过程.LR(1)中的1是每次搜索符号需要向前参考一步,即参考下一个符号确定当前构造.

⑶ 编译原理中,LR(0)文法的项目集规范族的I0,I1,I2,I3…………是怎么求的~

先举个例子:

}

将其命名为I1。

其他可类似推出。

⑷ 编译原理中LR(1) 那个向前搜索符怎么求的 跪求高手解答 复制粘贴或者答非所问的别来

1、首先第一步就是项目[S’-> . S,],自动生成搜索符],自动生成搜索符],自动生成搜索符,从项目[A->α.Bβ,?]生成项目[B->…,first(β)]。


⑸ c(a/g/w)ll选择哪个

热门频道

首页

博客

研修院

VIP

APP

问答

下载

社区

推荐频道

活动

招聘

专题

打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved

打开APP

c语言lr文法还是ll文法,编译原理复习题 转载
2021-05-20 05:05:24

Tim Pan

码龄4年

关注
一、单项选择题 概述部分

1.构造编译程序应掌握 。D A. 源程序 B. 目标语言 C. 编译方法 D. 以上三项都是 2.编译程序绝大多数时间花在 上。D

A. 出错处理

B. 词法分析

C. 目标代码生成

D. 表格管理 3.编译程序是对 。D

A. 汇编程序的翻译

B. 高级语言程序的解释执行

C. 机器语言的执行

D. 高级语言的翻译 4. 将编译程序分成若干“遍”,是为了 。B

A. 提高程序的执行效率

B. 使程序的结构更为清晰 C 利用有限的机器内存并提高机器的执行效率 D. 利用有限的机器内存但降低了机器的执行效率

词法分析部分

1.DFA M(见图1-1)接受的字集为 。D A. 以0开头的二进制数组成的集合

B. 以0结尾的二进制数组成的集合

.png

C. 含奇数个0的二进制数组成的集合

D. 含偶数个0的二进制数组成的集合

2.词法分析器的输出结果是 。C

A. 单词的种别编码

B. 单词在符号表中的位置

C. 单词的种别编码和自身值

D. 单词自身值 3.正规式M1和M2等价是指 。C A. M1和M2的状态数相等 B. M1和M2的有向边条数相等 C. M1和M2所识别的语言集相等 D. M1和M2状态数和有向边条数相等 4.词法分析器的加工对象是 。 C A .中间代码 B .单词 C .源程序 D .元程序 5.同正规式(a|b )*等价的正规式为 。D A .(a|b)+ B .a*|b* C .(ab)* D .(a*|b*)+ 6. 两个DFA 等价是指: 。 D A. 这两个DFA 的状态数相同

B. 这两个DFA 的状态数和有向弧条数都相等

C. 这两个DFA 的有向弧条数相等

D. 这两个DFA 接受的语言相同

7. 下列符号串不可以由符号集S ={a,b}上的正闭包运算产生的是:(A ) A. ε B. a C. aa D. ab 8.称有限自动机A1和A2等价是指________。D A .A1和A2都是定义在一个字母表上的有限自动机 B .A1和A2状态数和有向边数相等

图1-1

1

相关资源:编译原理赋值语句的翻译LL文法LR文法简单优先法-专业指导文档类...
文章知识点与官方知识档案匹配
C技能树首页概览
110422 人正在系统学习中
打开CSDN APP,看更多技术内容

编译原理五 LR(1)分析法【C语言实现】_wangkay88的博客
1、使用 LR 的优点: (1)LR 分析器能够构造来识别所有能用上下文无关文法写的程序设计语言的结构。 (2)LR 分析方法是已知的最一般的无回溯移进-归约方法,它能够和其他移进-归约方法 一样有效地实现。 (3)LR 方法能分析的文法...
lr参数与C语言函数参数的区别_weixin_30254435的博客
LR参数是lr自己封装的一个钟对象, LR参数的表达方式:{ParamName}
编译原理习题——第2章 文法和语言试卷
第2章 文法和语言试卷 1. 文法:G:S→xSx|y所识别的语言是(D)。 A. xyx B. (xyx)* C.x*yx* D. xnyxn(n≥0) 2. 给定文法A→bA|ca,为该文法句子的是(C)。 A. bba B. cab C. bca D. cba 3. 文法G产生的(D)的全体是该文法描述的语言。 A. 句型 B. 终结符集 C. 非终结符集 D. 句子 4. 若文法G...
继续访问
编译原理习题(含答案)——2程序设计语言及其文法——哈工大陈鄞配套版本
程序设计语言及其文法1 文法:G:S→xSx | y所识别的语言是( )。 2 给定文法A→bA|ca,为该文法句子的是( )。A. bbaB. cabC. bcaD. Cba 3 设有文法G[S]:S->S1|S0|Sa|Sc|a|b|c,下列符号串中是该文法的句子有( )。A. ab0B. a0b01C. a0b0aD. bc10 4 文法G产生的( )的全体是该文法描述的语言。A. ...
继续访问
c语言lr分析器的设计与实现_[源码和文档分享]基于LR分析法的简单分析法...
通过设计、编制、调试一个简单计算器程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 二、课程设计内容及步骤 本次课程设计需要使用 LR 分析法完成简单计算器的设计,其中算术表达式的文法如下: ...
C语言实现编译原理的LR分析法,编译原理LR(0)分析器(C语言).pdf
1LR 分析法 LR LR “ 分析法是一种自底向上进行的规范规约的语法分析方法, 指 自左向 右扫描和自底向上进行归约”。LR 分析法的一个主要缺点是,若用手工构造分析 LR 器则工作量相当大,因此必须求助于自动产生 分析器的产生器。
编译原理 第三章 词法分析
1、词法分析器的输出结果是单词的种类编码和自身值 2、词法分析器不能发现括号不匹配 3、不存在语言能被确定的有穷自动机识别但不能用正则表达式表示 4、两个有穷自动机等价实质它们的所识别的语言相等 5、词法分析器用于识别单词 6、正则表达式R1和R2等价是指R1和R2代表同一正则集 7、已知文法G[S]:S->A1, A->A1|S0|0,与G等价的正规式是0(1|10)^1 8、与(a...
继续访问
【编译原理-练习题-1】概述部分与词法分析部分选择,填空,判断,多选题
一、单项选择题 1.构造编译程序应掌握 (D ) 。 a. 源程序 b. 目标语言 c. 编译方法 d. 以上三项都是 2.编译程序绝大多数时间花在 (D) 上。 a. 出错处理 b. 词法分析 c. 目标代码生成 d. 表格管理 3.DFA M(见图1-1)接受的字集为(D ) 。 a. 以0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合 ...
继续访问
LR中用C语言比较两个字符串变量_花露丝雨的博客
6.lr_save_string( "We can see the string:nancy","string1" ); 7.lr_save_string( "We can see the string:nancy","string2" ); 8.lr_output_message("the string1 is %s.",lr_eval_string("{string1}")); ...
c语言字符串变量的比较,LR中用C语言比较两个字符串变量.doc_梦符佳月...
LR中用C语言比较两个字符串变量 Zee的早期文档.一:以下脚本,定义两个一样的字符数组,对比后,打印出result的值: vuser_init() { int result; ? ???char string1[] = "We can see the string:zee"; ...
最新发布 编译原理刷题(个人向)
编译原理刷题
继续访问
【编译原理】课后习题
1.构造编译程序应掌握:源程序、目标语言、编译方法 2.编译程序绝大多数时间花在表格管理上 3. 4.一个程序是正确的,包括两层含义:一是书写正确;二是含义正确 (合乎语法规则、合乎语义规则) 5.描述高级语言语法常用的方法有语法树、BNF范式、扩充的BNF范式等 6.程序语言一般可以分为低级语言和高级语言两大类,其中低级语言通常又称为面向机器的语言。面向机器语言指的是特定计算机系统所...
继续访问
C语言实现编译原理的LR分析法,实验三编译原理综合实验报告——(LR...
注意:本例是利用LR(0)分析来实现的语法分析,同学在写实验报告的时候,在结果分析这一块可以选用课堂讲过的LR(0)文法来说明验证结果即可。 同时附上你所选用的文法对应的LR(0)分析表。
编译原理总结,看这一篇就够了!_LeeDuo.的博客_编译原理
1.词法分析:对源程序的字符串进行扫描和分解,识别出每个单词符号。 2.语法分析:根据语言的语法规则,把单词符号分解成各类语法单位。 3.语义分析与中间代码生成:对各种语法范畴进行静态语义检查,若正确则进行中间代码翻译。 4.代码优化:...
C语言LR(1)文法
用C语言编写,对一个LR(1)文法分析,文法为:实现两个数的加减乘除四则运算。并能得出计算结果。
热门推荐 编译原理习题(含答案)——3词法分析——哈工大陈鄞配套版本
词法分析1 词法分析器的输出结果是( )。A. 单词自身值B. 单词在符号表中的位置C. 单词的种别编码 D. 单词的种别编码和自身值2 词法分析器不能( )。A. 识别出数值常量B. 过滤源程序中的注释C. 扫描源程序并识别记号D. 发现括号不匹配 3 ( )这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。A. 存在B. 不存在C. 无法判定是否存在D. 以上答案都不对 4 ...
继续访问
C--编译器:C--编译器,实现LL(1)\ LR(0)\ SLR \ LR(1)并生成语义分析和MIPS
实现了自制的C--语言的一遍扫描编译,包括词法分析,LR(1)语法分析,属性文法+中间代码生成,MIPS编译生成编译脚本由python实现,兼容python2.7与3.7,图形界面由WPF实现,使用了IronPython进行脚本执行 支持以下特性: 一种基本类型int 赋值表达式,循环/选择/判断/跳出语句 函数定义与函数调用 未实现: 浮点数,字符,字符串 斑点 错误检查
编译原理之LR(0)分析算法的c实现
LR(0)分析器的构造算法如下: 对一个文法构造了它的LR(0)分析表后就可以在LR分析器的总控程序(驱动程序)控制下对输入串进行分析,即根据输入串的当前符号和分析栈的栈顶状态查找分析表应采取的动作,对状态栈和符号栈进行相应的操作即移进、归约、接受或报错。具体说明如下: (1)若ACTION[S,a]=Sj,a为终结符,则把a移入符号栈,j移入状态栈; (2)若ACTION[S,a]=rj,
继续访问
编译原理第一章自测题
第一章 高级语言与编译程序概述 一、单项选择题 1.将编译程序分成若干个“遍”是为了____ 。 A. 提高程序的执行效率 B. 使程序的结构更加清晰 C. 利用有限的机器内存并提高机器的执行效率 D. 利用有限的机器内存但降低了机器的执行效率 2.构造编译程序应掌握 ____ 。 A. 源程序 B. 目标语言 C. 编译方法 D. 以上三项都是 3.编译程序绝大多数时间花在 ____ 上。 A. 出错处理 B. 词法分析 C. 目标代码生成 D. 管理表格
C语言语法分析程序(编译原理:LR)
北邮大三编译原理课程序 注释很详细
用c++实现LR语法分析器
通过LR分析表及三个栈形成对输入表达式的判断! 。
c语言lr文法还是ll文法,编译原理第五章语法分析课后题
(先补到这里,后面如果有需要的话,垃圾博主还会回来继续更的。。。)5.1 递归子程序法属于()语法分析方法A. 自顶向下B. 自底向上C. 自左向右D. 自右向左5.2 采用确定的自顶向下分析时,必须()A. 消除左递归B. 消除右递归C. 避免回溯D. 提取左公因子5.3 自上而下语法分析的主要分析动作是A. 推导B. 移进C. 归约D. 匹配5.4 一个字符属于FOLLOW(S),这个字符的含...
继续访问
编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)
编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析) (1)根据提示输入文法的个数 (2)输入文法 (3)扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成 (3)分析句子 (4)生成分析过程 C语言实现LR(0)分析源代码
继续访问

编译程序基本原理
编译程序和解释程序 人们利用高级语言与计算机进行交互, 但计算机仍然只能理解和执行由 0, 1序列构成的机器语言, 因此高级程序设计语言需要翻译, 担负这一任务的程序称为"语言处理程序", 由于应用的不同, 语言之间的翻译也是多种多样的. 大致可分为 汇编程序、解释程序和编译程序. 用某种高级语言或汇编语言编写的程序称为 源程序, 源程序不能直接在计算机上执行. 如果源程序是用汇编语言写的, ...
继续访问
LR脚本用户自定义C语言函数
LR脚本实战:用户自定义C语言函数 Loadrunner可以使用标准C语言的函数,因此我们可以在脚本中编写自己的函数用于调用,把脚本结构化,更好的进行重用。 先看一个例子: Action() { int i,j; j = 1; for (i=0;i<10;i++) { lr_message("i+j=%d",sum(i,j)); j++; } ...
继续访问
编译原理,第一章绪论
编译过程和编译程序结构 五个阶段: 词法分析 语法分析 语义分析和中间代码生成 优化 目标代码生成 编译程序的开发 自编译:用某种高级语言编写自己的编译程序称为自编译, 交叉编译:用A机器上的编译程序来产生可在B机器上运行的目标代码 自展:首先确定一个非常简单的核心语言L0,然后用机器语言或者汇编语言写出它的编译程序T0,再把语言L0扩充到L1,用L0编写L1的编译程序T1,这样不断扩展下去...
继续访问

c语言是 ll文法和lr文法哪个好
c语言lr文法还是ll文法
写评论

评论

收藏

点赞



分享

⑹ 循环语句的语法分析及语义分析程序设计

目 录
1 课程任务书····································(2)
1问题描述·······································(3)
2文法及属性文法的描述···························(3)
2.1 while-do循环语句的文法·····················(3)
2.2while-do循环语句的结构翻译·················(3)
3语法分析及中间代码形式的描述···················(4)
3.1 语法分析方法·······························(4)
3.2 中间代码形式描述···························(4)
4简要的分析与概要设计···························(5)
4.1词法分析··································(5)
4.2递归下降翻译器的设计·······················(5)
4.3语法制导翻译·······························(5)
5 详细的算法描述································(6)
5.1 文法·······································(6)
5.2 查错·······································(6)
6 测试方法和测试结果···························(9)
6.1测试方法··································(9)
6.2测试结果··································(10)
7 设计的特点、不足、收获与体会·················(10)
7.1 设计的特点································(10)
7.2 不足、收获与体会··························(11)
8 参考文献·····································(11)

课程设计任务书
题 目: 循环语句的语法分析及语义分析程序设计(递归下降法)
1.目的
通过设计、编制、调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

2.设计内容及要求
WHILE〈布尔表达式〉DO〈赋值语句〉
其中
(1)学号29至32的同学按顺序分别选择递归下降法、LL(1)、算符优先分析法(或简单优先法)、LR法完成以上任务,中间代码选用四元式。
(2)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。
(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

3.课程设计报告书的内容应包括:
1.设计题目、班级、学号、姓名、完成日期;
2.给出语法分析方法及中间代码形式的描述、文法和属性文法的设计;或者词法分析方法
3.及符号表和TOKEN代码的设计。
4.简要的分析与概要设计;
5.详细的算法描述;
6.源程序清单;
7.给出软件的测试方法和测试结果;
8.设计的评价、收获与体会。

4.时间安排:
第17周,周1-周4上午,周五全天

指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日

1问题描述
设计一个WHILE〈布尔表达式〉DO〈赋值语句〉循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。
2文法及属性文法的描述。
2.1 while-do循环语句的文法
产生式为S-> while E do A,为便于语法制导翻译将其改写如下:
文法G(s)如下:
S-->WEDG (意思是while E do G)
G-->c=R
R-->dTe|d
T-->+|-|*|/
E-->aFb
F--> >|==|<

2.2 whlie-do循环语句的结构翻译:

3.语法分析方法及中间代码形式的描述
3.1语法分析方法
递归下降法的实现思想是为文法的每个非终结符号设计一个相对应的递归子程序,识别程序由一组这样的子程序组成。
它的优点是简单直观,易于构造,很多编译系统所实现
缺点是对文法要求很高,由于递归调用多,影响分析器的效率
其文法可以表示为:
E→T│E+T
T→F│T*F
F→i│(E)
可以用语法图来表示语言的文法,如图:

E

T

F

3.2中间代码形式描述
中间代码采用四元式输出,一个四元式是一个带有四个域的记录结构,这四个域分别称为op﹑arg1﹑arg2及result。域op包含一个代表运算符的内部码。语句while a<b do a=a+b的四元式输出形式如下:
100 ( <, a , b , 102 )
101 ( j , _ , _ , 105 )
102 ( + , a , b , n )
103 ( = , n , _ , a )
104 ( j , _ , _ , 100)
105
4.简要的分析与概要设计
4.1词法分析
词法分析程序的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号的中间程序。词法分析检查的错误主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。
4.2递归下降翻译器的设计
1.:对每个非终结符A构造一个函数过程,对A的每个继承属性设置一个形式参数,函数的返回值为A的综合属性,A对应的函数过程中,为出现在A的产生式中的每一个文法符号的每一个属性都设置一个局部变量。非终结符A对应的函数过程中,根据当前的输入符号决定使用哪个产生式候选。
2:每个产生式对应的程序代码中,按照从左到右的次序,对于单词符号,非3:终结符和语义动作分别做以下工作。
(1)对于带有综合属性x的终结符X,把x的值存入为X,x设置的变量中。然后产生一个匹配X的调用,并继续读入一个输入符号。
(2)对于每个非终结符号B,产生一个右边带有函数调用的赋值语句c=B(b1,b2,…,bk)
(3)对于语义动作,把动作的代码抄进分析器中,用代表属性的变量来代替对应属性的每一次引用。
4.3语法制导翻译
在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。
5详细的算法描述
5.1 文法
/*
文法G(s)
s-->WEDG
G-->c=R
R-->dTe|d
T -> +|-|*|/|%E-->aFb
F--> >|==|<
*/
5.2 查错
按照递归下降法求Wa<bDa=a+b,程序的执行顺序应该是S()W()EF()D()G()R()T()
S()
void S()
{
printf("%d\tS-->WEDG\n",total);total++;
W();
E();
}

W()
void W()
{
if(ch!='W')
{
printf("有非法字符%c请按回车返回!!",ch);
getchar();
getchar();
exit(1);
}
}

E()
void E()
{
ch=a[++i1];
if(ch!='a')
{
printf("有非法字符%c %c请按回车返回!!",ch);
getchar();
getchar();
exit(1);
}
printf("%d\tE-->aFb\n",total);total++;
F();
}

F()
void F()
{
int i;
ch=a[++i1];
i=i1+1;
if(a[i]!='b')
{
printf("有非法字符%c请按回车返回!!",a[i]);
getchar();
getchar();
exit(1);
}
switch(ch)
{
case '>':
printf("%d\tF-->>\n",total);total++;
break;
case '==':
printf("%d\tF-->==\n",total);total++;
break;
default:
printf("%d\tF--><\n",total);total++;
break;
}
D();
G();
}

D()
void D()
{
++i1;
ch=a[++i1];
if(ch!='D')
{
printf("有非法字符%c请按回车返回!!",ch);
getchar();
getchar();
exit(1);}
ch=a[++i1];
}

G()
void G()
{
int i=i1+1;
if(ch!='c'&&a[i]!='=')
{
printf("有非法字符%c %c请按回车返回!!",ch,a[i]);
getchar();
getchar();
exit(1);
}
printf("%d\tG-->c=R\n",total);total++;
R();
}

R()
void R()
{
int i;
i=i1+1;
i1=i1+2;
ch=a[i1];
if(a[i]!='='&&ch!='d')
{
printf("有非法字符%c %c请按回车返回!!",a[i],ch);
getchar();
getchar();
exit(1);
}
else
{
if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/'))
{
printf("%d\tR-->dTe\n",total);total++;
T();
}
else
{
printf("%d\tR-->d\n",total);total++;
W();
E();
}
}
}

T()
void T()
{
ch=a[++i1];
switch(ch)
{
case '+':
printf("%d\tT-->+\n",total);total++;
break;
case '-':
printf("%d\tT-->-\n",total);total++;
break;
case '*':
printf("%d\tT-->*\n",total);total++;
break;
default:
printf("%d\tT-->/\n",total);total++;
break;
}
ch='#';
}

6测试方法和测试结果
6.1测试方法
在C++环境下,设计几个有代表的用例,进行测试,例如:输入语句Wa<bDa=a+b#(其中d表示do ,w表示while)。若得出的不是预期的结果,那么程序就出现问题。如果有问题的话就进行单步调试找到程序中出现的逻辑问题。

6.2测试结果
测试结果如下:

7设计的特点、不足、收获与体会
7.1设计的特点
本次设计是采用递归下降的方法对输入的while--do 循环语句进行语法,语义分析,并输出四元式。因此程序中充分体现了递归下降的思想。

7.2设计的不足,收获与体会
本次的设计的不足主要是我没将程序一般化,实现不了用户自动输入代码进行词法分析的四元式输出,此程序只能实现对Wa<bDa=a+b#的分析与四元式输出,由于我所设计的栈中只能一个字符一个字符的存放,因此只能用D W分别表示do while;而且我对语法制导翻译这一块很不熟悉,因此我始终不能用程序实现语法制导翻译输出四元式,于是根据自己的理解,直接把四元式写了出来。
本次课程设计巩固了我所学习的关于递归下降法这一方面的知识,并且使我对WHILE—DO循环语句也有了更深刻的理解,提高了我的动手能力。

8 课程设计参考资料
1张幸儿 《编译原理》(第二版)清华大学出版社
2何炎祥 《编译原理》华中理工大学出版社
3陈火旺 《程序设计语言编译原理》(第3版)国防工业出版社

本科生课程设计成绩评定表
班级:软件0701姓名:周璐萍学号:0120710680129
序号 评分项目 满分 实得分
1 学习态度认真、遵守纪律 10
2 设计分析合理性 10
3 设计方案正确性、可行性、创造性 20
4 设计结果正确性 40
5 设计报告的规范性 10
6 设计验收 10
总得分/等级
评语:

注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
源程序
#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>

char a[50],g[50][50];
char ch;
int n1,i1=0,i2=0;
int total=0;

void S();
void D();
void G();
void W();
void E();
void R();
void T();
void F();

void main()
{
int j=0;

printf("文法G(s)为:\n");
printf("s-->DGWE\n");
printf("G-->c=R\n");
printf("R-->dTe|d\n");
printf("T-->+|-|*|/\n");
printf("E-->aFb\n");
printf("F--> >|==|<\n");

printf("请输入while-do语句(D代表do,W代表while),并以#结束:\n");
do{
scanf("%c",&ch);
a[j]=ch;
j++;
}while(ch!='#');
n1=j;
ch=a[0];

S();
printf("\n");

if (ch=='#')
{ printf("输出四元式为:\n");
printf("100 (<,a,b,102)\n");
printf("101 (j,_,_,105)\n");
printf("102 (+,a,b,n)\n");
printf("103 (=,n,_,a)\n");
printf("104 (j,_,_,100)\n");
printf("105 \n");

}

else {

printf("error\n");

printf("press any key to continue..\n");

getchar();getchar();

return;

}

printf("\n");

printf("press any key to continue..\n");

getchar();
getchar();
}

/*出错情况分析*/

void S()
{
printf("%d\tS-->WEDG\n",total);total++;
W();
E();
}

void W()
{

if(ch!='W')
{
printf("有非法字符%c请按回车返回!!",ch);
getchar();
getchar();
exit(1);
}
}

void E()
{
ch=a[++i1];
if(ch!='a')
{
printf("有非法字符%c %c请按回车返回!!",ch);
getchar();
getchar();
exit(1);
}
printf("%d\tE-->aFb\n",total);total++;
F();
}

void F()
{
int i;
ch=a[++i1];
i=i1+1;
if(a[i]!='b')
{
printf("有非法字符%c请按回车返回!!",a[i]);
getchar();
getchar();
exit(1);
}
switch(ch)
{
case '>':
printf("%d\tF-->>\n",total);total++;

break;
case '==':
printf("%d\tF-->==\n",total);total++;

break;
default:
printf("%d\tF--><\n",total);total++;

break;

}
D();
G();
}

void D()
{ ++i1;
ch=a[++i1];
if(ch!='D')
{ printf("有非法字符%c请按回车返回!!",ch);
getchar();
getchar();
exit(1);}
ch=a[++i1];

}

void G()
{ int i=i1+1;

if(ch!='c'&&a[i]!='=')
{ printf("有非法字符%c %c请按回车返回!!",ch,a[i]);
getchar();
getchar();
exit(1);}
printf("%d\tG-->c=R\n",total);total++;
R();
}

void R()
{
int i;
i=i1+1;
i1=i1+2;
ch=a[i1];
if(a[i]!='='&&ch!='d')
{
printf("有非法字符%c %c请按回车返回!!",a[i],ch);
getchar();
getchar();
exit(1);
}
else
{
if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/'))
{
printf("%d\tR-->dTe\n",total);total++;

T();

}
else
{
printf("%d\tR-->d\n",total);total++;

W();
E();
}
}

}

void T()
{
ch=a[++i1];
switch(ch)
{
case '+':
printf("%d\tT-->+\n",total);total++;

break;
case '-':
printf("%d\tT-->-\n",total);total++;

break;
case '*':
printf("%d\tT-->*\n",total);total++;

break;

default:
printf("%d\tT-->/\n",total);total++;

break;
}
ch='#';

}

指导教师签名:
2010 年月日

⑺ 编译器笔记13-语法分析-LR分析法概述

可以用LR分析法分析的文法可以称为LR分析法。LR文法( Knuth ,1963)是最大的、可以构造出相应移入- 归约语法分析器的文法类。

LR(k)分析,需要向前查看k个输入符号的LR分析,k=0 和 k=1 这两种情况具有实践意义,当省略(k)时,表示k=1。而在LR(k)这样的名称中,k代表的是分析时所需前瞻符号(lookahead symbol)的数量,也就是除了当前处理到的输入符号之外,还得再向右引用几个符号之意;省略 (k)时即视为LR(1),而非LR(0)。

作为对比这里列出LL(1)文法的含义:

问:自底向上分析的关键问题是什么?
答:如何正确地识别句柄,句柄是逐步形成的,用“状态”表示句柄识别的进展程度。例如在 自底向上分析概述 中所提及到句柄识别错误的例子,通过状态跟下一个输入符号就可以判断出应该做出哪一个动作,而状态相当于一种记忆功能记录当前句柄识别到什么程度。

与移入分析器不同的是LR分析器多了一个与符号栈平行的状态栈。

之后的分析过程与上图类似,直至到如下状态,分析成功。可见分析时进行什么动作是由栈状态栈栈顶的状态和下一个输入符号决定。

输入:串w和LR语法分析表,该表描述了文法G的ACTION函数和GOTO函数。
输出:如果w在L(G)中,则输出w的自底向上语法分析过程中的归约步骤;否则给出一个错误指示。
方法:初始时,语法分析器栈中的内容为初始状态s0 ,输入缓冲区中的内容为w$。然后,语法分析器执行下面的程序:

先了解LR(0)项目和增广文法这两个概念

右部某位置标有圆点的产生式称为相应文法的一个LR(0)项目(简称为项目):A → α1·α2

文法开始符号S表示的是语言中的最大成分。如下图当b出现时可以将它移入到分析栈中。b移进栈后我们期待归约出B。当归约出B时我们还期待再归约一个B。

如果G是一个以S为开始符号的文法,则G的增广文法G'就是在G中加上新开始符号S'和产生式S'→S而得到的文法

引入这个新的开始产生式的目的是使得文法开始符号仅出现在一个产生式的左边,从而使得分析器只有一个接受状态。

项目可以分为以下几类:

上图中S'对应的第一个项目称为初始项目,而S'对应的最后一个项目称之为接收项目在此状态下文法的开始符号已经被归约出来,因此可以接收了故称为接收项目。红色方框中的项目则被称为归约项目。

项目集闭包(Closure of Item Sets)

可以把等价的项目组成一个项目集(I),称为项目集闭包,每个项目集闭包对应着自动机的一个状态。

先了解CLOSURE和GOTO这两个函数

项目集I的闭包的数学定义:

返回项目集I对应于文法符号X的后继项目集闭包

规范LR(0)项集族(Canonical LR(0) Collection)

说明: 该自动机的初始状态就是文法的初始项目的项目集闭包,其终止状态集合只有一个状态就是文法的接收项目的项目集闭包。

如果LR(0)分析表中没有语法分析动作冲突,那么给定的文法就称为LR(0)。不是所有CFG都能用LR(0)方法进行分析,也就是说,CFG不总是LR(0)文法。

为了解决移进/归约冲突和归约/归约冲突需要使用到 SLR分析法 和 LR(1)分析法 。

问: 为什么没有移进/移进冲突?
答: 首先只有在移进状态和待约状态下的项目才会有使用到移进操作。在0状态时所有项目都是移进状态根据LL文法显然不会产生移进/移进操作,因为每个产生式左部的SELECT集是没有交集的。而在其他具有待约状态项目的状态中,所有集合都是等价的。假若在某状态下输入终结符y时发生移进/移进冲突,即存在两个这样的项目A0→α0·yβ0,A1→α1·yβ1,但显然这两个项目是不等价的显然与同一状态下所有项目等价相矛盾,因此这种移进/移进冲突是不存在的。假若在某状态下输入非终结符X时发生移进/移进冲突,即存在两个这样的项目A0→α0·Xβ0,A1→α1·Xβ1,而A0与A1在同一状态下是等价的则两项目要么是A0→α0·Xβ0与X→.Xβ1(原项目A1变为X,α1变为ε)要么是A1→α1·Xβ1与X→.Xβ0(原项目A0变为X,α0变为ε)。显然X→Xβ0|Xβ1(左递归)是不符合LL文法的因此这种情况也是不可能出现。

综上移进/移进冲突在LR分析下是不存在的。

阅读全文

与编译lr法课程设计报告相关的资料

热点内容
算法创新就业方向 浏览:417
算法最优解作者 浏览:863
通达信红绿宝塔线指标源码 浏览:656
app是什么东西合法吗 浏览:227
怎么锁app视频教程 浏览:839
迅捷pdf注册码生成器 浏览:744
androidsdkosx 浏览:300
压缩面膜纸荧光 浏览:839
app怎么分身三个 浏览:744
电影bt下载源码 浏览:421
iwatch屏幕加密芯片 浏览:570
公安主题网站源码 浏览:986
天津市服务器供应商云服务器 浏览:115
数控车床子程序编程 浏览:110
floydwarshall算法 浏览:717
丢失微信app怎么找 浏览:252
php能写前端吗 浏览:9
服务器如何更改raid模式 浏览:92
方舟服务器怎么导出来 浏览:610
手机显示服务器异常什么鬼 浏览:381