C# 语言基础 Visual Studio 实验报告

C# 语言基础 Visual Studio  实验报告
C# 语言基础 Visual Studio  实验报告

黑龙江八一农垦大学

实验报告

姓名学号班级

实验名称Visual https://www.360docs.net/doc/fc12348390.html, IDE基本操作

实验目的

掌握Visual https://www.360docs.net/doc/fc12348390.html, IDE基本操作

认识菜单与工具条、解决方案资源管理器窗口、类视图窗口、

工具箱(重点)、属性窗口、帮助功能、输出窗口、代码编辑

等。

实验步骤(摘要)

起始页包含“最近的项目”、“开始”、“Visual Studio标题新闻”、“MSDN中文网站”等部分。

在“最近的项目”中有最近项目列表、“打开”、“创建”两类功能。如果项目或网站已存在,则使用“打开”功能,否则使用“创建”功能可以创建一个新项目或新网站。

单击创建“网站”,出现“新建网站”对话框。通常建立一个应用程序网站应使用“https://www.360docs.net/doc/fc12348390.html, 网站”模板,位置先选用“文件系统”,输入位置“D:\Examples\WebSite1”或适合的文件夹名称,语言选用“Visual C#”。

1.2 菜单与工具条

IDE内的菜单可根据当前编辑内容的不同而进行自动更换,而且不常用的菜单会隐藏起来。图2-1是IDE编辑HTML文件时出现的菜单。

图2-1编辑HTML文件时的Visual https://www.360docs.net/doc/fc12348390.html, IDE菜单

在IDE中提供的工具条共有十几类,而且和Office系列软件一样提供了“添加和移除按钮”这个功能(图2-2),你可以根据自己的需要调整工具条上出现的按钮。虽然Visual Studio 6.0

中也可以设置工具条上的按钮,但没有现在这么直观和方便。

此外如果要调整当前显示的工具条,可以在任意一个工具条上按下右键,或点击菜单“视图(V) -> 工具栏(T)”,在弹出的菜单中选择需要的工具条(图2-3)。所以在编辑不同的文件时,为了提高工作效率要打开相应的工具条。

图2-3在任意一个工具条上按下右键,在弹出的菜单上选择工具条

1.3 解决方案资源管理器窗口

“解决方案资源管理器”窗口用来有效的管理开发过程中所需要的诸如引用、数据连接、文件夹、文件等内容。解决方案资源管理器用来管理方案中的项目,打开方式:

●菜单“视图(V) -> 解决方案资源管理器”;

●“标准”工具栏上的工具“解决方案资源管理器”()

●快捷键“Ctrl+W,S”。

“解决方案资源管理器”窗口允许包含不同类型的项目,这些项目可以由多种语言来开发,甚至还允许包含一些其他的文件。

1.4 类视图窗口

通过“类视图”窗口,用户可以检查和浏览当前解决方案中的所有符号。这些符号按照各个项目进行组织,共同显示在一个分级的树形结构视图结构中,以表示他们之间的包含关系。此外此窗口还包含了基类信息、接口信息和重载方法等(图4-1)。

1.5 工具箱

通常,工具箱位于开发窗口的左侧。工具相中有创建Form时所使用的组件(Controls),以及非图形化的组件,例如,代码片段可以直接从工具箱拖到代码窗口。

工具箱由不同的选项卡组成,每个选项卡包含相关的组件或代码。

工具箱允许自定义选项卡。方法是用鼠标右键单击工具箱,然后从弹出的快捷菜单中选择“添加选项卡”选项即可(图5-1)。

在适当的情况下,工具箱还会显示其他的选项卡。要查看所有的选项卡,可以用鼠标右键单击工具箱,然后在弹出的快捷菜单中选择“全部显示”选项即可(图5-1)。

图5-1Visual https://www.360docs.net/doc/fc12348390.html,中的工具箱FileUpload 上传

Panel 面板在窗体上创建无边框间隔区域,用作其他控件的容器。

PlaceHolder 使您可以将空容器控件放到页上,然后在运行时动态在其中添加子元素。

GridView 数据网格视

在具有列的表格窗体中显示信息,通常

为数据绑定。提供允许编辑和排序的机

制。

