编译实验2
实验2Scala编程初级实践
实验2Scala编程初级实践实验 2 Scala 编程初级实践⼀、实验⽬的1.掌握 Scala 语⾔的基本语法、数据结构和控制结构;2.掌握⾯向对象编程的基础知识,能够编写⾃定义类和特质;3.掌握函数式编程的基础知识,能够熟练定义匿名函数。
熟悉 Scala 的容器类库的基本层次结构,熟练使⽤常⽤的容器类进⾏数据;4.熟练掌握 Scala 的 REPL 运⾏模式和编译运⾏⽅法。
⼆、实验平台已经配置完成的 Scala 开发环境。
Scala 版本为 2.11.8.三、实验内容和要求1. 计算级数请⽤脚本的⽅式编程计算并输出下列级数的前 n 项之和 Sn,直到 Sn 刚好⼤于或等于 q 为⽌,其中 q 为⼤于 0 的整数,其值通过键盘输⼊。
例如,若 q 的值为 50.0 ,则输出应为: Sn=50.416695 。
请将源⽂件保存为 exercise2-1.scala,在REPL模式下测试运⾏,测试样例:q=1时,Sn=2;q=30时,Sn=30.891459; q=50 时,Sn=50.416695。
import io.StdIn._object lab2{def main(args:Array[String]){var Sn:Float = 0var n:Float = 1println("Input a number for q:")var q = readInt()while(Sn < q){Sn += (n+1)/nn += 1}println(s"Sn = $Sn")}}2. 模拟图形绘制对于⼀个图形绘制程序,⽤下⾯的层次对各种实体进⾏抽象。
定义⼀个 Drawable 的特质,其包括⼀个 draw ⽅法,默认实现为输出对象的字符串表⽰。
定义⼀个 Point 类表⽰点,其混⼊了 Drawable 特质,并包含⼀个 shift ⽅法,⽤于移动点。
所有图形实体的抽象类为Shape,其构造函数包括⼀个 Point 类型,表⽰图形的具体位置(具体意义对不同的具体图形不⼀样)。
实验二C ++简单程序设计参考答案
实验二C++简单程序设计练习一、实验目的和要求1.进一步熟悉VC++6.0的集成开发环境。
2.了解C++在非面向对象方面的扩充。
二、实验内容1输入以下程序,进行编译,如果有错误,请修改程序,直到没有错误为止,并分析运行结果。
#include <iostream>using namespace std;void fun(int m,int &n){n=m*5;}int main(){int x,y;fun(3,x);fun(4,y);cout<<"x+y=<<x+y<<endl;return 0;}2, 编写一个程序,用来分别求2个整数,3个整数,2个双精度数和3个双精度数的最大值。
要求使用函数重载来完成。
#include<iostream>using namespace std;int max(int x,int y);int max(int x,int y,int z);double max(double x,double y);double max(double x,double y,double z);int main(){int a,b,c;double m,n,t;cin>>a>>b>>c;cout<<max(a,b)<<endl;cin>>m>>n>>t;cout<<max(m,n,t)<<endl;return 0;}int max(int x,int y){return x>y?x:y;}double max(double x,double y){return x>y?x:y;}int max(int x,int y,int z){int m;m=x>y?x:y;return m>z?m:z;}double max(double x,double y,double z){double m;m=x>y?x:y;return m>z?m:z;}3编写一个程序,任意从键盘输入两个字符,能将他们按照由小到大的顺序输出。
C语言实验二报告
北京电子科技学院(BESTI)实验报告课程:程序设计基础班级:姓名:学号:成绩:指导教师:张晓昆实验日期:实验密级:预习程度:实验时间:15:30~18:30仪器组次:必修/选修:必修实验序号: 2实验名称:函数编程练习实验目的与要求:主函数通常只处理输入和输出;掌握定义函数的方法;掌握函数实参与形参的对应关系,以及“值传递”的方式;掌握全局变量、局部变量、动态变量、静态变量的概念和使用方法,、了解函数的嵌套调用方法和递归调用方法。
观察堆栈窗口call stack,注意函数调用过程堆栈的动态变化。
有兴趣的同学可以将几个函数分别放到不同的.C文件中,分别编译,再利用Project建立工程文件,然后连接执行,观察结果。
实验内容素数(Prime Number),又称为质数,它是不能被1和它本身以外的其他整数整除的正整数。
按照这个定义,负数、0和1都不是素数,而17之所以是素数,是因为除了1和17以外,它不能被2~16之间的任何整数整除。
任务1:试商法是最简单的判断素数的方法。
用i=2~m-1之间的整数去试商,若存在某个m能被1与m本身以外的整数i整除(即余数为0),则m不是素数,若上述范围内的所有整数都不能整除m,则m是素数。
采用试商法,分别用goto语句、break语句和采用设置标志变量并加强循环测试等三种方法编写素数判断函数IsPrime(),从键盘任意输入一个整数m,判断m是否为素数,如果m是素数,则按"%d is a prime number\n"格式打印该数是素数,否则按"%d is not a prime number\n"格式打印该数不是素数。
然后分析哪一种方法可读性更好。
1、goto语句#include <stdio.h>#include <stdlib.h>int IsPrime(int n); //判断是否是素数的函数原型int main(){int m;printf("Please enter a integer:");scanf("%d", &m); //用户输入欲判断的数if( IsPrime(m) == 1){ //调用判断是否是素数的函数并输出结果printf("%d is a prime number!\n", m);}else{printf("%d is not a prime number!\n", m);}return 0; //返回0} //主函数结束int IsPrime(int n) //判断是否是素数的函数{int i = 2;int j = 0;if(n < 2){ //若n小于2,返回0值return 0;}if(n == 2){return 1;}loop:if(n % i == 0){ //利用goto语句i++;j++;goto loop;}if(j >= 1){ //若j大于2,则说明能被2~n-1之间的数整除,返回0;否则返回1 return 0;}else{return 1;}} //子函数结束2、break语句#include <stdio.h>#include <stdlib.h>int IsPrime(int n); //判断是否是素数的函数原型int main(){int m;printf("Please enter a integer:");scanf("%d", &m); //用户输入欲判断的数if( IsPrime(m) == 1){ //调用判断是否是素数的函数并输出结果printf("%d is a prime number\n", m);}else{printf("%d is not a prime number\n,", m);}return 0; //返回0} //主函数结束int IsPrime(int n) //判断是否是素数的函数{int i;int j = 0;if( n < 2 ){ //若n小于2,返回0值return 0;}for(i = 2; i <= n - 1; i++){if( n % i == 0){ //利用试商法判断是否能被2~n-1之间的数整除j++;}if(j > 1){ //若j大于2,则说明能被2~n-1之间的数整除,返回0;否则返回1 return 0;break;}}if( j == 0)return 1;} //子函数结束3、采用设置标志变量并加强循环测试#include <stdio.h>#include <stdlib.h>int IsPrime(int n); //判断是否是素数的函数原型int main(){int m;printf("Please enter a integer:");scanf("%d", &m); //用户输入欲判断的数if( IsPrime(m) == 1){ //调用判断是否是素数的函数并输出结果printf("%d is a prime number\n", m);}else{printf("%d is not a prime number\n,", m);}return 0; //返回0} //主函数结束int IsPrime(int n) //判断是否是素数的函数{int i;int j = 0;if( n < 2 ){ //若n小于2,返回0值return 0;}for(i = 2; i <= n - 1; i++){if( n % i == 0){ //利用试商法判断是否能被2~n-1之间的数整除j++;}}if(j >= 1){ //若j大于2,则说明能被2~n-1之间的数整除,返回0;否则返回1 return 0;}else{return 1;}} //子函数结束任务2:用数学的方法可以证明,不能被2取整)之间的数整除的数,一定不能被1和它本身之外的其他任何整数整除。
实验二 GCC 及GDB的使用
实验二GCC 及GDB的使用一、实验目的和要求a)掌握VI编译环境。
b)掌握GCC编译命令。
c)掌握多个文件共同编译方法。
d)掌握GDB调试命令。
二、实验内容和原理(可参照课件第五章)a)在VI编辑器里编写简单的“hello,world,I am 13050141XX XXX”,利用GCC编译为可执行文件,执行,观察运行结果。
b)在VI编辑器里编写多个文件(至少两个,其中一个为主程序,一个为需要调用的子程序),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。
学习书写MAKEFILE文件,编译,执行,观察结果。
c)编写循环结构的程序,利用GCC 编译(加参数-g)为可执行文件,利用GDB调试,学习GDB调试命令。
三、实验环境a)硬件:PC机b)软件:LINUX操作系统、虚拟机四、实验步骤vi hello.c i:C语言编程Esc :wq gcc hello.c gdb file a.out run a实验三交叉编译环境配置一、实验目的和要求熟悉 Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。
使用Linux 的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。
二、实验内容a)配置网络,包括配置IP 地址、NFS 服务、防火墙。
b)安装交叉编译器c)配置超级终端,下载文件到目标机上。
三、实验设备及工具(包括软件调试工具)硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。
软件:REDHAT LINUX 9.0+超级终端+ARM-LINUX 开发环境四、实验步骤(所有的内容截图)1、虚拟机设置为桥接模式。
2、配置IP地址,设置为192.168.0.xxx参照实验指导书图1.4.1-1.4.3. 自己截图,说明3、关闭防火墙,参照实验指导书图1.4.4自己截图,说明4、打开桌面超级终端(HyperTerminal),配置COM1,115200波特率,8N1,实验箱插上电源线,网线与主机相连,串口线与主机串口1相连,开机,看bootloader程序VIVI是否自动加载,回车后进入命令提示符。
《c语言程序设计》实验报告(实验-2)
《c语⾔程序设计》实验报告(实验-2)《C语⾔程序设计》实验报告2013~2014学年第⼆学期班级姓名学号指导教师实验⼀实验项⽬名称:C程序的运⾏环境和运⾏C程序的⽅法所使⽤的⼯具软件及环境:Visual C++ 6.0⼀、实验⽬的:1.了解在Visual C++ 6.0环境下如何编辑、编译、连接和运⾏⼀个C程序;2.通过运⾏简单的C程序,初步了解C源程序的特点。
⼆、预习内容:教材《C语⾔程序设计教程》第1章。
三、实验内容:1. 在Visual C++ 6.0环境下输⼊并运⾏下⾯的程序:#includeint main( ){printf("This is a C program.\n");return 0;}2. 在Visual C++ 6.0环境下输⼊下⾯的程序(有语法错误),编译、连接、调试该程序,直⾄程序⽆语法错误,然后运⾏程序,并观察分析运⾏结果。
#includeint main( ){int a,b,suma=3;b=4;sun=a+b;print(“%d+%d=%d\n”,a,b,sum);return 0;}四、实验结果:1. 运⾏结果(或截图):This is a C program.Press any key to continue2. (1) 改正后的源程序:#includeint main( ){int a,b,sum;a=3;b=4;sum=a+b;printf("%d+%d=%d\n",a,b,sum);return 0;}(2) 运⾏结果(或截图):3+4=7五、思考题:1. ⼀个C程序上机的步骤有哪些?答:上级输⼊与编辑源程序—对原程序进⾏编译–与库函数链接–运⾏可执⾏的⽬标程序。
2. 组成C程序的基本单位是函数,⼀个函数包括哪⼏个部分?答:⼀个函数包括两部分:分别为函数头或函数⾸部和函数体。
成绩指导教师签名实验⼆实验项⽬名称:数据类型、运算符和表达式所使⽤的⼯具软件及环境:Visual C++ 6.0⼀、实验⽬的:1.掌握整型、实型与字符型这三种基本类型的概念;2.掌握常量及变量的使⽤⽅法;3. 掌握基本算术运算符及其表达式的使⽤⽅法;4. 掌握++、--运算符、赋值运算符及其表达式的使⽤⽅法。
c语言实验报告 (2)
C语言实验报告说明1,所有程序均用VC6。
0编译运行,文件名命名为姓名+日期,因为实验存在补做,所以并不是按照日期先后排列的。
2,为了使截图清晰,手动将运行窗口由“黑底白字"改为了“白底黑字”.实验2 数据类型、运算符和表达式一、实验目的:(1)掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法。
(2)学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。
(3)掌握C语言的输入和输出函数的使用(4)进一步熟悉C程序的编辑、编译、连接和运行的过程.三、程序调试与问题解决:(1)输人并运行下面的程序#include<stdio.h>void main(){char c1,c2;c1='a’;c2=’b';printf(”%c %c\n”,c1,c2);}错误!运行此程序.错误!在上面printf语句的下面再增加一个printf语句。
printf(”%d%d\n",c1,c2);再运行,并分析结果。
输出结果如图,编译成功,无错误.错误!将第3行改为int c1,c2;再运行,并分析结果。
错误!再将第4、5行改为c1=a;c2=b;再运行,并分析结果。
a,b没有定义,编译报错。
错误!再将第4、5行改为c1=‘’a‘’;c2=‘’b‘’;再运行,并分析结果。
○6再将第4、5行改为c1=300;c2=400;再运行,并分析结果.以字符型输出时,输出的将是300,400对应的字符.(2)输人并运行教材第3章习题3. 6给出的程序#include〈stdio.h〉main (){char c1=’a’,c2=’b’,c3=’c',c4=’\101’,c5=’\116';printf("a%c b%c\tc%c\tabc\n",c1,c2,c3);printf(”\t\b%c %c\n”,c4,c5);}#include<stdio.h>void main(){int a,b;unsigned c,d;long e,f;a=100;b=-100;e=50000;f=32767;c=a;d=b;printf("%d,%d\n",a,b);printf(”%u,%u\n",a,b);printf("%u,%u\n",c,d);c=a=e; d=b=f;printf(”%d,%d\n",a,b);printf("%u,%u\n”,c,d);}请对照程序和运行结果分析:①将一个负整数斌给一个无符号的变t,会得到什么结果.画出它们在内存中的表示形式。
编译原理实验二LL(1)语法分析实验报告
专题3_LL(1)语法分析设计原理与实现李若森 13281132 计科1301一、理论传授语法分析的设计方法和实现原理;LL(1) 分析表的构造;LL(1)分析过程;LL(1)分析器的构造。
二、目标任务实验项目实现LL(1)分析中控制程序(表驱动程序);完成以下描述算术表达式的 LL(1)文法的LL(1)分析程序。
G[E]:E→TE’E’→ATE’|εT→FT’T’→MFT’|εF→(E)|iA→+|-M→*|/设计说明终结符号i为用户定义的简单变量,即标识符的定义。
加减乘除即运算符。
设计要求(1)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的输出结果,输出为输入串是否为该文法定义的算术表达式的判断结果;(2)LL(1)分析程序应能发现输入串出错;(3)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。
任务分析重点解决LL(1)表的构造和LL(1)分析器的实现。
三、实现过程实现LL(1)分析器a)将#号放在输入串S的尾部b)S中字符顺序入栈c)反复执行c),任何时候按栈顶Xm和输入ai依据分析表,执行下述三个动作之一。
构造LL(1)分析表构造LL(1)分析表需要得到文法G[E]的FIRST集和FOLLOW集。
构造FIRST(α)构造FOLLOW(A)构造LL(1)分析表算法根据上述算法可得G[E]的LL(1)分析表,如表3-1所示:表3-1 LL(1)分析表主要数据结构pair<int, string>:用pair<int, string>来存储单个二元组。
该对照表由专题1定义。
map<string, int>:存储离散化后的终结符和非终结符。
vector<string>[][]:存储LL(1)分析表函数定义init:void init();功能:初始化LL(1)分析表,关键字及识别码对照表,离散化(非)终结符传入参数:(无)传出参数:(无)返回值:(无)Parse:bool Parse( const vector<PIS> &vec, int &ncol );功能:进行该行的语法分析传入参数:vec:该行二元式序列传出参数:emsg:出错信息epos:出错标识符首字符所在位置返回值:是否成功解析。
C语言实验报告,实验一和实验二
实验一C语言的运行环境、运行过程和表达式的使用一、目的与要求1、了解Dos、Windows环境下C语言的运行环境,了解所用的计算机系统的基本操作方法,学会独立使用该系统。
2、了解在该系统上如何编辑、编译、连接和运行一个C程序。
3、通过运行简单的C程序,初步了解C源程序的特点。
4、掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。
5、学会使用C的有关算术运算符,以及包含这些运算符的表达式二、上机实验及运行结果1、例题实验及运行结果例一:#include"stdio.h"void main(){printf("Hello,World!\n");printf("Wolcome to the C language world!\n");printf("Everyone has been waiting for.\n");}运行结果为Hello, world !Welcome to the C language world!Everyone has been waiting for.在第一次输入源程序时,由于粗心在printf(“Hello,world!”)后面忘记输入“;”,在编译中检查出来,修改后编译成功。
例二:#include"stdio.h"void main(){int a,b,sum;a=123;b=456;sum=a+b;printf("sum is %d\n",sum);}运行结果为:sum is 579。
一次编译就成功了。
例三:#include"stdio.h"void main(){int a,b,c;int max(int,int);scanf("%d,%d",&a,,&b);c=max(a,b);printf("max=%d",c);}int max(int x,int y){int z;if (x>y) z=x;else z=y;return(z);}键盘输入“8,9”,屏幕上输出“max=9”例四:#include"stdio.h"void main(){char c1 , c2;c1=97;c2=98;printf("%c %c", c1, c2);}在此基础上1)加一个printf语句,并运行之。
编译原理实验(二)
实验编号:语法分析(2)一、实验目的及要求编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
1待分析的简单语言的语法用扩充的BNF表示如下:⑴ <程序>::=begin<语句串>end⑵ <语句串>::=<语句>{;<语句>}⑶ <语句>::=<赋值语句>⑷ <赋值语句>::=ID :=<表达式>⑸ <表达式>::=<项>{+<项>卜<项>}⑹<项>::=<因子>{*<因子> | /<因子>⑺ <因子>::=ID | NUM | (<表达式>)2实验要求说明输入单词串,以“ #”结束,如果是文法正确的句子,则输出成功信息,打印“succesS', 否则输出"error”。
例如:输入begin a:=9; x:=2*3; b:=a+x end # 输出success!输入x:=a+b*c end # 输出error二、实验环境Microsoft Visual Studio VC6.0三、算法描述(1)主程序示意图如图2-1所示。
”-1 •: 结束图2-1语法分析主程序示意图(2) 递归下降分析程序示意图如图 2-2所示。
(3)语句串分析过程示意图如图 2-3所示。
调用expression 函数否是 否 是否是否调用语句串分析程序是 否出错处理否syn=O&&kk=O ?是打印分析成功出错处理否否否是2调用term 函数调用statement 函数调用statement 函数调用scaner调用scaner调用scaner 调用scaner图2-2 (4)statement 语 图2-3语句串分析示意图是否:=?是否+ , -?递归下降分析程序示意图J 分析程序流程如图 2-4、2-5、2-6、2-7所示。
1是调用scaner是否end?调用s caner是否标识符?#i nclude"stdio.h"#in elude "stri ng.h" char prog[100],toke n[ 8],ch; char *rwtab [6]={"begi n","if',"the n" ,"while","do","e nd"};int syn ,p,m, n,sum;调用term函数出错处理图2-4 statement语句分析函数示意图出错处理图2-5 expression表达式分析函数示意图四、源程序清单-3 •-4 •int kk;factor();〃 因子 expressio n();〃 表达式judgue();〃 判断语句、下一条语句 term();〃 项stateme nt();〃 赋值语句 lrparser();〃 判断、输出函数 scan er();〃 读下一个字符 yucu();void mai n(){ p=0;printf(- 请输入源程序:\n"); do {scan f("%c",&ch); prog[p++]=ch; }while(ch!='#'); p=0; sca ner(); lrparser(); prin tf(" 语法分析结束! \n");lrparser() {printf(" *********************语法分析程序 ************* **\n");if (syn==1) //begi n{sca ner();yucu();if (syn==6) //end{sca ner();if (sy n==O && kk==O)prin tf("success \n");}else{if(kk!=1)prin tf("error,lose 'end' !\n"); kk=1;}}else{prin tf("error,lose 'beg in' ! \n");kk=1;return 0;}yucu()• 5 •{stateme nt();while(sy n==26) //;{sca ner();stateme nt();}return 0;}stateme nt(){if (sy n==10){sca ner();if (syn==18){sca ner();expressi on();}else{prin tf("error!"); -6 •kk=1;}}else{prin tf("error!");kk=1;}return 0;}expressi on(){term();while(s yn==13 || syn==14){sca ner();term();}return 0;}term(){factor();while(s yn==15 || syn==16)sea ner();factor();-7 •}return 0;}factor(){if(syn==10 || syn==11)scan er(); // 为标识符或整常数时,读下一个单词符号else if(syn==27){sca ner();expressi on();if(sy n==28)sca ner();else{printf("')' 错误\n"); kk=1;}}else{printf(" 表达式错误\n"); kk=1;}return 0;sea ner(){ sum=O;• 8 •for(m=0;m<8;m++)toke n[m]=NULL;〃数组清空m=0;ch=prog[p++];while(ch==' ')ch=prog[p++];if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))){ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))){toke n[ m++]=ch;ch=prog[p++];}p--;sy n=10;toke n[m++]='\0';for(n=0;n<6;n++)if(strcmp(toke n,rwtab[ n])==0)〃判断是否为关键字{syn=n+1;break;}}else if((ch>='0')&&(ch<='9')){ while((ch>='0')&&(ch<=9)){ sum=sum*10+ch-'0';ch=prog[p++];}p--;syn=11;-9 •}else switch(ch){ case 'v':m=O; ch=prog[p++]; if(ch=='>'){ syn=21;}else if(ch=='='){ sy n=22;}else{ sy n=20;p--;}break;case '>':m=0; ch=prog[p++]; if(ch=='='){ syn=24;}else{ syn=23;p--;}break;case ':':m=0;ch=prog[p++]; if(ch=='='){ syn=18;-10 •}else{ syn=17;p--;}break;case '+': syn=13; break;case '-': syn=14; break;case '*': syn=15;break;case '/': syn=16;break;case '(': syn=27;break;case ')': syn=28;break;case '=': syn=25;break;case ';': syn=26;break;case '#': syn=0;break; default: syn=-1;break;}return 0;-11 •五、运行结果及分析输入begin a:=9;x:=2*3;b:二a+x end # 输出successerror输入x:=a+b*c end # 输出-12 •。
Java程序设计-试验2(学生版)
Java程序设计-试验2(学生版)
华北电力大学
实验报告
实验名称Java程序面向对象设计(一)课程名称Java程序设计
专业班级:学生姓名:
学号:成绩:指导教师:张学斌实验日期:
自己的speed的值增加80
【代码10】//car2调用speedUp方法将自己的speed的值增加80
System.out.println("car1目前的速度:"+car1.getSpeed());
System.out.println("car2目前的速度:"+car2.getSpeed());
car1.speedDown(10);
car2.speedDown(20);
System.out.println("car1目前的速度:"+car1.getSpeed());
System.out.println("car2目前的速度:"+car2.getSpeed());
}
}
1.3 实验指导
●创建一个对象时,成员变量被分配空间,这些内
存空间称作该对象的实体或变量,而对象中存放着引用,以确保这些变量被该对象操作使用。
●空对象不能使用,即不能让一个空对象去调用方
法产生行为。
假如程序中使用了空对象,在运行时会产生异常:NullPointerException,对象时。
c语言第二部分 实验内容
三、实验内容
1.阅读并输入如下程序,查看运行结果,并分析其功能。 # include "stdio.h" main ( ) { int a, b, c, s ; a = 5; b = 4; c = 6; s = (a+b+c)/ 3; printf (" a = %d, b = %d, c = %d \n, s = %d ", a, b, c, s) ; }
C语言程序设计实验·设计·习题
2.下面是一正方形面积的计算程序,通过输入不同的边长,求 出不同的面积。输入此程序并试运行。 注意:程序中含有输入语句,运行时将会停留在另一窗口中等待 输入数据。 # include"stdio.h" main ( ) { int r, s ; scanf (" %d ",&r) ; s= r*r; printf (" s = %d ", s) ; } 3.在Turbo C中调试并修改以下C程序中的错误。
C语言程序设计实验·设计·习题
三、实验内容
1.改正书中所给的相关程序的错误。 2.程序填空。 (1)按程序中注释的要求填输出语句。 (2)要求运行时必须按如下格式输入数据,请填空。 3.程序编译成功,只是说明没有语法错误,但并不一定能得出 正确结果,因为有可能存在编程逻辑错误。这时,我们需要跟踪变量、 调试程序,找出问题所在。调试的一般方法有: (1)单步跟踪:选择Run菜单下的Step命令,也可以直接按快捷键 F7(可跟踪进函数、过程)或快捷键F8,这样可以每条语句单独运行。 (2)运行至光标处:先将光标移至目标语句,然后选择Run菜单下 的Go to Cursor命令,或按快捷键F4,这样可以连续运行从开始到光 标处的一段程序。
编译原理的实验报告
一、实验目的1. 理解编译原理的基本概念和原理。
2. 掌握编译器的各个阶段及其实现方法。
3. 能够运用编译原理的知识解决实际问题。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 实验内容:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成三、实验内容1. 词法分析(1)实验目的:实现一个简单的词法分析器,将源代码中的字符序列转换为词法符号序列。
(2)实验步骤:1)定义词法符号类型,包括标识符、关键字、运算符、常量等。
2)设计词法分析器算法,对源代码进行遍历,将字符序列转换为词法符号序列。
3)实现词法分析器程序,输出词法符号序列。
(3)实验结果:输入源代码:int a = 10;输出词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}2. 语法分析(1)实验目的:实现一个简单的语法分析器,将词法符号序列转换为抽象语法树(AST)。
(2)实验步骤:1)定义语法规则,包括产生式、非终结符、终结符等。
2)设计语法分析算法,根据语法规则对词法符号序列进行解析,生成AST。
3)实现语法分析器程序,输出AST。
(3)实验结果:输入词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}输出AST:```AST:- ExpressionStatement- Expression- BinaryExpression- Identifier: a- Operator: =- Constant: 10```3. 语义分析(1)实验目的:实现语义分析器,对AST进行语义检查,确保程序的正确性。
(2)实验步骤:1)定义语义规则,包括类型检查、作用域检查等。
编译原理实验二:LL(1)语法分析器
编译原理实验⼆:LL(1)语法分析器⼀、实验要求 1. 提取左公因⼦或消除左递归(实现了消除左递归) 2. 递归求First集和Follow集 其它的只要按照课本上的步骤顺序写下来就好(但是代码量超多...),下⾯我贴出实验的⼀些关键代码和算法思想。
⼆、基于预测分析表法的语法分析 2.1 代码结构 2.1.1 Grammar类 功能:主要⽤来处理输⼊的⽂法,包括将⽂法中的终结符和⾮终结符分别存储,检测直接左递归和左公因⼦,消除直接左递归,获得所有⾮终结符的First集,Follow集以及产⽣式的Select集。
#ifndef GRAMMAR_H#define GRAMMAR_H#include <string>#include <cstring>#include <iostream>#include <vector>#include <set>#include <iomanip>#include <algorithm>using namespace std;const int maxn = 110;//产⽣式结构体struct EXP{char left; //左部string right; //右部};class Grammar{public:Grammar(); //构造函数bool isNotTer(char x); //判断是否是终结符int getTer(char x); //获取终结符下标int getNonTer(char x); //获取⾮终结符下标void getFirst(char x); //获取某个⾮终结符的First集void getFollow(char x); //获取某个⾮终结符的Follow集void getSelect(char x); //获取产⽣式的Select集void input(); //输⼊⽂法void scanExp(); //扫描输⼊的产⽣式,检测是否有左递归和左公因⼦void remove(); //消除左递归void solve(); //处理⽂法,获得所有First集,Follow集以及Select集void display(); //打印First集,Follow集,Select集void debug(); //⽤于debug的函数~Grammar(); //析构函数protected:int cnt; //产⽣式数⽬EXP exp[maxn]; //产⽣式集合set<char> First[maxn]; //First集set<char> Follow[maxn]; //Follow集set<char> Select[maxn]; //select集vector<char> ter_copy; //去掉$的终结符vector<char> ter; //终结符vector<char> not_ter; //⾮终结符};#endif 2.1.2 AnalyzTable类 功能:得到预测分析表,判断输⼊的⽂法是否是LL(1)⽂法,⽤预测分析表法判断输⼊的符号串是否符合刚才输⼊的⽂法,并打印出分析过程。
实验二、Vi文本编辑器和GCC编译器的使用
实验二、Vi文本编辑器和GCC编译器的使用实验二、Vi文本编辑器和GCC编译器的使用一、实验目的:1、掌握Linux系统终端方式使用的编辑器vi;2、学习vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。
3、掌握GCC编译器的使用。
二、实验内容:1、用Vi文本编辑器对你的计算机进行网络配置。
网络配置文件有:文件1:/etc/sysconfig/network;文件2:/etc/sysconfig/network-scripts/ifcfg-eth0;文件3:/etc/resolv.conf;要求:在图形界面下配置,看相应配置文件有没有被修改;修改配置文件看图形界面是否被修改。
2、将显示器配置文件(自己查),复制到//home目录下(一定要复制,对副本进行操作,否则出现异常后果自负),并重命名为i.打开i文件,设置行标,将第89行至第96行的内容复制到第116行,并将第62行至第86行的Option替换为type.并将整篇文章中的Section 替换成choose.将修改后的文件另存为j.并将j复制到/usr目录下,并重命名为k.3、在vi中编写一个abc.c程序,对程序进行编译、连接、运行。
具体如下: [student@enjoy abc]$ vi abc.cmain(){int i,sum=0;for(i=0;i<=100;i++){sum=sum+i;}printf("\n1+2+3+...+99+100=%d\n",sum);}[student@enjoy abc]$ gcc -o abc abc.c[student@enjoy abc]$ lsabc abc.c[student@enjoy abc]$ ./abc1+2+3+...+99+100=5050[student@enjoy abc]$[student@enjoy abc]$4、从如上内容的基础上总结vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。
C语言实验报告-实验2 顺序结构程序设计
实验2 顺序结构程序设计一、实验目的1. 学会使用自然语言或伪代码描述算法2. 掌握变量、运算符、表达式的使用3. 熟悉顺序结构程序中语句的执行过程4. 掌握标准输入流对象cin及标准输出流对象二、实验内容编写程序在屏幕上显示如图2-1所示的菜单。
图2-1 学生选课管理系统主界面实验步骤:范例:1)在VS2008中新建项目,在项目中新建C++源文件,输入下面程序,并且编译、连接。
//***************************************************************//* 程序名:实训2_1.cp *//* 主要功能: *//* 显示主菜单,并获取用户输入的模块编号 *//***************************************************************#include <iostream> // 包含输入输出接口文件using namespace std; // 引用标准命名空间void mainMenu();int main() // 定义主函数{ // 主函数开始mainMenu();return 0;}void mainMenu(){system("cls");cout<<"\n\n\n\n\n";cout<<"\t\t|---------------学生选课系统(学生版)------------|\n";cout<<"\t\t|\t 0. 退出 |\n";cout<<"\t\t|\t 1. 学生信息管理 |\n";cout<<"\t\t|\t 2. 教师信息管理 |\n";cout<<"\t\t|\t 3. 课程信息管理 |\n";cout<<"\t\t|\t 4. 学生选课管理 |\n";cout<<"\t\t|\t 5. 学生成绩管理 |\n";cout<<"\t\t|\t 6. 信息统计模块 |\n";cout<<"\t\t|-----------------------------------------------|\n\n";cout<<"\t\t\t请输入模块编号(0-6):";}2)运行范例所示程序,观察输出结果实训1要求编写程序在屏幕上显示如图2-2所示的菜单。
实验二 初级程序的编写与调试
实验二初级程序的编写与调试一、实验目的1、熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
2、深入了解数据在存储器中的存取方法及堆栈中数据的压入与弹出。
3、掌握各种寻址方法及简单指令的执行过程。
二、程序(调试)说明1、设堆栈指针SP=2000H,AX=3000H,BX=5000H。
请编写程序将AX的内容和BX 的内容进行交换。
用堆栈作为两存储器交换的中间存储单元,用DEBUG调试程序进行汇编与调试-A 1000BB3:0100 MOV SP,20000BB3:0103 MOV AX,3000 ;赋初值0BB3:0106 MOV BX,50000BB3:0109 PUSH AX ;压入堆栈0BB3:010A PUSH BX0BB3:010B POP AX ;弹出堆栈0BB3:010C POP BX0BB3:010D INT 20 ;中断当前执行程序0BB3:010F HLT0BB3:0110-用堆栈作为两存储器交换的中间存储单元,使用起来很方便。
2、设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH、0BH、0CH、0DH、0EH。
在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程。
当数据传送完毕,AX中的内容是什么。
MOV AX,BXMOV AX,0304HMOV AX,[0304H]MOV AX,[BX]MOV AX,0001[BX]MOV AX,[BX][SI]MOV AX,0001[BX][SI]INT 20HHLT第一步:显示、填充、清零。
第二步:给存储器偏移地址300H~304H连续单元设初值1、2、3、4、5;并在0AH~0EH上显示出来;第三步:输入代码,并显示。
这时AX、BX、CX、DX都为0。
赋BX、SI的初值第四步:,并显示存储器偏移地址300H~304H连续单元。
实验二 keilC51编译环境的使用(C版)
• 然后就可以进行关闭KEIL 等相关操作了。
• 建立了第一个单片机C语言项目,但为了让编 译好的程序能通过编程器写入51芯片中,要先 用编译器生成HEX文件
• HEX文件格式是Intel公司提出的按地址排列 的数据信息,数据宽度为字节,所有数据使用 16进制数字表示,常用来保存单片机或其他处 理器的目标程序代码。
• C 程序文件已被加到项目中 • 就开始编译运行了 • 注意:使用软件默认的编译设置,它不
-7
• 图中1、2、3 都是编译按钮,不同的是:1 是用于编译 单个文件;2 是编译链接当前项目,如果先前编译过一 次之后文件没有做动编辑改动,这时再点击是不会再次 重新编译的;3 是重新编译,每点击一次均会再次编译 链接一次,不管程序是否有改动。
• 上图中1是选择编译输出的路径 • 2是设置编译输出生成的文件名 • 3则是决定是否要创建HEX文件,选中它就可
以输出HEX文件到指定的路径中 • 选好之后,我们再将它重新编译一次,很快在
编译信息窗口中就显示HEX文件创建到指定的 路径中了,如图2-3。这样我们就可用自己 的编程器所附带的软件去读取并烧到芯片了。
• 在3 右边的是停止编译按钮,只有点击了前三个中的任 一个,停止按钮才会生效。
• 5 是菜单中的它们。 • 在4 中可以看到编译的错误信息和使用的系统资源情况
等,以后我们要查错就靠它了。 • 6 是有一个小放大镜的按钮,这就是开启\关闭调试模
式的按钮,它也存在于菜单Debug-Start\Stop Debug Session,快捷键为Ctrl+F5。
• 同时还支持PLM、汇编和C 语言的程序设计 • 它的界面和常用的微软VC++的界面相似,界
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二基于YACC的TINY语法分析实验一、实验目的在这一阶段的实验中,同学们要完成tiny编译器的语法分析工作,即用bison工具生成一个语法分析程序,对词法分析输出的单词符号串(终结符串)进行自底向上的分析,并依次输出用来进行归约的语法规则。
二、Tiny语言的语法参见教材。
请大家注意,文档中给出的BNF描述并不能直接被YACC识别,而是需要进行适当的改写。
请大家在做实验前,仔细研究一下教材中给出的例子。
三、软件工具及文档说明实验环境为Windows操作系统,语法分析使用的主要工具是bison。
我们会提供给大家一些基本的数据结构、程序框架以及工具软件。
实验所用到的程序和工具主要包括两部分:1.工具和程序框架(在StarterFiles路径下)以下是主要文件的列表:pp2.dsp/dsw pp2工程文件不需要改动main.c 主程序不需要改动scanner.h 词法分析程序的头文件不需要改动scanner.l 词法分析程序需要改动parser.h 语法分析程序的头文件不需要改动parser.l 语法分析程序需要改动utility.h 一些工具函数不需要改动test.frag 测试文件不要改动flex.exe 工具不要改动bison.exe/simple 工具不要改动debug.bat 工具不要改动程序的执行方法是:(0)先根据完善parse.y(否则会编译出错)(1)运行debug.bat(会生成parser_tab.h和parser_tab.c);(2)用vc6.0打开pp2.dsw,编译链接生成pp2.exe;(3)运行pp2 [filename]。
其中filename是可选部分,如果没有filename,就默认是打开test.frag,否则就打开filename指定的文件。
这样设计,主要考虑在调试pp2程序时比较方便,但是测试程序时还是要对实例中给出的*.frag文件逐一进行测试。
另外,大家最好自己再编写一些合法和不合法的源文件,对程序进一步进行测试。
scanner.l是我们为大家提供的词法分析器,如果不对tiny语言本身作任何扩展,则不需要修改它,如果想对语言进行扩展,就要对它进行相应的修改。
大家也可以用自己在PP1实验中实现的词法分析器代替scanner.l,但是一定要保证你的词法分析器的输出和我们所提供的词法分析器的输出是一致的,否则会影响语法分析器的实现。
2.实例(在samples路径下)*.frag Tiny源程序*.out 正确的语法分析结果四、实验难点和重点1.bison工具的使用。
请大家仔细阅读教材 5.5 Yacc: LAlR(1) PARSING GENERATOR和中的内容。
2.二义性和冲突的解决方法。
Y ACC在处理条件语句时会给出警告,但是按照Y ACC提供的两条消除二义性的规则可以正确处理,所以这个警告不算错。
但是其它的由于规则定义不完善引起的冲突是不允许出现的。
建议大家尽量通过调整规则来消除冲突。
在处理表达式时,可以借助%left、%right和%prec等子句消除二义性并规定优先级。
3.出错处理。
yacc缺省的出错处理是遇到错误时输出提示信息,然后停止分析。
这是基本要求。
(书上5.6 5.7分别介绍了一般的出错处理和TINY.C的出错处理)如果你希望做进一步的出错处理,我们将把它作为一种扩展。
例如,可以借助yacc提供的error终结符,在出错时跳过一部分符号后继续进行分析。
建议大家参考一下其它高级语言编译器的出错处理,然后再编程实现。
我们为大家提供的yyerror()函数能够在输出错误信息的同时,输出行号和第一个出错符号的列号,你可以修改这个函数以提供更全面的报错信息。
无论你实现的是何种出错处理,请都在readme.txt中给出说明。
4.在实验2阶段,对语义信息不作处理,虽然YACC提供了$开头的一系列伪变量可以进行一定的语义处理,但是目前先不考虑语义,例如,对表达式不需要赋值。
所有语法正确的源程序在实验2阶段都应当被正确识别,语义错误暂不考虑。
五、实验的扩展1.对语言的扩展。
例如增加C语言中的“++”和“――”运算符,增加分支结构的switch 语句等。
对语言的扩展需要你自己写语法规则,并要注意不与已有规则冲突,还要对词法分析程序进行相应的修改。
如果你实现了某种decaf语言的扩展,请在readme.txt文件中说明,并为我们提供相应的测试正例和反例。
2.语法规则的输出形式是必须有的,而且一定要与答案相符合。
如果你愿意输出其它形式的语法分析结果,例如语法树,请在readme.txt中说明,并将你的结果输出到单独的文件中,不要跟语法规则的输出混在一起,否则会影响对语法分析程序的检查。
3.对源程序的文本格式进行调整,增加可读性。
例如关键字,常量和变量分别以不同颜色输出。
对语句的格式进行调整,自动加入缩进等。
如果你实现了这方面的扩展,请在readme.txt文件中说明,并把调整后的decaf源程序输出到一个单独的文件中,而不要跟语法分析的输出混在一起,否则会影响对语法分析程序的检查。
4.对出错处理,我们不作太严格的要求,你完全可以采用Y ACC的缺省处理,即遇到错误就停止分析。
如果你愿意尝试更有挑战性的错误处理,请在readme.txt文件中说明,并为我们提供相应的测试正例和反例,我们将视为一种扩展。
六、实验要求实验报告中的内容:1)YACC输入文件的解析2)上下文无关文法到LR(1)文法的下推自动机的构造3)LR(1)下推自动机到相应分析表的构造。
4)针对我们提供的SAMPLE(上课时会提供)的测试结果。
在我们所提供的工具软件中,程序框架已经写好,同学们只要修改其中的部分文件就可以完成编码工作。
然后,请大家充分利用测试实例中提供的输入和输出文件对程序进行测试,自己确认通过后将所有的程序文件(包括你没有修改的文件)整理到一个目录下并编写相应的文档readme.txt,打包成Zip文件上传,zip文件名为“自己的学号.zip”,例如“101362.zip”。
1.想做扩展的同学,请提供两份程序,一份是基本程序,它的输出要与例子中给出的答案相符,另一份是扩展程序,它的输出可以与答案不同。
并请大家在文档中给出说明。
2.检查基本程序的主要标准是程序的输出与标准答案相符合的程度。
欢迎同学们对Decaf语言进行扩展,但是要单独提供一份扩展程序和相应的测试例子,同时在readme中给出说明,我们将查看你的扩展程序并做进一步的测试,如果扩展正确,可以考虑适当加分。
3.实验课主要以提问的方式检查各位同学对实验的理解及其完成情况。
4.本学期实验分共计20分。
评分分二部分上课提问的检查为一部分,其后的实验报告及其扩展情况为第二部分,同时参考实验一给出最终的实验评分。
5.请大家遵守诚信原则, 如发现抄袭情况,则被抄袭者和抄袭者都没有成绩。
七、实验过程及结果1、根据给定的文法完善parse.y,结果如下:/*parser.y**bison输入文件,用于产生parser**pp2:你的任务只是输出parser的规约动作,即只需要验证输入文件是否符合*decaf语言的文法,并把规约动作输出。
**/%{/**同flex一样,第一个%{ %}内部的程序将被直接copy到parser_tab.h/c中*所以可以将要include的头文件和全局变量放到这儿。
*/#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <process.h>#include "scanner.h"%}/**在这儿,你可以定义tokens,types,precedence 和 associativity等。
*//**从program开始规约*/%start Program/**yylval*------*这儿定义全局变量yylval,你可以添加自己的非终结符。
*/%union { /*bison可以从这个定义中产生yylval的定义*/int integerConstant;int boolConstant;const char *stringConstant;double doubleConstant;char identifier[128];}/*Tokens*------*这儿我们告诉bison所要用到的token类型。
*bison可以给这些类型定义唯一的数字并输出#define 到parser_tab.h文件中。
*/%token T_Void T_Bool T_Int T_Double T_String T_Class%token T_LessEqual T_GreaterEqual T_Equal T_NotEqual%token T_And T_Or T_Null T_Extends T_This%token T_While T_For T_If T_Else T_Return T_Break%token T_Identifier%token T_StringConstant T_IntConstant T_DoubleConstant T_BoolConstant %token T_New T_NewArray T_Print T_ReadInteger T_ReadLine/*Precedence and Associativity*----------------------------*定义算符优先级和结合性*Note: NO SPACE between % and nonassoc, left, right!!!!!*/%%/**在这儿写出你的规则和动作*/Program : DeclList{ printf("Program -> DeclList\n"); @1};DeclList : DeclList Decl{ printf("DeclList -> DeclList Decl\n"); }| /* empty */{ printf("DeclList ->\n"); };Decl : VariableDecl { printf("Decl -> VaruableDecl\n");}|ClassDefn { printf("Decl -> ClassDefn\n");}|FunctionDefn { printf("Decl -> FunctionDefn\n");}|FunctionDecl { printf("Decl -> FunctionDecl\n");};VariableDecl :Variable ';'{ printf("VariableDecl -> Variable\n");};Variable :Type T_Identifier { printf("Variable -> Identifier\n");};Type :T_Int { printf("Type -> Int\n");}|T_Double { printf("Type -> Double\n");}|T_Bool { printf("Type -> Bool\n");}|T_String { printf("Type -> String\n");}|T_Void { printf("Type ->Void\n");}|T_Class T_Identifier{ printf("Type ->Identifier\n");} | Type '[' ']' { printf("Type -> Type[]\n");} ;FunctionDecl :Type T_Identifier '(' Formals ')' ';'{ printf("FunctionDecl ->Identifier\n");};Formals :Variable'+' ',' { printf("Formals -> Variable+,\n");}| { printf("Formals -> \n");};FunctionDefn :Type T_Identifier '(' Formals ')' StmtBlock{ printf("FunctionDefn -> Identifier\n");};ClassDefn :T_Class T_Identifier '<' T_Extends T_Identifier '>' '{' Fieldlist '}' { printf("Class Identifier < Extends Identifier > { Fieldlist }\n");};Fieldlist:Fieldlist Field { printf(" Fieldlist -> FieldlistField\n");}| { printf(" Fieldlist -> \n");};Field :VariableDecl { printf("Field -> VariableDecl\n");}| FunctionDecl { printf("Field -> FunctionDecl\n ");}| FunctionDefn { printf("Field -> FunctionDefn\n ");};StmtBlock :'{' Stmtlist '}' { printf("StmtBlock ->:{ Stmtlist } \n");} ;Stmtlist:Stmtlist Stmt { printf("Stmtlist -> Stmtlist Stmt\n ");};Stmt :VariableDecl { printf(" Stmt -> VariableDecl\n ");}| SimpleStmt ';' { printf(" Stmt ->SimpleStmt;\n ");}| IfStmt { printf(" Stmt ->IfStmt\n ");}| WhileStmt { printf(" Stmt -> WhileStmt \n ");}| ForStmt { printf(" Stmt -> ForStmt \n ");}| ReturnStmt ';' { printf(" Stmt ->ReturnStmt;\n ");}| PrintStmt ';' { printf(" Stmt -> PrintStmt ;\n ");}| StmtBlock { printf(" Stmt -> StmtBlock \n ");};SimpleStmt :LValue '=' Expr { printf(" SimpleStmt ->LValue = Expr\n");}| Expr { printf(" SimpleStmt -> Expr \n");}| { printf(" SimpleStmt -> \n");};LValue :'<' Expr '.' '>' T_Identifier { printf(" LValue -> :< Expr . >\n");}| Expr '[' Expr ']' { printf(" LValue -> [ Expr ] \n");};Call : '<'Expr '.' '>' T_Identifier '(' Actuals ')' { printf(" Call-><Expr .> T_Identifier ( Actuals ) \n");};Actuals :Expr '+' ',' { printf(" Actuals -> Expr +, \n");}| { printf(" Actuals -> \n");};ForStmt :T_For '(' SimpleStmt ';' BoolExpr ';' SimpleStmt ')' Stmt{ printf(" ForStmt ->For (SimpleStmt ; BoolExpr ; SimpleStmt ) Stmt \n");};WhileStmt : T_While '(' BoolExpr ')' Stmt { printf("WhileStmt->While( BoolExpr ) Stmt \n");};IfStmt : T_If '(' BoolExpr ')' Stmt '<' T_Else Stmt '>' { printf("IfStmt->If (BoolExpr ) Stmt <Else Stmt > \n");};ReturnStmt : T_Return { printf(" ReturnStmt ->Return\n");}| T_Return Expr { printf(" ReturnStmt ->Return Expr \n");} ;PrintStmt : T_Print '(' Expr '+' ',' ')' { printf("PrintStmt->Print (Expr+ ,) \n");};BoolExpr : Expr { printf("BoolExpr ->Expr\n");};Expr : Constant { printf("Expr ->Constant\n");}| LValue { printf("Expr ->LValue\n");}| T_This { printf("Expr ->This\n");}| Call { printf("Expr ->Call\n");}| '(' Expr')' { printf("Expr ->( Expr) \n");}|Expr '+' Expr { printf("Expr ->Expr + Expr \n");}| Expr '-' Expr { printf("Expr ->Expr - Expr \n");}| Expr '*' Expr { printf("Expr ->Expr * Expr \n");}|Expr '/' Expr { printf("Expr ->Expr /Expr \n");}| Expr '%' Expr { printf("Expr ->Expr % Expr \n");}| '-' Expr { printf("Expr -> - Expr \n");}|Expr '<' Expr { printf("Expr ->Expr < Expr \n");}| Expr T_LessEqual Expr { printf("Expr ->LessEqual Expr \n");} | Expr '>' Expr { printf("Expr ->Expr >Expr \n");}|Expr T_GreaterEqual Expr { printf("Expr ->GreaterEqual\n");}| Expr T_Equal Expr { printf("Expr ->Equal Expr \n");}| Expr T_NotEqual Expr { printf("Expr ->NotEqual Expr \n");} |Expr T_And Expr { printf("Expr ->And Expr \n");}| Expr T_Or Expr { printf("Expr ->Or Expr \n");}| '!' Expr { printf("Expr ->! Expr \n");}|T_ReadInteger '(' ')' { printf("Expr ->Expr ReadInteger ( ) \n");}|T_ReadLine '(' ')' { printf("Expr ->Expr ReadLine ( ) \n");} |T_New '(' T_Identifier ')' { printf("Expr ->New ( Identifier ) \n");}|T_NewArray '(' Expr ',' Type ')' { printf("Expr ->NewArray ( Expr ,Type )\n");};Constant :T_IntConstant { printf("Constant ->IntConstant\n");}| T_DoubleConstant { printf("Constant ->DoubleConstant\n");}| T_BoolConstant { printf("Constant ->BoolConstant\n");}|T_StringConstant { printf("Constant ->StringConstant\n");} | T_Null { printf("Constant -> Null\n");};%%/**语法规则到此为止。