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

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

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

-

班级:XXX

学号:XXX

姓名:XXX

年月日

1、摘要:

用递归子程序法实现对pascal的子集程序设计语言的分析程序

2、实验目的:

通过完成语法分析程序,了解语法分析的过程和作用

3、任务概述

实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用

4、实验依据的原理

递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,程序能够按LL(1)形式唯一地确定选择某个候选式进行推导,最终识别输入串是否与文法匹配。

递归子程序法的缺点是:对文法要求高,必须满足LL(1)文法,当然在某些语言中个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还是许多高级语言,例如PASCAL,C等编译系统常常采用的语法分析方法。

为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的,,,如下:

<程序>?<程序首部><分程序>。

<程序首部>?PROGRAM标识符;

<分程序>?<常量说明部分><变量说明部分><过程说明部分> <复合语句> <常量说明部分>?CONST<常量定义><常量定义后缀>;|ε

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

<常量定义后缀>?,<常量定义><常量定义后缀> |ε

<变量说明部分>?VAR<变量定义><变量定义后缀> |ε

<变量定义>?标识符<标识符后缀>:<类型>;

<标识符后缀>?,标识符<标识符后缀> |ε

<变量定义后缀>?<变量定义><变量定义后缀> |ε

<类型>?INTEGER | LONG

<过程说明部分>?<过程首部><分程序>;<过程说明部分后缀>|ε

<过程首部>?PROCEDURE标识符<参数部分>;

<参数部分>?(标识符: <类型>)|ε

<过程说明部分后缀>?<过程首部><分程序>;<过程说明部分后缀>|ε

<语句>?<赋值或调用语句>|<条件语句>|<当型循环语句>|<读语句>

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

<赋值或调用语句>?标识符<后缀>

<后缀>?:=<表达式>|(<表达式>)|ε

<条件语句>?IF<条件>THEN<语句>

<当型循环语句>?WHILE<条件>DO <语句>

<读语句>?READ(标识符<标识符后缀>)

<写语句>?WRITE(<表达式><表达式后缀>)

<表达式后缀>?,<表过式><表达式后缀>|ε

<复合语句>?BEGIN<语句><语句后缀>END

<语句后缀>?;<语句><语句后缀>|ε

<条件>?<表达式><关系运算符><表达式>|ODD<表达式>

<表达式>?+<项><项后缀>|-<项><项后缀>|<项><项后缀>

<项后缀>?<加型运算符><项><项后缀>|ε

<项>?<因子><因子后缀>

<因子后缀>?<乘型运算符><因子><因子后缀>|e

<因子>?标识符|无符号整数|(<表达式>)

<加型运算符>?+|-

<乘型运算型>?*|/

<关系运算符>? =|<>|<|<=|>|>=

5、程序设计思想

为每个非终结符设计一个识别的子程序,寻找该非终结符也就是调用相应的子程

序。由于单词在语法分析中作为一个整体,故在语法识别中仅使用其内码。在这里将

词法分析作为语法分析的一个子程序,当语法分析需要单词时,就调用相应的词法分

析程序获得一个单词。语法分析的作用是识别输入符号串是否是文法上定义的句子,

即判断输入符号串是否是满足“程序”定义的要求。也就是当语法识别程序从正常退

出表示输入符号串是正确的“程序”;若从出错退出,则输入符号串不是正确

的“程序”。

出错时,可以根据读字符的位置判断出错的位置。表2-1为非终结符和函数名对照表。

表2-1 非终符和函数名对照表

非终结符函数名非终结符函数名 <程序> <程序首部> program proghead <分程序> <常量说明部分> block consexpl <常量定义> <变量说明部分> consdefi varexl <常量定义后缀> <变量定义> conssuff vandefi <变量定义后缀> <>过程说明部分> varsuff procdefi <类型> <过程首部> typeil procedh <过程说明部分后缀> <赋值或调用语句> procsuff assipro <语句> <后缀> sentence suffix <条件语句> <读语句> ifsent read <当型循环语句> <标识符后缀> whilsent idsuff <写语句> <复合语句> write compsent <表达式后缀> <语句后缀> exprsuff sentsuff <条件> <项后缀> conditio termsuff <表达式> <项> express term <因子后缀> <参数部分> factsuff argument <因子> <加型运算符> factor addoper <乘型运算符> <关系运算符> muloper respoper 表2-2为词法分析中的内码单词对照表。

表2-2 内部码对照表

内码单词内码单词内码单词内码单词 1 PROGRAM 2 CONST 3 VAR 4 INTEGER 5 LONG 6 PROCEDURE 7 IF 8 THEN 9 WHILE 10 DO 11 READ 12 WRITE 13 BEGIN 14 END 15 ODD 16 + 17 - 18 * 19 / 20 = 21 <> 22 < 23 <= 24 > 25 >= 26 . 27 , 28 ; 29 : 30 := 31 ( 32 )

无符号整数标识符 33 34 35 #

6、实验结果分析

样例1:正确的pascal子集程序代码

相关文档
最新文档