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

作者&投稿:潮翁 (若有异议请与网页底部的电邮联系)
DOWHILE循环语句的翻译程序设计 (递归下降法、输出三地址表示)!要C++的源代码,~

为何不用个goto就行了!!!再说了,你的题目描述不怎得清楚!!

编译原理程序太服杂了.就100分鬼大爷给你写

目 录
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 年 月 日


《在马克思墓前的讲话》说课稿
2.第三段复杂单句的语法分析。 二、说教法: 本课教学重点是体会议论文语言准确严密的特点,在教学中应以揣摩语言为主。另外,本课教学难点较多,主要有以下几个:1.马克思两大发现的内容及意义的理解,2.一些重点语句的揣摩理解。因此,在教学中应充分调动学生的主观能动性,让每一个学生都行动起来,积极收集资料,...

高中语文诗词鉴赏分析某一联的作用答题思路,怎么分析?
若问字词则抓句中动词、形容词和副词;若问句子则抓诗歌情感句、议论句、警策句。2、阐发理由,注意层次。先解释字词的字面意义(概念意义),再回归原诗分析所用修辞及其效果(语法意义),最后联系上下文整体感知炼字效果(语境意义)。分析既联系整体又着眼于细节,点面结合。3、答案表述格式:判断??—解释(本意)—分析(...

如何理解ll(1)文法分析?
理解 LL(1) 文法分析需要从几个关键点入手:语法的定义、文法分析方法、LL(1) 文法的特性以及其与词法分析的关系。语法是描述语句构建规则的体系,它不关心句子的具体含义,只验证句式结构是否符合规则。例如,“美丽的蓝色的傲慢自由地砍杀卑微”这句话虽然可能没有实际含义,但它在语法上是成立的。语...

如何通俗易懂地解释编译原理中语法分析的过程
现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用...

语用分析是什么?
语用分析是对自然真实语言经过语法分析,语义分析后,更高级的语言学分析。它把语句中表述的对象和对对象的描述,与现实的真实事物及其属性相关联。找到真实具体的细节,把这些细节与语句系统的对应起来,形成动态的表意结构。语用分析对人工智能技术有重大理论意义和实用价值。语用分析的基本原则:把话语放在...

帮我用英语语法来分析一下这一句
首先,句子的主干部分:Janitors should be given reminders.是一个被动语态的用法,直译为值班人员应该得到提醒,更好的翻译为应该提醒值班人员。主语:Janitors 谓语:should be given 宾语:reminders 然后,是对宾语reminders的具体说明,这是一个关于什么的提醒,即about后面的部分:recycling and ...

如何理解LL(1)文法分析?
深入解析LL(1)文法分析:构造语言结构的逻辑框架 语言的规则,如同建筑的蓝图,其核心是定义一套结构化的语句构建方式。根据诺姆·乔姆斯基的理论,语法关注的是句子的形式结构,而非其实际含义。例如,"美丽的蓝色的傲慢自由地砍杀卑微",尽管可能没有明确的含义,但它符合中文语法规则。理解语法分析,首要...

英文句子翻译和语法解析?
这个句子的翻译是:我一直以来的印象是,总统们经常去坎普大卫营(Camp David),穿着短袖运动衫完成一些在距离白宫四十英里的地方穿正装似乎无法完成的事情。语法解析:- "It has always been my impression":这是固定短语,意思是“一直以来我的印象是”。- "that presidents often go to Camp David"...

自然语言处理(NLP)和 自然语言理解(NLU)新手须知
2. 词法分析:包括对英文的词头、词根、词尾的拆分,以及名词、动词、形容词、副词、介词的定性,以及多种词意的选择。例如,"DIAMOND"可以指菱形、棒球场、钻石,需要根据应用场景选择正确的含义。3. 语法分析:通过语法树或其他算法,分析主语、谓语、宾语、定语、状语、补语等句子元素。4. 语义分析:...

编译原理 什么是语义分析
词法分析程序实现这个任务。词法分析程序可以使用lex等工具自动生成。语法分析(Syntax analysis或Parsing)和语法分析程序(Parser) 语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上...

瓯海区15385388342: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示) -
笃新散结: 递归下降法 输出三地址码 /////////////#define MAX 100#include#include#include char str[MAX]; char ch; int turn; char strToken[MAX]; int kind; int n=0;//存放strtoken[]元素的个数 struct Word//结构体 存放单词 { int sort; char word[MAX];//存放strtoken[...

