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

上传人:b****3 文档编号:12921073 上传时间:2023-04-22 格式:DOCX 页数:28 大小:321.24KB
下载 相关 举报
编译原理实验报告语法分析.docx_第1页
第1页 / 共28页
编译原理实验报告语法分析.docx_第2页
第2页 / 共28页
编译原理实验报告语法分析.docx_第3页
第3页 / 共28页
编译原理实验报告语法分析.docx_第4页
第4页 / 共28页
编译原理实验报告语法分析.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

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

《编译原理实验报告语法分析.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告语法分析.docx(28页珍藏版)》请在冰豆网上搜索。

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

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

编译原理课程实验报告

实验2:

语法分析

姓名

院系

软件学院

学号

任课教师

指导教师

实验地点

软件学院三楼机房

实验时间

2016/10/30/星期日

实验课表现

出勤、表现得分

实验报告

得分

实验总分

操作结果得分

一、需求分析

得分

要求:

采用至少一种句法分析技术(LL(1)、SLR(1)、LR

(1)或LALR

(1))对类高级语言中得基本语句进行句法分析。

阐述句法分析系统所要完成得功能。

本语法分析器就是在词法分析器得基础上实现对类高级语言中得基本语句进行句法分析,基本功能如下:

(1)能识别以下几类语句:

Ø声明语句(包括变量声明、数组声明、记录声明与过程声明)

Ø表达式及赋值语句(包括数组元素得引用与赋值)

Ø分支语句:

if_then_else 

Ø循环语句:

do_while

Ø过程调用语句

(2)本语法分析器采用自顶向下得分析技术,能根据导入得文法,自动计算first集与follow集,能够生成每个产生式得select集,并自动生成预测分析表。

(3)本语法分析器具备语法错误处理能力,可以进行错误检测,如果检测到在出错时,采用恐慌模式,能够给出错误提示信息,格式:

错误项错误原因 行号

a)忽略输入中得一些符号,直到输入中出现选定得同步词法单元集合中得某个词法单元,同步集合得选取就是非终结符得follow集;

b)如果终结符在栈顶而不能匹配,弹出此终结符。

c)输入栈中缺少某些应有得符号,比如只有右括号没有左括号等,会给出相应得提示。

(4)系统得输入形式多样:

可以通过文件导入文法与测试用例,可以通过用户界面显示并编辑测试用例。

测试用例涵盖了第

(1)条中列出得各种类型得语句,并设置了一些语法错误。

(5)系统得输出分为两部分:

一部分就是打印输出语法分析器得FIRST集、FOLLOW集、select集与LL

(1)分析表。

另一部分就是打印输出语法分析结果。

 (6)本系统还实现了输出语法分析树得功能,让语法分析得过程更清晰。

二、文法设计

得分

要求:

给出如下语言成分得文法描述。

Ø声明语句(包括变量声明、数组声明、记录声明与过程声明)

Ø表达式及赋值语句(包括数组元素得引用与赋值)

Ø分支语句:

if_then_else

Ø循环语句:

do_while

Ø过程调用语句

  本语法分析器主要针对C语言进行文法设计,下面给出各语言成分得文法描述。

程序入口:

Program—>P

P—>DP//支持连续声明

 P->S P

  P—>ε

1)声明语句:

D→procid; DS| Tid; ﻩ//支持过程声明与变量声明

T→XC |record Dﻩﻩ//支持结构体声明

X→ short|int|long|float|double|char|string//支持多种基本类型得声明

C→[num]C|ε//支持数组得声明

2)表达式及赋值语句:

 S→ id= E;|L=E ;

  E→E+E|E*E|-E |(E)|id|digit |L

L→ id[E] | L[E]//支持数组元素得引用与赋值

3)控制流语句:

ﻩﻩ

S→ifBthenS1elseS2ﻩ|whileB do S1ﻩﻩﻩ

B→B||Bﻩﻩﻩﻩ//或语句

|B &&Bﻩﻩﻩ//且语句

ﻩ|!

Bﻩﻩﻩﻩ//非语句

ﻩ|(B)ﻩﻩﻩﻩ//使用括号

ﻩ|ErelopEﻩﻩﻩ//关系语句

ﻩ|trueﻩﻩﻩ//bool型

ﻩ| falseﻩﻩﻩﻩ//bool型

relop→<|〈= |==| !

=|> |>=ﻩ//关系符号

4)过程调用语句

S→callid (Elist)ﻩﻩ

Elist→Elist,Eﻩﻩﻩﻩﻩ

Elist→Eﻩﻩﻩ

下面给出整个程序得无二义性,无左递归得LL

(1)文法:

Program—〉P

