语法分析实验

合集下载

语法分析实验报告

语法分析实验报告

实验2. 语法分析实验报告

一、实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

二、实验要求

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

0、要点回顾

标识符ID=letter(letter| digit)*

整型常数NUM=digit digit *

单词符号及其种别码:

1、待分析的简单语言的语法

用扩充的BNF表示如下:

(1)<程序>::=begin<语句串>end

(2)<语句串>::=<语句>{;<语句>}

(3)<语句>::=<赋值语句>

(4)<赋值语句>::=ID:=<表达式>

(5)<表达式>::=<项>{+<项>|-<项>}

(6)<项>::=<因子>{*<因子>|/<因子>}

(7)<因子>::=ID| NUM|(<表达式>)

2、实验要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

三、源程序代码

#include<stdio.h>

#include<string>

#include<iostream>

using namespace std;

char prog[80];//缓冲区

int p=0;//缓冲区prog的指针

编译原理 实验

编译原理 实验

编译原理实验

编译原理实验。

编译原理是计算机科学中的一个重要领域,它研究的是编译器的设计和实现原理。编译器是将高级语言代码转换成机器语言代码的程序,它在软件开发过程中起着至关重要的作用。而编译原理实验则是帮助学生深入理解编译原理的重要手段之一,通过实际操作来加深对编译原理知识的理解和掌握。

在编译原理实验中,我们需要掌握以下几个关键点:

1. 词法分析,词法分析是编译过程中的第一步,它负责将源代码分割成一个个的单词(Token)。在词法分析实验中,我们需要实现一个词法分析器,能够正确地识别出源代码中的各种单词,并进行分类和标记。

2. 语法分析,语法分析是编译过程中的第二步,它负责将词法分析得到的单词序列转换成抽象语法树。在语法分析实验中,我们需要实现一个语法分析器,能够根据给定的文法规则,将单词序列转换成抽象语法树,并进行语法检查。

3. 语义分析,语义分析是编译过程中的第三步,它负责对抽象语法树进行语义检查和翻译。在语义分析实验中,我们需要实现一个语义分析器,能够对抽象语法树进行类型检查、作用域分析等,并生成中间代码。

4. 代码生成,代码生成是编译过程中的最后一步,它负责将中间代码转换成目标机器代码。在代码生成实验中,我们需要实现一个代码生成器,能够将中间代码转换成目标机器代码,并进行优化。

通过以上实验,我们可以深入理解编译原理的各个环节,并掌握编译器的设计和实现原理。同时,实验过程中还能培养我们的动手能力和解决问题的能力,为今后的软件开发打下坚实的基础。

总之,编译原理实验是非常重要的,它能够帮助我们深入理解编译原理知识,提高我们的动手能力和解决问题的能力。希望大家能够认真对待编译原理实验,从中获得更多的收获和成长。

实验2 应用预测分析法实现语法分析

实验2  应用预测分析法实现语法分析

实验2 应用预测分析法LL(1)实现语法分析

一、实验目的

1.学习消除文法左递归算法。

2.掌握预测分析法实现语法分析。

3.自动求得“FIRST”、“FOLLOW”集构造预测分析表。

3.能够使用自己编写的分析程序对简单的程序段进行语法翻译。

二、实验内容

用预测分析法编制语法分析程序,实现可以采用任何一种编程工具。候选题目见表一。

表 1 语法分析单元的候选实验题目

三、实验要求

1.定义目标语言的语法规则。

2.预测分析表的构造。

3*.对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程。

四、实验学时

4 学时

五、考核要求:

以班为单位,每个班内4-5 人为一组,自由组合。选一人为组长,要适当分工,要分工明确。

需上交:源程序,实验报告。实验报告只用交电子档,重点写自己那部分的设计思路和实现方法。发qq 邮箱:823004751。

六、实验内容指导

1.文法的表示

可以采用字符串数组的形式表示文法中的各项,其优点在于操作相当直观,缺点是当项目较多时,需要较多的检索时间。