DataList 数据列表与Repeater控件相同,但具有更多格式设置和布局选项,包括在表中显示信息的能力。DataList控件还允许指定编辑行为。

DetailsView 数据细节视图

FormView 表单视图

Repeater 重复控件使用指定的一组HTML 元素和控件显示数据源中的信息,为数据集中的每条记录重复一次这些元素。

SQLDataSource SQL数据源

AccessDataSource Access数据源

ObjectDataSource Object数据源

XMLDataSource XML数据源

SiteMapDataSource 站点地图数据源

RequireFieldValidator 必需项确保用户不会跳过某一项。

CompareValidator 与某值的比

使用比较运算符(小于、等于、大于等)

比较用户的输入与一个常量值或另一

控件的属性值。

RangeValidator 范围检查检查用户的输入是否在指定的上下限内。可以检查数字对、字母字符对和日期对的范围。边界可以表示为常数或从其他控件导出的值。

RegularExpressionValidator 模式匹配检查项与正则表达式定义的模式是否匹配。这种验证类型允许检查可预知的字符序列,如社会保障号、电子邮件地址、电话号码、邮政编码等中的字符序列。

CustomValidator 用户定义使用自己编写的验证逻辑检查用户的输入。

ValidationSummary 在一个统一摘要中显示页上所有其他验证控件的错误信息。

SiteMapPath 站点路径

Menu 菜单

TreeView 树型控件

1.6 属性窗口

属性窗口在IDE中的功能非常强,使用属性窗口可编辑或查看文件、项目和解决方案

的属性。还可在设计过程中查看、修改编辑器和设计器中所选定的对象属性和事件。在Visual https://www.360docs.net/doc/fc12348390.html,中所有的工作都通过属性窗口来实现,而且功能比以前更加强大了。

选中文件时显示文件名等属性(如图6-1)。

图6-1选中文件时的属性窗口

在编辑Web From时显示文档或各种标记的属性,并可以对属性进行修改(图6-2)

图6-2编辑Web From中的Label控件时的属性窗口

1.7 帮助功能

同样MSDN(Microsoft Developer Network Library)的界面也已经改变,通过菜单“帮助(H)

-> 目录(C)”就可以打开MSDN(图7-2)。

图7-2

1.8 输出窗口

我们可以通过“视图(V) -> 输出(O)”,打开“输出”窗口,输出窗口的作用是查看应用程序的调试结果,并可以通过输入一些代码,甚至调用代码中的过程来与调试环境进行交互。按F5键运行程序,可以看到输出窗口中的内容。

1.9 代码编辑

Visual https://www.360docs.net/doc/fc12348390.html,提供的代码编辑功能非常强大,在书写代码时提供了智能感知功能和提示功能。下面的图片是在书写Web Form(图9-1)和书写Visual C#程序文件(图9-2)时

的智能感知功能。

图9-1书写Web Form时的智能感知功能

IDE的智能感知功能也可以通过菜单或快捷键执行,用户也可以通过菜单进行设置(图

9-2),智能感知的提示功能对于初学者来说非常有用,可以大大减少写代码时翻书的时间。

黑龙江八一农垦大学

实验报告

姓名学号班级

实验名称“Hello World”程序

实验目的

按照实验报告内容熟悉掌握“Hello World”操作程序

编写两种类型的应用程序:Windows Form 程序、Web Form 程

实验步骤(摘要)

2.1 Windows Form应用程序

Windows Form版本的“Hello World!”程序,通过单击窗体中的按钮,弹出一个消息框,在消息框中显示“Hello World!”字符串。

的具体步骤:

(1)启动Visual https://www.360docs.net/doc/fc12348390.html,。

(2)选择菜单“文件(F) -> 新建(N) -> 项目(P)”后,弹出“新建项目”对话框。

(3)将“项目类型”设置为“Visual C# -> Windows”。

(4)将“模板”设置为“Windows应用程序”。

(5)在“名称”文本框中输入“HelloWin”。

(6)在“位置”的文本框中输入“E:\Examples”。

(7)解决方案选择“创建解决方案”,选中“创建解决方案的目录”(图2-1)。