P-〉DP|SP|empty

D—>procT id ( M ) {P}|Tid A;|recordid{P}

M-〉Xid M’

M’->,Xid M'|empty

A->= F|empty|,idA

F->digit|id|char|{G}|string

G->HG’

G'-〉,H G'|empty

H->digit|char

T—>XC

X-〉short|int|long|float|double|char|void|string|boolean

C—>[digit]C|empty

S-〉L=E;|ifB thenSelseS|whileB doS|callid( Elist);|returnE;

E-〉— E E'|( E)E’|digit E'|LE’|string E’

E'—>+EE’|*EE'|empty

L->id L'

L'->[digit ] L'|empty

B—>!

BB'|(B)B'|ErelopEB'|trueB’|false B’

B'->orBB'|andBB’|empty

relop->〈|<=|==|!

=|〉|>=

Elist-〉EElist’

Elist'-〉, E Elist’|empty

 注:

此处用empty代表空

三、系统设计

得分

要求:

分为系统概要设计与系统详细设计。

(1)系统概要设计:

给出必要得系统宏观层面设计图,如系统框架图、数据流图、功能模块结构图等以及相应得文字说明.

1)系统得数据流图:

说明

说明:

本语法分析器就是基于上一个实验词法分析器得基础上,通过在界面写或者就是导入源程序,词法分析器将源程序识别得词法单元传递给语法分析器,语法分析器验证这个词法单元组成得串就是否可以由源语言得文法生成,能够输出语法分析得结果,文法得first集、follow集与预测分析表,当然也可以以易于理解得方式报告语法错误。

2)系统框架图

本系统框架主要就是三部分,一部分就是词法分析,负责识别源程序得词法单元识别,并将其存储,以供语法分析时读取;第二部分就是文法分析部分,负责将导入得文法进行分析,得出文法得first集与follow集,以及自动构造出预测分析表,在语法分析时进行查询;第三部分就是用户界面,提供源程序输入功能,以及语法分析结果得显示,显示语法分析树,还有first集、follow集与预测分析表得展示。

(2)系统详细设计:

对如下工作进行展开描述

✓核心数据结构得设计

核心数据结构主要有两种:

1)Tuple三元组

为了存储预测分析表,我使用Tuple〈string,string,string>三元组得数据结构,分别存储产生式得头部,产生式体,输入符号。

2)Stack栈

为了能够在语法分析时根据预测分析表来进行分析,我写了一个CStack得类用来实现栈得数据结构,在进行语法分析时,一个栈用来存储文法符号,一个栈用来存储输入符号,然后根据预测分析表进行语法分析。

✓主要功能函数说明

主要功能函数:

1)IDContent类:

功能:

充当符号表得角色,主要就是用来保存关键字,运算符,界符,转义字符等各类单词.

主要函数:

boolisConstCh(stringstr)//判断就是否转义字符

bool isLetter_(charc)//判断就是否字母或下划线

boolisDigit(charc)//判断就是否数字

boolisBlank(charc)//判断就是否就是空格、制表符、换行、回车

boolisKeyWord(stringstr)//判断就是否关键字

boolisBoundary(char c)// 判断就是否就是边界符号

bool isOperator(stringch)//判断就是否运算符

2)Identifier类

功能:

识别单词得核心类

主要函数:

stringisID(stringstr,refinti)//就是否就是标识符

stringisSixteen(stringstr, refinti,outboolright)//就是否16进制数

string isEight(stringstr,refinti,out bool right)//就是否8进制数

stringisNumber(stringstr, refinti,outboolright)//就是否就是常数

stringisOperator(string str, refinti,outboolright)//就是否就是运算符

stringisNote(string str,refint i,outboolright)//就是否注释

stringisBoundary(stringstr,refinti,outbool right)//就是否界符

stringisChar(stringstr,refinti,outboolright)//就是否字符常数

3)FirstAndFollow类

功能:

得到first集、follow集、select集、预测分析表

publicvoid getFirstCollection()//得到first集合

publicvoidgetFollowCollection()//得到follow集合

publicvoidgetSelectCollection()//得到预测分析表

publicvoidgetAnalysisTable(stringstr1,stringstr2,stringstr3)//得到预测分析表

publicvoiderrorHandle()//加入同步词法单元

4)CStack类

功能:

栈结构

public boolisEmpty()//判断栈就是否为空

publicvoidpush(object item)//往栈中加入一个元素

publicobjectpop()//从栈中弹出一个元素

public objectpeek()//返回栈顶对象

5)Form类

public voidanalysis(stringstr)//词法单元识别

public voidparse()//语法单元识别

privatevoid导入文法ToolStripMenuItem_Click(object sender,EventArgse)//导入文法