2.消除文法左递归核心算法框架如下:

For each v N in Grammer

For each item which started by v N’ (v N’ has been operated)

If has v N->v N’a then

Replace all v N with v N’->beta

Endif

End for

If(v N has left recursive)

Find new sign v N New

PL0语言语法分析器实验报告

PL0语言语法分析器实验报告

PL0语言语法分析器实验报告

一、引言

编译器是一种用于把高级语言程序转换成机器可执行代码的软件工具。编译器由多个组件构成,其中语法分析器是编译器中的重要组成部分,其

主要功能是对输入的源代码进行解析,并生成一个语法树。本实验旨在通

过使用BNF(巴科斯范式)描述PL0语言的语法规则,并通过实现PL0语

言的语法分析器,来深入理解语法分析的原理和过程。

二、PL0语言的语法规则

1.程序结构:

<程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>

2.常量说明部分:

<常量说明部分> ::= const <常量定义> { , <常量定义> };

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

3.变量说明部分:

<变量说明部分> ::= var <标识符> { , <标识符> };

4.过程说明部分:

<过程说明部分>::=<过程首部><分程序>;

<过程首部> ::= procedure <标识符> ;

5.语句:

<语句> ::= <赋值语句> , <if语句> , <while语句> , <调用语句> , <复合语句> , <读语句> , <写语句> , <空>

国开电大 编译原理 实验4:语法分析实验报告

国开电大 编译原理 实验4:语法分析实验报告

国开电大编译原理实验4:语法分析实

验报告

1. 实验目的

本实验的目的是研究和掌握语法分析的原理和实现方法。

2. 实验内容

本次实验主要包括以下内容:

- 设计并实现自顶向下的LL(1)语法分析器;

- 通过语法分析器对给定的输入串进行分析,并输出相应的分析过程;

- 编写测试用例,验证语法分析器的正确性。

3. 实验步骤

3.1 设计LL(1)文法

首先,根据实验要求和给定的语法规则,设计LL(1)文法。

3.2 构建预测分析表

根据所设计的LL(1)文法,构建预测分析表。

3.3 实现LL(1)语法分析器

根据预测分析表,实现自顶向下的LL(1)语法分析器。

3.4 对输入串进行分析

编写程序,通过LL(1)语法分析器对给定的输入串进行分析,并输出相应的分析过程和结果。

3.5 验证语法分析器的正确性

设计多组测试用例,包括正确的语法串和错误的语法串,验证语法分析器的正确性和容错性。

4. 实验结果

经过实验,我们成功设计并实现了自顶向下的LL(1)语法分析器,并对给定的输入串进行了分析。实验结果表明该语法分析器具有较好的准确性和容错性。

5. 实验总结

通过本次实验,我们对语法分析的原理和实现方法有了更深入的了解。同时,我们也学会了如何设计并实现自顶向下的LL(1)语

法分析器,并验证了其正确性和容错性。这对于进一步研究编译原理和深入理解编程语言的语法结构具有重要意义。

6. 参考资料

- 《编译原理与技术》

- 课程实验文档及代码

实验5---语法分析器(自下而上):LR(1)分析法

实验5---语法分析器(自下而上):LR(1)分析法

实验5---语法分析器(自下而上):LR(1)分析法

一、实验目的

构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。

二、实验内容

程序输入/输出示例(以下仅供参考):

对下列文法,用LR(1)分析法对任意输入的符号串进行分析:

(1)E->E+T

(2)E->E—T

(3)T->T*F

(4)T->T/F

(5)F-> (E)

(6)F->i

输出的格式如下:

(1)LR(1)分析程序,编制人:姓名,学号,班级

(2)输入一个以#结束的符号串(包括+—*/()i#):在此位置输入符号串

(3)输出过程如下:

3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照。

三、实验方法

1.实验采用C++程序语言进行设计,文法写入程序中,用户可以自定义输入语句;

2.实验开发工具为DEV C++。

四、实验步骤