单击“确定”按钮,则Visual Studio .NET会按照上面设定的参数创建一个Windows应用程序项目,并自动建立第一个Windows Form,名为Form1.cs(图2-2

图2-2进入“Hello World”程序的设计界面

(8)选择“工具箱”中的“Windows窗体”控件,并从中拖入(或双击)一个Button控件到Form1窗体,此控件名称为Button1(图2-3)。双击拖入的Button1控件,Visual Studio .NET会切换窗口到Form1的代码窗口,并自动产生Button1的Click事件对应的代码框架(图2-4)。

图2-3添加一个Button控件到Form

图2-4编写Button1的Click事件代码

(9)在Button1的Click事件的代码区添加下列代码,代码的功能是弹出“Hello World!”消息框。

MessageBox.Show ("Hello World!");

(10)选择“文件(F) -> 全部保存(L)”菜单或者按快捷键Ctrl+Shift+S,保存所做的修改。

(11)选择“生成(B) -> 生成HelloWin(U)”菜单,则Visual https://www.360docs.net/doc/fc12348390.html,会自动编译、链接源程序,并生成HelloWin的执行文件。

(12)选择“调试(D) -> 启动调试(S)”菜单,或者单击快捷键“F5”,或单击工具栏上的“启动”工具,则开始运行HelloWin程序。单击程序中的“Button1”按钮,则弹出“Hello

World!”消息框(图2-5)。

图2-5“Hello World”程序Windows Form版运行界面

2.2 Web Form应用程序

“Hello World!”程序的Web Form版本同样也是输出“Hello World!”字符串。具体步骤为:

(1)启动Visual https://www.360docs.net/doc/fc12348390.html,。

(2)选择菜单“文件(F) -> 新建(N) -> 网站(W)”后,弹出“新建网站”对话框。

(3)将“模板”设置为“https://www.360docs.net/doc/fc12348390.html, 网站”。

(4)“位置”选择“文件系统”,文件夹设置为“D:\Examples\Hello”,语言选择“Visual

C#”(图2-6)。

图2-6新建“Hello World”网站

(5)单击“确定”按钮,则Visual Studio .NET会按照上面设定的参数创建一个网站,并自动建立第一个Web Form,名为Default.Aspx(图2-7)

(6)将Default.Aspx从“源”视图切换到“设计”视图。

(7)选择“工具箱”中的“标准”控件,并从中拖入(或双击)一个Button控件到Default窗体,此控件名称(ID属性)为Button1,显示内容(Text属性)为Button(图2-8),属性可由用户修改。

(8)双击拖入的Button1控件,Visual https://www.360docs.net/doc/fc12348390.html,会切换窗口到Default的代码窗口Default.aspx.cs,这就是背后代码(CodeBehind),并自动产生Button1的Click事件对应的代码框架(图2-9)。

(9)在Button1的Click事件的代码区添加下列代码,代码的功能是在当前页面输出“Hello World!”。

Response.Write(" Hello World!");

(10)选择“文件(F) -> 全部保存(L)”菜单或者按快捷键Ctrl+Shift+S,保存所做的修改。

(11)选择“生成(B) -> 生成网站(U)”菜单,则Visual Studio .NET会自动编译源程序。

(12)选择“调试(D) -> 启动调试(S)”菜单,或者单击快捷键“F5”,或单击工具栏上的“启动”工具,则开始运行Hello程序。单击程序中的“Button1”按钮,显示“Hello World!”(图2-10)。

编译原理实验报告《LL(1)语法分析器构造》

《LL(1)分析器的构造》实验报告 一、实验名称 LL(1)分析器的构造 二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法: G[E]:E->E+T|T T->T*F|F F->(E)|i 所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 四、主要仪器设备 硬件:微型计算机。 软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述 1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下: void input_grammer(string *G);//输入文法G

//将文法G预处理得到产生式集合P,非终结符、终结符集合U、u, int eliminate_1(string *G,string *P,string U,string *GG);//消除文法G中所有直接左递归得到文法GG int* ifempty(string* P,string U,int k,int n);//判断各非终结符是否能推导为空 string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集 string FIRST(string U,string u,string* first,string s);//求符号串s=X1X2...Xn的FIRST集 string** create_table(string *P,string U,string u,int n,int t,int k,string* first);//构造分析表 void analyse(string **table,string U,string u,int t,string s);//分析符号串s 2、编写的源程序 #include #include #include using namespace std; void input_grammer(string *G)//输入文法G,n个非终结符 { int i=0;//计数 char ch='y'; while(ch=='y'){ cin>>G[i++]; cout<<"继续输入?(y/n)\n"; cin>>ch; } } void preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u, { int i,j,r,temp;//计数 char C;//记录规则中()后的符号 int flag;//检测到() n=t=k=0; for( i=0;i<50;i++) P[i]=" ";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a) U=u=" ";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a) for(n=0;!G[n].empty();n++) { U[n]=G[n][0]; }//非终结符集合,n为非终结符个数 for(i=0;i

TEST语言 -语法分析,词法分析实验报告

编译原理实验报告 实验名称:分析调试语义分析程序 TEST抽象机模拟器完整程序 保证能用!!!!! 一、实验目的 通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。 二、实验设计 程序流程图

extern int TESTScan(FILE *fin,FILE *fout); FILE *fin,*fout; //用于指定输入输出文件的指针 int main() { char szFinName[300]; char szFoutName[300]; printf("请输入源程序文件名(包括路径):"); scanf("%s",szFinName); printf("请输入词法分析输出文件名(包括路径):"); scanf("%s",szFoutName); if( (fin = fopen(szFinName,"r")) == NULL) { printf("\n打开词法分析输入文件出错!\n"); return 0; } if( (fout = fopen(szFoutName,"w")) == NULL) { printf("\n创建词法分析输出文件出错!\n"); return 0; } int es = TESTScan(fin,fout); fclose(fin); fclose(fout); if(es > 0) printf("词法分析有错,编译停止!共有%d个错误!\n",es); else if(es == 0) { printf("词法分析成功!\n"); int es = 0;

编译原理LL(1)语法分析实验报告

学号20102798 专业软件工程姓名薛建东 实验日期2013.04.08 教师签字成绩实验报告 【实验名称】LL(1)语法分析 【实验目的】 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练掌握开发应用程序的基本方法。 【实验内容】 ◆根据某一文法编制调试LL ( 1)分析程序,以便对任意输入的符号串进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1) 分析表,对输入符号串自上而下的分析过程。 【设计思想】 (1)、LL(1)文法的定义 LL(1)分析法属于确定的自顶向下分析方法。LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。 LL(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判断是否为LL(1)文法,最后再进行句子分析。 需要预测分析器对所给句型进行识别。即在LL(1)分析法中,每当在符号栈的栈顶出现非终极符时,要预测用哪个产生式的右部去替换该非终极符;当出现终结符时,判断其与剩余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。LL(1)分析方法要求文法满足如下条件:对于任一非终极符A的两个不同产生式A→α,A→β,都要满足下面条件:SELECT(A→α)∩SELECT(A→β)=? (2)、预测分析表构造 LL(1)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推

语法分析(自上而下分析)实验报告

实习二语法分析-自上而下分析 一、实验目的 使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。 二、实验内容 1.设计表达式的语法分析器算法(使用预测分析) 2.编写一段代码并上机调试查看其运行结果 三、实验要求 使用LL(1)分析算法设计表达式的语法分析器 LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。 实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。 预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前a的输入符号行事的。对于任何(X,a),总控程序每次都执行三种可能的动作之一。 1.若X=a=“#”,则宣布分析成功,停止分析过程 2.若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一 个输入符号。 3.若X是一个非终结符,则查看分析表。 四、运行结果

(本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析) 五、源程序实现 /*LL(1)分析法源程序,只能在VC++中运行*/ #include #include #include #include char A[20]; char B[20]; char v1[20]={'i','+','*','(',')','#'};/*终结符*/ char v2[20]={'E','G','T','S','F'};/*非终结符*/ int j=0,b=0,top=0,l;/*L为输入串长度*/

语法分析器实验报告

语法分析器的设计实验报告 一、实验内容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

LL(1)语法分析实验报告

实验报告 姓名:孙岩 学号:1408080211 班级:惠普开发142 学校:青岛科技大学Mail: 电话:178******** 教师:宮生文

实验报告: 实验名称:LL(1)语法分析 实验目的和要求 编制一个能识别由词法分析给出的单词符号序列是否是给定文法的正确句子(程序),输出对输入符号串的分析过程。 实验内容和步骤: 一、实验内容 对于这个实验,总共用了三个函数,即主函数、输出分析栈函数、输出剩余串函数。在主函数中,还要构造预测分析表。 二、实验步骤 1、基于实验的内容,构造程序所需的模块 2、根据已建构的模块,写出各个模块的相应程序代码 3、在主函数中调用模块来完成所要得到的效果 在本程序中,首先使用了结构体类型定义来定义产生式,用字符串数组存放分析栈、剩余串、终结符和非终结符,用二维数组存放预测分析表,利用指针对栈中数据进行读取。在本程序中,总共用了三个函数,即主函数、输出分析栈函数、输出剩余串函数。在主函数中,还要构造预测分析表,对输入的字符串进行分析,调用另外两个函数。 实验代码如下: #include #include #include #include char A[20];/*分析栈*/ char B[20];/*剩余串*/ char v1[20]={'i','+','*','(',')','#'};/*终结符*/ char v2[20]={'E','G','T','S','F'};/*非终结符*/ int j=0,b=0,top=0,l;/*L为输入串长度*/ typedef struct type/*产生式类型定义*/ { char origin;/*大写字符*/ char array[5];/*产生式右边字符*/ int length;/*字符个数*/ }type; type e,t,g,g1,s,s1,f,f1;/*结构体变量*/

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

语法分析器实验报告

语法分析器的设计实验报告 一、实验容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

语法分析词法分析实验报告

编译原理实验报告词法分析和语法分析 专业班级 jk0701 学生姓名舒月 学号 07281011

实验题目:研究性学习专题一词法分析程序构造原理与实现技术 研究性学习专题二递归下降语法分析设计原理与实现技术一实验目的 (1)研究性学习专题一 <标识符>→字母︱<标识符>字母︱<标识符>数字 <无符号整数>→数字︱<无符号整数>数字 <单字符分界符> →+ ︱-︱* ︱; ︱(︱) <双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<冒号>=︱<斜竖>* <小于>→< <等于>→= <大于>→> <冒号> →: <斜竖> →/ 该语言的保留字:begin end if then else for do while and or not [设计说明] (1)该语言大小写不敏感;(2)字母为a-z A-Z,数字为0-9;(3)可以对上述文法进行扩充和改造;(4)‘/*……*/’为程序的注释部分。 (2)研究性学习专题二 G[E]: E→TE′ E′→ATE′|ε T→FT′ T′→MFT′|ε F→(E)|i A→+|- M→*|/ [设计说明] 终结符号i为用户定义的简单变量,即标识符的定义。

二实验分析过程 词法分析程序功能描述:根据上述正则文法,输入一串字符串,输出一串二元式序列组成的中间文件,在实现的过程中,能发现输入串中的错误。 语法分析程序功能描述:根据词法分析输出的二元式序列,对二元式序列进行判定,时候满足语法的要求,若满足,则输出结果为正确,反之,为错误。 主要数据结构:用T okenBean类存储数字,标识符,保留字的类别,表示,和识别名 public class TokenBean { String name; String code; int kind; } 用ArrayList来装TokenBean类 程序结构描述: (1)词法分析过程用到的主要函数 public boolean isNumber(char ch)//判断输入字符是否为整数 public boolean isAlph(char ch) //判断输入字符是否为字母 private void isKey(String str)// 判断str是关键字还是标识符 public void excute(String s) //对字符串s 进行分析,得出二元式(2)语法分析过程用到的主要函数 public boolean ipresent(int kind)//识别保留字,标识符,整数以下是判断函数,入口为E() 若E为真,则二元式序列满足语法分析 private boolean E() // E→TE′ private boolean E1() // E′→ATE′|ε private boolean A() //A→+|- private boolean T() // T→FT′ private boolean T1() // T′→MFT′|ε private boolean M() //M→*|/ private boolean F() //F→ (E)|i

语法分析器实验报告

词法分析器实验报告 实验名称:语法分析器 实验内容:利用LL(1)或LR(1)分析语句语法,判断其是否符合可识别语法。学会根据状态变化、first、follow或归约转移思想构造状态分析表,利用堆栈对当前内容进行有效判断 实验设计: 1.实现功能 可对一段包含加减乘除括号的赋值语句进行语法分析,其必须以$为终结符,语句间以; 隔离,判断其是否符合语法规则,依次输出判断过程中所用到的产生式,并输出最终结论,若有错误可以报错并提示错误所在行数及原因 2.实验步骤 设计文法消除左递归提取公共左因子求first,follow 构造分析表设计程序编写程序 3.算法与数据结构 a)LLtable:left记录产生式左端字符;right记录产生式右端字符;ln记录产生式右端字 符长度 Status:记录token分析情况 Token:category,类型;value,具体内容 b)根据LL(1)算法,手工构造分析表,并将内容用数组存储,便于查找 c)先将当前语句的各token按序存储,当前处理语句最后一个token以#标记,作为输 入流与产生式比较,堆栈中初始放入#,x,a为处理输入流中当前读头内容 ?若top=a=‘#‘表示识别成功,退出分析程序 ?若top=a!=‘#‘表示匹配,弹出栈顶符号,读头前进一个 ?若top为i或n,但top!=a,出错,输出当前语句所在行,出错具体字符 ?若top不为i或n,查预测分析表,若其中存放关于top产生式,则弹出top,将产生式右部自右向左压入栈内,输出该产生式,若其中没有产生式,出错, 输出当前语句所在行,出错具体字符 d)以;作为语句终结,每次遇到分号则处理之前语句并清空后预备下语句处理,当遇 到$表示该段程序结束,停止继续处理 4.分析表构造过程 a)x->i=e e->e+t|e-t|t t->t*f|t/f|f f->(e)|i|n note: i表示变量,n表示数字,!表示空串 b)提取左公因子 x->i=e e->ea|t a->+t|-t t->tb|f