瓯海区15385388342: vb 循环语句,求解析... -
笃新散结: Private Sub Command2_Click()→事件函数 Dim x As Single→循环中用来承接inputbox值的变量 nsum = 0: psum = 0→声明整数和负数的和的变量 For i = 1 To 10→循环开始,共10次 msg = "请输入第" & Str(i) & "个数"→输入数字的提示消息 x = InputBox(msg)→弹出输入框 Next i→ 循环结束标志 Print "整数之和"; nsum, "负数之和"; psum→输出结果 End Sub→过程结束 另:你这个程序不完整哦 少着一些东西 这点达不到它应有的效果,而且我觉得那个“负数之和”应该是“分数之和”..

瓯海区15385388342: 谁能给我详细介绍下Pascal语言中循环语法?
笃新散结: For语句 1.递增型FOR循环. FOR 循环控制变量:=循环初值 TO 循环终值 DO 循环的语句(或语段)例: FOR I:=5 TO 10 DO WRITELN (I); 输出的结果为: 5 6 7 8 9 10 即循环一共执行了6次 如果要重复多个语句,一定要用BEGIN-END形式:...

瓯海区15385388342: 解释一下vb编程中的各种循环语句
笃新散结: Do...Loop 为真循环 为假推出循环 Do... unilt Loop 为真退出循环 为假循环 For...Next 相当等于计数(计循环次数)

瓯海区15385388342: C语言循环结构程序设计1!!!
笃新散结: #include "stdio.h" void main() { char m,n; int i; m=97;n=122; clrscr(); for(i=1;i<=13;m=97+i,n=122-i,i++) printf(" %c %c",m,n); }

瓯海区15385388342: VB循环语句程序设计
笃新散结: Private Sub Form_Activate() Dim i As Integer For i = 1 To 8 If i = 1 Then Print "※" Else Print "※" & Space(2 * (i - 2)) & "※" End If Next Print String(i, "※") End Sub

瓯海区15385388342: VB中循环语句详解,最好有些例程 -
笃新散结: 循环语句有 1. DO LOOP while '当...的时候做 2. DO LOOP until '做...直到 循环语句最怕死循环 也就是永远不可能跳出来的一个条件被设置 例如: k = 1 Do k = k + 1 Loop Until k

瓯海区15385388342: 解释一下vb编程中的各种循环语句 -
笃新散结: 1.While...Wend 语句 只要指定的条件为 True,则会重复执行一系列的语句.语法 While condition [statements]..Wend2.Do...Loop2.1 第一种用法 用 Do 循环重复执行一语句块,且重复次数不定.Do...Loop 语句有几种演变形式,但每种都计算数值条件以决定是否继续执行.如同 If...Then condition 必须是一个数值或者值为 True(非零)或 False(零)的表达式.在下面的 Do...Loop 循环中,只要 condition 为 True 就执行 statements.Do While condition statements..Loop

瓯海区15385388342: C语言中计数循环语句几种形式的处理方法 -
笃新散结: 在C语言中,经常使用循环语句,特别是计数器循环语句,即for语句.本文结合实例,对for语句的几种特殊形式进行分析,并给出具体的处理方法.

瓯海区15385388342: C语言循环结构程序设计题 -
笃新散结: 这个算法程序没有错,只是需要输入两个正整数.#include<stdio.h> void main() { int m,n; printf("请输入两个正整数:"); scanf("%d%d",&m,&n); while(m!=n) { if(m>n)m=m-n; else n=n-m; printf("m=%d n=%d\n",m,n);//这一句就输出了m,n在运算构成中的变化 } printf("最大公约数为:%3d\n",m); }3、调试要根据你输入的数字不同,在环境中自己去做.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网