1.定义LR(1)分析法实验设计思想及算法

①若ACTION[sm , ai] = s则将s移进状态栈,并把输入符号加入符号栈,则三元式变成为:(s0s1…sm s , #X1X2…Xm ai , ai+1…an#);

②若ACTION[sm , ai] = rj则将第j个产生式A->β进行归约。此时三元式变为(s0s1…sm-r s , #X1X2…Xm-rA , aiai+1…an#);

实验三 LR(1)分析表语法分析报告

实验三 LR(1)分析表语法分析报告

学生实验报告

(理工类)

课程名称:编译原理专业班级:08计算机科学与技术(单)本所属院部:信息技术学院指导教师:洪蕾

20 10 ——20 11 学年第二学期

金陵科技学院教务处制

实验报告书写要求

实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。

实验报告书写说明

实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。

填写注意事项

(1)细致观察,及时、准确、如实记录。

(2)准确说明,层次清晰。

(3)尽量采用专用术语来说明事物。

(4)外文、符号、公式要准确,应使用统一规定的名词和符号。

(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。

实验报告批改说明

实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。

实验报告装订要求

实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。

实验项目名称: LR(1)分析表语法分析实验学时: 6 同组学生姓名:无实验地点: B513 实验日期: 2011.4.7/4.21 实验成绩:

批改教师:批改时间:

一、实验目的和要求

语法分析主要目的是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成作准备.语法分析程序在分析过程中检查符号串是否为该程序的句子.若是则输出该句子的分析树,否则就表示源程序存在语法错误,并报告错误的性质与位置.

编译原理实验词法分析器与语法分析器实现

编译原理实验词法分析器与语法分析器实现

编译原理实验词法分析器与语法分析器实现词法分析器与语法分析器是编译器的两个重要组成部分,它们在编译过程中扮演着至关重要的角色。词法分析器负责将源代码转化为一个个标记(token)序列,而语法分析器则根据词法分析器生成的标记序列构建语法树,验证源代码的语法正确性。本实验旨在实现一个简单的词法分析器和语法分析器。

实验一:词法分析器实现

在实现词法分析器之前,需要定义所需词法项的规则。以C语言为例,常见的词法项包括关键字(如int、if、for等)、标识符、运算符(如+、-、*、/等)、常量(如整数、浮点数等)和分隔符(如括号、逗号等)。接下来,我们来实现一个简单的C语言词法分析器。

1. 定义词法项的规则

在C语言中,关键字和标识符由字母、数字和下划线组成,且首字符不能为数字。运算符包括各种数学运算符和逻辑运算符。常量包括整数和浮点数。分隔符包括括号、逗号等。

2. 实现词法分析器的代码

下面是一个简单的C语言词法分析器的实现代码:

```python

def lexer(source_code):

keywords = ['int', 'if', 'for'] # 关键字列表

operators = ['+', '-', '*', '/'] # 运算符列表

separators = ['(', ')', '{', '}', ',', ';'] # 分隔符列表

tokens = [] # 标记序列列表

current_token = '' # 当前标记

for char in source_code:

if char.isspace(): # 如果是空格,则忽略

语义分析——精选推荐

语义分析——精选推荐

语义分析

实验四、语法分析实验

⼀、实验⽬的

(1)编制⼀个语义分析程序

(2)语义分析程序是在语法分析程序的基础上进⾏编写的,主要任务是根据语法分析来插⼊中间代码、语义规则以及⽣成四元式。(3)通过语义分析的练习,能够进⼀步了解编译原理。

(4)通过了解语义分析程序的设计原则、语义规则的描述技术、识别机制及语义分析程序的⾃动构造原理。

⼆、实验内容和要求

(1)根据语法分析程序进⾏改写语义分析程序

(2)根据语⾔的语义规则,插⼊中间代码、语义规则以及⽣成四元式等

(3)并在分析过程中进⾏语义检查,四元式作为输出或以某种形式的语法树作报告错误

三、实验⽅法、步骤及结果测试

1、实验⽅法、步骤:

完成静态语义审查和处理

a) 上下⽂相关性审查

b) 类型匹配审查

c) 类型转换

d) 如:s:=2*3.1416*r*(h+r);

i. 赋值语句的语义:计算赋值符号右边表达式的值,送到赋值号左边的变量中。

ii. 检查赋值号左右两边的类型是否匹配

iii. 根据赋值语句的语义,将它翻译成四元式中间代码

2、原理分析:我是在语法分析程序的基础上进⾏修改的,是根据语法分析来插⼊中间代码、制定语义规则以及⽣成四元式。

void S(){

char y=str[t-1];int x;

if(syn==10){

scaner();

if(syn==18){

scaner(); x=E();printf("\n(':=',%d, ,%c)\n",x,y);

}

}

}

int E(){

int x;printf("E ");

x=T();return E1(x);

实验5-LL(1)语法分析程序的设计与实现(C语言)

实验5-LL(1)语法分析程序的设计与实现(C语言)

实验五LL(1)文法识别程序设计

一、实验目的

通过LL(1)文法识别程序的设计理解自顶向下的语法分析思想。

二、实验重难点

FIRST集合、FOLLOW集合、SELECT集合元素的求解,预测分析表的构造。

三、实验内容与要求

实验内容:

1.阅读并理解实验案例中LL(1)文法判别的程序实现;

2.参考实验案例,完成简单的LL(1)文法判别程序设计。

四、实验学时

4课时

五、实验设备与环境

C语言编译环境

六、实验案例

1.实验要求

参考教材93页预测分析方法,94页图5.11 预测分析程序框图,编写表达式文法的识别程序。要求对输入的LL(1)文法字符串,程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。

表达式文法为:

E→E+T|T

T→T*F|F

F→i|(E)

2.参考代码

为了更好的理解代码,建议将图5.11做如下标注:/* 程序名称: LL(1)语法分析程序 */

/* E->E+T|T */

/* T->T*F|F */

/* F->(E)|i */

/*目的: 对输入LL(1)文法字符串,本程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。

/********************************************/

/* 程序相关说明 */

/* A=E' B=T' */

/* 预测分析表中列号、行号 */

/* 0=E 1=E' 2=T 3=T' 4=F */

/* 0=i 1=+ 2=* 3=( 4=) 5=# */

/************************************/

语法分析实验报告

语法分析实验报告

语法分析实验报告

最近,许多研究者开始着手解决语法分析的自动化问题,该领域的关键技术是

实现自动语法分析的过程。本文主要报告了语法分析的实验过程,主要从语料库的构建、语法分析工具的使用、语法分析的主要求解步骤等三方面进行总结和分析。

首先,语料库的构建是语法分析实验的前提和基础,为了得到可靠的实验数据,选择了足够多的真实句子作为语料库,并采用关键字索引法,将这些真实句子根据句法结构归类记录,最后编码成计算机语言,以便由计算机来解析语料。

其次,在语法分析实验中,采用了深度学习技术,运用各种语言模型、解析器

和编辑器,实现了自动语法分析的功能,其中也包括了一些传统的机器学习算法,例如隐马尔科夫模型(HMM)和句法分析算法(CFG)等等。

最后,介绍了语法分析的主要求解步骤,即确定句子里包含的单词以及其彼此

之间的句法关系,具体的求解过程可以分为两步:归结和结合。首先,对句子中的每个单词进行词性标注,然后根据句子的语法规则,利用归结法自定义的规则,判定句子的句法结构。接下来,利用结合法,根据句法结构建立起语句的句法树,最后得到句法分析的结果。

综上所述,本文主要报告了语法分析实验,从构建语料库、使用语法分析工具、语法分析的主要求解步骤三个方面进行了详细介绍,以实现自动语法分析的功能。在现有技术水平下,语法分析仍然是机器翻译、自然语言处理和智能聊天机器人等人工智能领域中非常关键的一环。

编译原理——语法分析程序设计实验报告

编译原理——语法分析程序设计实验报告

实验二语法分析程序设计

[实验目的]:

1.了解语法分析的主要任务。

2.熟悉编译程序的编制。

[实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。

[实验要求]:

1.选择一个文法,进行实验,可选的文法包括以下三个:

P190 4.8

P190 4.9

P190 4.10

2.设计语法分析程序的输出形式(输出应为语法树或推导),一个可以参考的

例子,可见图1。

3.编写递归下降语法分析程序(参考P148-149 Topdown parsing by

recursive-descent),实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法句子。实验报告中要说明分析使用的方法。

4.根据所作业题选项e所给出的input,生成并输出分析过程中所用的产生式

序列(show the actions of parser):

1 产生式1

2 产生式2

……

5.自已设计一个不合法的句子,作为输出进行分析,给出结果。

[实验过程]

本次实验选择的文法为P190 4.8

lexp->atom|list

atom->number|identifier

list->(lexp-seq)

lexp-seq->lexp lexp-seq

1.写出实现的算法,并画流程图。

本次实验采用递归下降算法,算法流程图如下图1-1:

图1-1 算法流程图

2.根据你选择的文法,分析左递归或左因子是否会影响本算法的结果。

会影响本算法的结果。递归下降分析法要求的文法是LL(1)文法,需要消除左递归和左因子的影响。如果存在左因子,对相同的字符跳转到不同的函数,无法实现递归。

LL1语法分析实验报告

LL1语法分析实验报告

LL(1)语法分析

一,实验名称:

实现LL分析。

二,实验要求:

➢输入任意文法

➢消除左递归

➢消除左因子

➢测试任意输入语句是否合法

➢数据结构描述

➢算法说明

➢输出first集合

➢输出follow集合

➢输出LL(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。

编译原理实验范文

编译原理实验范文

编译原理实验范文

编译原理实验是计算机科学与技术专业的一门重要的实践课程,通过

实验学习可以深入理解编译原理的核心概念和算法,并且提高编程能力。

本文将围绕编译原理实验展开,从实验的重要性、实验内容、实验过程和

实验收获等方面进行详细介绍。

首先,编译原理实验是计算机科学与技术专业的重要实践课程之一、

编译原理是计算机科学领域的基础学科,研究的是如何将高级程序语言翻

译成可执行的机器语言。编译原理实验通过实际操作来加深学生对编译原

理的理解,使他们能够更好地掌握相关的算法和工具,提高编程能力。

其次,编译原理实验的内容主要包括词法分析、语法分析、语义分析

和代码生成等方面。在词法分析实验中,学生需要实现一个词法分析器,

可以根据给定的词法规则将源代码分解为记号流。在语法分析实验中,学

生需要编写一个语法分析器,可以根据给定的文法将记号流解析为语法树。在语义分析实验中,学生需要实现一个语义分析器,可以为语法树附加语

义信息。在代码生成实验中,学生需要将语义树转化为可执行的目标代码。

在进行编译原理实验的过程中,学生需要按照课程要求完成相应的实

验任务。首先,学生需要独立思考并理解实验的目标和要求。其次,学生

需要进行相关的实验准备工作,包括学习相关的算法和工具,并熟悉实验

环境。然后,学生需要按照实验要求编写程序,并运行程序进行测试。最后,学生需要对实验结果进行分析,总结经验教训,并撰写实验报告。

通过编译原理实验,学生可以获得很多收获。首先,实验可以帮助学

生深入理解编译原理的核心概念和算法,提高他们的专业知识水平。其次,

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

编译原理语法分析实验报告
112: statement -> epresion_stmt|compound_stmt
|selection_stmt|iteration_stmt|return_stmt
113: expression_stmt -> expression;|;
114: selection_stmt -> if{expression)statement
因为递归下降要求文法中不能出现有左递归的产生式,因此必须把待分析的C语言子集的语法中带有左递归的都消除左递归。其中产生式101、110、111、121、123、128均为左递归文法。
这些产生式消除左递归后的文法如下:
1)101消除左递归后的产生式分别为:
101: declaration_list -> declaration declaration_list_zdg
105: fun_declaration -> type_specifier ID (params)|compound_stmt
106: params -> params_list|void
107: param_list ->param_list,param|param
108: param -> type-spectifier ID|type_specifier ID[]
|if(expression)statement else statement

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

编译原理实验二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)|i

A→+|-

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:

用pair来存储单个二元组。该对照表由专题1定义。

map:

存储离散化后的终结符和非终结符。

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

一、实验目的及内容

实现下述我们定义的语言的语法分析器

这种语言的程序结构很简单,语法相当于c的函数体,即由一对大括号括起来的语句序列,没有过程或函数。声明语句、表达式语句及控制语句的写法都与c 类似,但规定:一条声明语句只能声明一个整型变量,没有数组;控制语句只是if、for和while三个语句,这三个语句本身也可以包含语句序列;表达式仅局限于布尔表达式和整型算术表达式,布尔表达式由对两个算术表达式的比较组成,该比较使用<,>,<=,>=,= =,!=比较运算符;算术表达式可以包括整型常数、变量以及+,-,*,/这四个运算符。另外,还可以有复合语句。用read和write语句实现输入输出。注释用/*和*/括起来,但注释不能嵌套。

二、实验原理及基本技术路线图(方框原理图或程序流程图)

实验所用的产生式:

<程序> →‘{’ <声明序列> <语句序列> ‘}’

<声明序列> → <声明语句> { <声明语句> }

<声明语句> → int <标志符>;

<语句序列> → <语句> { <语句> }

<语句> → | | | | | <复合语句> | <表达式语句>

→ if (<表达式>) <语句> [ else <语句> ]

→ while (<表达式>) <语句>

→ for (<表达式>;<表达式>;<表达式>) <语句>

→ read <标识符>;

→ write <表达式>;

<复合语句> →‘{ ’ <语句序列>‘ }’

<表达式语句> → <表达式>; | ;

<表达式> → <布尔表达式> | <标志符> = <布尔表达式>

<布尔表达式> → <算术表达式> | <算术表达式> ( > | < | >= | <= | == | !=)

<算术表达式>

<算术表达式> → <项> { ( + | - ) <项> }

<项> → <因子> { ( * | / ) <因子> }

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

实验中自定义的函数:

int parse();语法分析主函数

int program();<程序>

int statement();<语句>

int expression_stat();<表达式语句>

int expression();<表达式>

int bool_expr();<布尔表达式>

int additive_expr();<算术表达式>

int term();<项>

int factor();<因子>

int if_stat();

int while_stat();

int for_stat();

int write_stat();

int read_stat();

int declaration_stat();<声明语句>

int declaration_list();<声明序列>

int statement_list();<语句序列>

int compound_stat();<复合语句>

三、所用仪器、材料(设备名称、型号、规格等或使用软件)

开发环境/平台:vc++6.0

实验器材:兼容计算机一台

四、实验方法、步骤(或:程序代码或操作过程)

实验源代码:

#include

#include

#include

#include

int parse();

int program();

int statement();

int expression_stat();

int expression();

int bool_expr();

int additive_expr();

int term();

int factor();

int if_stat();

int while_stat();

int for_stat();

int write_stat();

int read_stat();

int declaration_stat();

int declaration_list();

int statement_list();

int compound_stat();

char token[20],token1[40];//token保存单词符号,token1保存单词值char Scanout[300]; //保存词法分析输出文件名

long count=0;

FILE *fp; //用于指向输入输出文件的指针

void main()

{

strcpy(Scanout,"输出.txt");

parse();

}

//语法分析程序

int parse()

{

int es=0;

if((fp=fopen(Scanout,"r"))==NULL)

{

printf("\n打开%s错误!\n",Scanout);

es=10;

}

if (es==0) es=program();

printf("=====语法分析结果!======\n");

相关文档
最新文档