SLR(1)文法分析实验报告

《编译原理》课程设计报告—SLR(1)分析的实现 学院计算机科学与技术 专业计算机科学与技术 学号 学生姓名 指导教师姓名 2015年12月26日

目录 1.设计的目的与内容 (1) 1.1课程设计的目的 (1) 1.2设计内容 (1) 1.3设计要求 (1) 1.4理论基础 (1) 2算法的基本思想 (2) 2.1主要功能函数 (2) 2.2算法思想 (3) SLR文法构造分析表的主要思想: (3) 解决冲突的方法: (3) SLR语法分析表的构造方法: (4) 3主要功能模块流程图 (5) 3.1主函数功能流程图 (5) 4系统测试 (6) 5 结论 (11) 附录程序源码清单 (12)

1.设计的目的与内容 1.1课程设计的目的 编译原理课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 ●进一步巩固和复习编译原理的基础知识。 ●培养学生结构化程序、模块化程序设计的方法和能力。 ●提高学生对于编程语言原理的理解能力。 ●加深学生对于编程语言实现手段的印象。 1.2设计内容 构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。 1.3设计要求 1)SLR(1)分析表的生成可以选择编程序生成,也可选择手动生成; 2)程序要求要配合适当的错误处理机制; 3)要打印句子的文法分析过程。 1.4理论基础 由于大多数适用的程序设计语言的文法不能满足LR(0)文法的条件,即使是描述一个实数变量说明这样简单的文法也不一定是LR(0)文法。因此对于LR(0)规范族中有冲突的项目集(状态)用向前查看一个符号的办法进行处理,以解决冲突。这种办法将能满足一些文法的需要,因为只对有冲突的状态才向前查看一个符号,以确定做那种动作,因而称这种分析方法为简单的LR(1)分析法,用SLR(1)表示。