privatevoid 显示语法分析树ToolStripMenuItem_Click(objectsender, EventArgse)//输出语法分析树

privatevoidaddListview1Item()//输出first集与follow集

privatevoidaddListview3Item()//输出预测分析表

✓程序核心部分得程序流程图

语法分析核心部分流程图:

 

 

四、系统实现及结果分析

得分

要求:

对如下内容展开描述.

(1)系统实现过程中遇到得问题;

实现过程中主要遇到得问题有:

1)如何修改文法使其时LL

(1)文法

通过对文法得修改,主要就是对文法消除左递归,消除二义性,以及提取公因式等,最终对于相同左部得产生式她们得select集不相交,得到了LL(1)文法。

    2)如何得到文法符号得first集

     对于终结符,其first集就就是本身,但就是对非终结符,在遍历得时候依赖于其她得非终结符,于就是我采用循环遍历得方法,如果当前某个非终结符得first集依赖于其她非终结符,且其她非终结符得first集还没有求出来,则跳过当前得非终结符求下一个非终结符得first集,直到其依赖得非终结符得first集求出来后再求解.直到所有得非终结符得first集求出来后,循环结束,就得到了所有文法符号得first集合。

 3)如何得到非终结符得follow集

    为了使思路清晰,我采用两遍遍历得方式来求非终结符得follow集。

   第一遍之后,所有非终结符都将得到一个暂时得follow集(不就是最终得follow集),第二遍得目标就就是发现其中就是否有非终结符得follow集发生了改变,如果改变,则继续遍历整个文法,直到没有新得符号加入follow集中。

求follow集得具体思想就就是:

不断应用下列规则,直到没有新得终结符可以被加入到任何FOLLOW集合中为止

Ø将$放入FOLLOW( S)中,其中S就是开始符号,$就是输入右端得结束标记

Ø如果存在一个产生式A→αBβ,那么FIRST (β)中除ε 之外得所有符号都在FOLLOW(B )中

Ø如果存在一个产生式A→αB,或存在产生式A→αBβ且FIRST(β) 包含ε,那么FOLLOW( A)中得所有符号都在FOLLOW( B )中

    4)如何根据预测分析表进行语法分析

    这里主要依赖于栈得结构,将经过词法分析得到得词法单元压入输入栈,将文法起始符号压入文法栈,然后根据预测分析表得到各个产生式进行语法分析。

(2)输出该句法分析器得分析表;

因为预测分析表实在就是过于庞大,因此本处分段截取预测分析表,下面得表就是接在上面表得右侧。

(3)针对一测试程序输出其句法分析结果;

测试程序:

语法分析结果:

语法分析树:

(4)输出针对此测试程序对应得语法错误报告;

带错误得测试程序:

语法错误报告:

(5)对实验结果进行分析。

总结:

本语法分析器具有强大得语法分析功能

●允许变量得连续声明,比如inta,b,c;

●允许声明得同时赋值,比如string c=“您好”;

●允许对数组得声明与引用,同时进行赋值,比如char[4]a={‘a’,'b','c’,’d’};a[0]=‘m’;

●支持多种类型得声明与赋值,比如int,short,long,flaot,double,char,string,boolean得声明与赋值;

●允许声明与使用一个过程函数,比如:

/*过程声明,声明一个求两个整数与得函数*/

procint addSum(inta,intb)

{int c,d;

c=a;/*变量之间得赋值*/

 d=b;

returnc+d;/*支持返回值以表达式得形式*/

calladdSum(1,2);/*函数调用功能*/

●允许声明一种数据结构,比如:

/*记录声明*/

recordstack{

 inta;/*表示位置*/

charc;/*表示取值*/

强大得错误处理能力:

●能够识别非法字符,如:

中文,中文得标点符号;

●能够弹出多于得输入字符,如:

inta= 1*;

●能够处理词法单元得错误,比如:

错误得16进制数,错误得字符串,错误得字符常数,错误得常数,错误得注释,错误得8进制等;

●能够判断就是否缺少分量,比如:

inta /*此处缺少分号*/,能够给出提示缺少分号;

●能够进行括号得匹配等,比如:

只有左括号无右括号,只有右括号无左括号等,都能进行识别与提醒;

●在栈顶得输入符号与文法栈中得符号不匹配时能够根据同步词法单元来弹出非终结符等,继续进行语法分析;

●当连续不匹配出现错误时,比如某一行连续错误,能够在下一行重新开始语法分析,避免因为某一行得连续错误导致语法分析停止。

注:

其中得测试样例需先用已编写得词法分析程序进行处理。

指导教师评语:

日期:

      

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1