编写语法分析程序

  • 格式:docx
  • 大小:46.84 KB
  • 文档页数:12

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告

课程名称:编译原理项目名称:编写语法分析程序

姓名:专业:计算机科学与技术班级:2011级学号:2

同组成员

一、实验预习部分1:

1、实验环境准备:

软件环境:visual C++ 6.0

硬件环境:计算机一台

2、实验所需知识点准备:

语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC,等工具自动生成。

程序的结构通常是由递归规则表示的,我们可以用下面的规则来定义表达式:

(1)任何标识符是表达式;

(2)任何常数是表达式‘

(3)若表达式1和表达式2都是表达式,那么

表达式1+表达式2

表达式1*表达式2

(表达式1)

都是表达式

类似,语句也可以递归地定义,如;

(1)标识符:=表达式是语句;

(2)while(表达式)do 语句和

If (表达式) then 语句 else 语句都是语句。

1注:1、实验预习部分包括实验环境准备和实验所需知识点准备。

2、若是单人单组实验,同组成员填无。

二、实验过程记录2:

1、实验目的:

(1)语法分析和语义分析合在一起实现。

(2)把语法分析器设计成一个独立的过程。

(3)给出PL/0文法规范,要求编写PL/0语言的语法分析程序。

2、实验原理:

通过语法分析来实现对程序的编译。

对PL/0语言作如下功能扩充:(1)扩充条件语句的功能使其为:if <条件> then <语

句>[else <语句>]

(2)增加repeat语句,格式为:repeat <语句> {; <语

句>} until <条件>

3、实验步骤:

已给PL/0语言文法,利用递归子程序法,编制语法分析程序,要求将错误信息输出到语法错误文件中,输出语法树。

PL/0语法如下:

<程序>"<分程序>.

<分程序> "[<常量说明>][<变量说明>][<过程说明>]<语句>

<常量说明> "CONST<常量定义>{,<常量定义>};

<常量定义> "<标识符>=<无符号整数>

<无符号整数> " <数字>{<数字>}

<变量说明> "VAR <标识符>{, <标识符>}

<标识符> "<字母>{<字母>|<数字>}

<过程说明> "<过程首部><分程序>{; <过程说明> }

<过程首部> "PROCEDURE <标识符>;

<语句> "<赋值语句>|<条件语句>|<当循环语句>|<过程语句>

|<复合语句>|<读语句><写语句>

<赋值语句> "<标识符>:=<表达式>

2注:实验过程记录要包含实验目的、实验原理、实验步骤,页码不够可自行添加。

<复合语句> "BEGIN <语句> {;<语句> }END

<条件语句> " <表达式> <关系表达式> <表达式> |ODD<表达式>

<表达式> " [+|-]<项>{<加碱运算符> <项>}

还有10条规则构成了PL/0语言,为此文法写一个语法分析器。

CONST A=10;

VAR B,C;

PROCEDURE Q;

VAR X;

BEGIN

READ(X);

B:=X;

WHILE X#0

X:=X-1;

END;

BEGIN

WRITE(A);

CALL Q;

END.

(1)PL/0编译程序结构

语法图

1: 扩充条件的语法图为:

PL/0源程序 词法分析程序

语法分析程序 代码生成程序

表格

管理

程序 出错处理程

目标程序 if 条件 Then alse 语句 语句

2 :扩充repeat 语句的语法图为:

reqeat 语句unitn 条件

递归子程序法:

对于每个非终结符,编写一个子程序,由该子程序负责识别该语法单位是否正确。表达式的文法

〈表达式〉∷=[+|-]〈项〉{(+|-)〈项〉}

〈项〉∷=〈因子〉{(*|/)〈因子〉}

〈因子〉∷=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’

〈表达式〉的递归子程序实现

procedure expr;

begin

if sym in [ plus, minus ] then

begin

getsym; term;

end

else term;

while sym in [plus, minus] do

begin

getsym; term;

end

end;

〈项〉∷=〈因子〉{(*|/)〈因子〉}

〈项〉的递归子程序实现

procedure term;

begin

factor;

while sym in [ times, slash ] do

begin

getsym; factor;

end

end;

〈因子〉∷=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’

〈因子〉的递归子程序实现

procedure factor;

begin

if sym <> ident then

if sym <> number then

if sym = ‘(‘ then