编译原理语法分析器实验报告

编译原理语法分析器实验报告

西安邮电大学 编译原理实验报告 学院名称:计算机学院 学生姓名:高宏伟 实验名称:语法分析器的设计与实现班级:计科1405班学号:04141152 时间:2017年5月12日

把SELECT (i)存放到temp中结果返回1; 1.构建好的预测分析表 2.语法分析流程图 一.实验结果 正确运行结果:

错误运行结果: 二.设计技巧和心得体会 这次实验编写了一个语法分析方法的程序,但是在LL(1)分析器的编写中我只达到了最低要求,就是自己手动输入的select集,first集,follow集然后通过程序将预测分析表构造出来,然后自己编写总控程序根据分析表进行分析。 通过本次试验,我能够设计一个简单的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 还能选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析

程序和LR分析分析程序。 三.源代码 package com.LL1; import java.util.ArrayDeque; import java.util.Deque; /** * LL1文法分析器,已经构建好预测分析表,采用Deque实现 * Created by HongWeiPC on 2017/5/12. */ public class LL1_Deque { //预测分析表 private String[][] analysisTable = new String[][]{ {"TE'", "", "", "TE'", "", ""}, {"", "+TE'", "", "", "ε", "ε"}, {"FT'", "", "", "FT'", "", ""}, {"", "ε", "*FT'", "", "ε", "ε"}, {"i", "", "", "(E)", "", ""} }; //终结符 private String[] VT = new String[]{"i", "+", "*", "(", ")", "#"}; //非终结符 private String[] VN = new String[]{"E", "E'", "T", "T'", "F"}; //输入串strToken private StringBuilder strToken = new StringBuilder("i*i+i"); //分析栈stack private Deque stack = new ArrayDeque<>(); //shuru1保存从输入串中读取的一个输入符号,当前符号 private String shuru1 = null; //X中保存stack栈顶符号 private String X = null; //flag标志预测分析是否成功 private boolean flag = true; //记录输入串中当前字符的位置 private int cur = 0; //记录步数 private int count = 0; public static void main(String[] args) { LL1_Deque ll1 = new LL1_Deque(); ll1.init(); ll1.totalControlProgram(); ll1.printf(); } //初始化 private void init() { strToken.append("#"); stack.push("#"); System.out.printf("%-8s %-18s %-17s %s\n", "步骤", "符号栈", "输入串", "所用产生式"); stack.push("E"); curCharacter(); System.out.printf("%-10d %-20s %-20s\n", count, stack.toString(), strToken.substring(cur, strToken.length())); } //读取当前栈顶符号 private void stackPeek() { X = stack.peekFirst(); } //返回输入串中当前位置的字母 private String curCharacter() { shuru1 = String.valueOf(strToken.charAt(cur)); return shuru1; } //判断X是否是终结符 private boolean XisVT() { for (int i = 0; i < (VT.length - 1); i++) { if (VT[i].equals(X)) {

语法分析器实验报告2

一、实验目的 设计、编制并调试一个语法分析程序,加深对语法分析原理的理解。 二实验要求 要求语法分析器的输入是单词串(含词的字符串形式、在源文件中的起止位置、 词的类别),输出是源程序中各句子的单词起止编号、句子的语法树。 三实验内容 以下不同语法分析器中任选一个: 1. 2. 3. 4. 递归下降分析器。可分解为:文法输入及解析、消除左递归、提取左公 共因子、产生式匹配。 LL(1)分析器。可分解为:文法输入及解析、分析表构造(含 SELECT 集 求解)、主控程序、语法树展示。 算符优先文法分析器。可分解为:文法输入及解析、分析表构造、主控 程序、语法树展示。 LR(1)分析器。可分解为:文法输入及解析、分析表构造(含项目及项目 簇集求解)、主控程序、语法树展示。 四、实验步骤 给定的文法G[E] E->TE' E'->+TE' | £ T->FT' T'->*F T ' | £ F->(E) | i 采用递归下降分析法编写语法分析程序及 LL (1)语法分析法编写语法分析程序。 实验代码: #in clude #in clude #in clude #defi ne N 100 int seek Prod(i nt stackT op ,i nt inpu tstrT op); //char inpu tstr[10]="i*i+i#"; char inpu tstr[20]; char stack[10]=""; typ edef struct p roducti on{ char leftChar; char rightChars[4]; char allChars[8]; }P rod; Prod p roduct ion s[8]; void in it(); int stack Pu sh(i nt *top, Prod p rod); int matchi ng(i nt *top, char *inpu tstr); int mai n()

编译原理语法分析实验报告

实验2 语法分析实验报告 一、实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 1、待分析的简单语言的语法 用扩充的BNF表示如下: (1)<程序>::=begin<语句串>end (2)<语句串>::=<语句>{;<语句>} (3)<语句>::=<赋值语句> (4)<赋值语句>::=ID:=<表达式> (5)<表达式>::=<项>{+<项>|-<项>} (6)<项>::=<因子>{*<因子>|/<因子>} (7)<因子>::=ID| NUM|(<表达式>) 2、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。 三、源程序代码: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针,m是token的指针 char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner(); void factor(); void term(); void expression(); void statement();

void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if((ch>='0'&&ch<='9')) { { sum=0; while((ch>='0'&&ch<='9')) { sum=sum*10+ch-'0';

编译原理LL(1)语法分析实验报告

学号 E 专业计算机科学与技术姓名万学进 实验日期2010-5-11教师签字成绩 实验报告 【实验名称】 LL(1)语法分析 【实验目的】 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练掌握开发应用程序的基本方法。 【实验内容】 根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号串进行分析。 构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。 【设计思想】 (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

【实验要求】 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)S->TE (2)E->+TE|$ (3)T->FM (4)M->*FM|$ (5)F->(E)|i# 【流程图】

【源代码】 #include<> #include<> int vnNum,grammarNum,vtNum=6; int order; int count=1; char Grammar[20][10],BlankTerminate[20][2] ; char First[5][4]={'S','(','i','\0', 'E','+','$','\0', 'T','(','i','\0', 'M','*','$','\0', 'F','(','i','\0'}; char Follow[5][6]={'S',')','#','\0','\0',' \0', 'E',')','#','\0','\0','\0', 'T','+',')','#','\0','\0', 'M','+',')','#','\0','\0', 'F','*','+',')','#','\0'}; char Select[8][4]={'(','i','\0','\0', '+','\0','\0','\0', ')','#','\0','\0', '(','i','\0','\0', '*','\0','\0','\0', '+',')','#','\0', '(','\0','\0','\0', 'i','\0','\0','\0'}; int IndiBlanket[6][7]; char VT[10]={'i','+','*','(',')','#'}; typedef struct { char *base; char *top; int stacksize; }AnalStack; AnalStack S; int ScanGrammar() { FILE *fp=fopen("文法.txt","r"); FILE *tp; char singleChar,nextChar; int i=0,j=0; while(!feof(fp)) { fscanf(fp,"%c",&singleChar); if(singleChar=='#') { Grammar[i][j]='\0'; break; } if(singleChar=='\n') { Grammar[i][j]='\0'; i++; j=0; continue; } if(singleChar=='-') { tp=fp; fscanf(tp,"%c",&nextChar); if(nextChar=='>') { fp=tp; continue; } } if(singleChar=='|') { Grammar[i+1][0]=Grammar[i][0]; Grammar[i][j]='\0';

LL(1)语法分析程序实验报告

LL1实验报告 1.设计原理 所谓LL(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现LL(1)分析的程序又称为LL(1)分析程序或LL1(1)分析器。 我们知道一个文法要能进行LL(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL(1)分析表,最后利用分析表,根据LL(1)语法分析构造一个分析器。LL(1)的语法分析程序包含了三个部分,总控程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了C++语言来编写,其逻辑结构图如下: LL(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。对于任何(X,a),总控程序每次都执行下述三种可能的动作之一: (1)若X = a =‘#’,则宣布分析成功,停止分析过程。 (2)若X = a ‘#’,则把X从STACK栈顶弹出,让a指向下一个输入符号。 (3)若X是一个非终结符,则查看预测分析表M。若M[A,a]中存放着关于X的一个产生式,那么,首先把X弹出STACK栈顶,然后,把产生式的右部符号串按反序一一弹出STACK栈(若右部符号为ε,则不推什么东西进STACK栈)。若M[A,a]中存放着“出错标志”,则调用出错诊断程序ERROR。 事实上,LL(1)的分析是根据文法构造的,它反映了相应文法所定义的语言的固定特征,因此在LL(1)分析器中,实际上是以LL(1)分析表代替相应方法来进行分析的。 2.分析 LL ( 1) 分析表是一个二维表,它的表列符号是当前符号,包括文法所有的终结和自定义。 的句子结束符号#,它的表行符号是可能在文法符号栈SYN中出现的所有符号,包括所有的非终结符,所有出现在产生式右侧且不在首位置的终结符,自定义的句子结束符号#表项。 为当前栈符号与当前符号匹配后,所要求的栈操作和输入操作。表项表明了文法的终结符与非终结符是否可能相遇。其中,栈操作包括两种,一是弹栈;二是弹栈后,将符号串ABc反转后压栈;输入操作包括两种,一是读入下一符号,是保持当前符号不变。 具体的造算法为171。

相关文档
最新文档