编译原理报告 (2)

合集下载

编译原理语法分析实验2

编译原理语法分析实验2

曲阜师范大学实验报告

No. 2008145640

计算机系09 年级软件工程2 班组日期2010-9-19 姓名邱玉梅同组者姓名

课程编译原理成绩教师签章

实验名称:词法分析实验

一、实验目的:

1.掌握词法分析的原理

2.熟悉保留字表等相关数据结构与单词的分类方法。

3.掌握词法分析器的设计与调试方法。

二、实验内容:

根据编译中的分词原理,编写一个词法分析程序:

1.输入:任意一个C语言程序的源代码。

2.处理:对输入进行分析,分析出保留字、标识符、常量、算符和界符。

3.输出:对应的二元式(种别编码自定,可暂定为一类对应一个编码)。

三、实验要求:

1.人选C/C++/Java中的一种高级语言程序完成词法分析器

2.词法分析器应以教材所述分词原理为依据,使用恰当的数据结构和方法,结构清晰、

高效

四、实验环境:

⏹Microsoft Windows XP Professional 版本2002 Service Pack 3

⏹Eclipse For EE

五、实验分析:

程序中先判断这个语句中每个单元为关键字、常数、运算符、界符。对不同的单词符号给出不同形式的编码来加以区分。

定义不同的单词符号:

⏹关键字:"if","int","for","while","do","return","break","continue","main","printf","scanf"

⏹分界符:';' , ',', ')' , '(' , '{' , '}' , '"'

⏹运算符:"+","-","*","/","="

⏹其他标记如字符串,表示以字母开头的标识符

编译原理_实验报告实验二__语法分析(算符优先) 2

编译原理_实验报告实验二__语法分析(算符优先) 2

华北水利水电学院编译原理实验报告

一、实验题目:语法分析(算符优先分析程序)

(1)选择最有代表性的语法分析方法算符优先法;

(2)选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

二、实验内容

(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表输出到屏幕或者输出到文件);

(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)

(3)给定表达式文法为:

G(E’): E’→#E#

E→E+T | T

T→T*F |F

F→(E)|i

(4) 分析的句子为:

(i+i)*i和i+i)*i

三、程序源代

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

#include<iostream.h>

#define SIZE 128

char priority[6][6]; //算符优先关系表数组

char input[SIZE]; //存放输入的要进行分析的句子

char remain[SIZE]; //存放剩余串

char AnalyseStack[SIZE]; //分析栈

void analyse();

int testchar(char x); //判断字符X在算符优先关系表中的位置

void remainString(); //移进时处理剩余字符串,即去掉剩余字符串第一个字符int k;

编译原理实验报告:实验二编写递归下降语法分析程序

编译原理实验报告:实验二编写递归下降语法分析程序

编译原理实验报告

实验名称:实验二编写递归下降语法分析器实验类型:验证型实验

指导教师:何中胜

专业班级:13软件四

姓名:丁越

学号:13030504

电子邮箱:862245792@

实验地点:秋白楼B720

实验成绩:

日期:2016年4 月1 日

一、实验目的

通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:

1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。

2、掌握词法分析的实现方法。

3、上机调试编出的语法分析程序。

二、实验过程

1、分析对象分析算术表达式的 BNF 定义如下:

〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉

〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉

〈因式〉→〈变量〉│(〈算术表达式〉)

〈变量〉→i

用符号表示如下:E→T|E+T|E-T

T→F|T*F|T/F

F→i│(E)

递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。

递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。

每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。

自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。

南邮编译原理报告实验二

南邮编译原理报告实验二

实验报告

(2015 / 2016 学年第二学期)

课程名称编译原理

实验名称语法分析器的构造

实验时间2016 年5月26日指导单位计算机软件教学中心

指导教师黄海平

学生姓名班级学号

学院 (系) 计算机学院、专业计算机科学软件学院与技术

实验报告

实验名称语法分析器的构造指导教师黄海平

实验类型验证实验学时4实验时间2016.5.26 一、实验目的和要求

实验目的:

设计、编制、调试一个LL(1) 语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。

实验要求:

1、检测左递归,如果有则进行消除;

2、求解 FIRST 集和 FOLLOW 集;

3、构建 LL(1) 分析表;

4、构建 LL 分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。

以上实验要求可分两个同学完成。例如构建分析表一个同学完成、构建分析程序并分析符号串另一个同学完成。

二、实验环境 (实验设备 )

硬件:计算机

软件: Visual C ++6.0

二、实验原理及内容

实验内容:

设计并实现一个LL(1) 语法分析器,实现对算术文法

G[E]:E->E+T|T

T->T*F|F

F->(E)|i

所定义的符号串进行识别,例如符号串abc+age+80为文法所定义的句子,符号串 (abc-80(*s5)不是文法所定义的句子。

实验代码:

#include<cstdio>

#include<string>

#include<iostream>

using namespace std;

编译原理实验报告二

编译原理实验报告二

编译原理实验报告二

姓名:

学号:

班级:10级计科一班

1.编写一个对于Pascal源程序的预处理程序。该程序的作用是,每次被调用时都将下一个完整的语句送进扫描缓冲区,去掉注解行,同时要对源程序列表打印。

%{

(* lexical analyzer for Pascal)

%}

%{

(* 本程序通过扫描对照关键字表来识别关键字 *)

(* 过程和函数定义 *)

procedure commenteof;(* 检查并返回错误输入 *)

begin

writeln('unexpected EOF inside comment at line ', yylineno);

end(*commenteof*);

function upper(str : String) : String;

(* 将字符串转换为大写 *)

var i : integer;

begin

for i := 1 to length(str) do

str[i] := upCase(str[i]);

upper := str

end(*upper*);

function is_keyword(id : string; var token : integer) : boolean;

(* 检查 id 是否为 Pascal 关键字; 若是, 返回 token 中相应的 token number *)

const

id_len = 20;

type

Ident = string[id_len];

const

(* Pascal 关键字表: *)

(* 用 Pascal 关键字表: *)

(完整word版)编译原理报告二LR分析器

(完整word版)编译原理报告二LR分析器

LR分析器

一、目的和要求

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。

1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,并至少完成两个题目。

2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

⑴实验前的准备

按实验的目的和要求,编写语法分析程序,同时考虑相应的数据结构。

⑵调试

调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。

⑶输出

对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。

⑷扩充

有余力的同学,可适当扩大分析对象。譬如:

①算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。

②除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式。③加强语法检查,尽

量多和确切地指出各种错误。

⑸编写上机实习报告。

二、背景知识

※自下而上分析技术-LR(K)方法

LR(K)方法是一种自下而上的语法分析方法,是当前最广义的无回溯的“移进- 归约”方法。它根据栈中的符号串和向前查看的k(k³0)个输入符号,就能唯一确定分析器的动作是移进还是归约,以及用哪个产生式进行归约。

优点:文法适用范围广;识别效率高;查错能力强;可自动构造。

逻辑组成:总控程序+LR分析表

LR分析器的结构:

一个LR分析器实际是一个带先进后出存储器(栈)的确定下推自动机,它由一个输入串、一个下推栈和一个带有分析表的总控程序组成。栈中存放着由“历史”和“展望”材料抽象而来的各种“状态”。任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。为了有助于明确归约手续,我们把已归约出的文法符号串也同时放进栈里。LR分析器的每一动作都由栈顶状态和当前输入符号所唯一确定。

编译原理实验报告2

编译原理实验报告2

学生学号实验课成绩

武汉理工大学

学生实验报告书

实验课程名称编译原理

开课学院计算机科学与技术学院

指导老师姓名饶文碧

学生姓名

学生专业班级

—学年第学期

实验课程名称:编译原理

实验项目名称单词的词法分析实验成绩

实验者专业班级组别

同组者实验日期

第一部分:实验分析与设计(可加页)

一、实验内容描述(问题域描述)

完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。

实验要求:

(1)选择常用高级程序设计语言(如 Pascal、C语言、PL/0语言)的源程序作为词法分析对象。

(2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词,并把其转换成属性字输出。

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)

#include

#include

#include

#include

char *table[7]={" ","main","int","if","then","else","return"},TOKEN[20],ch;

//定义关键字

int lookup(char *TOKEN){ //关键字匹配函数

int m,i;

for(i=1;i<6;i++){

if((m=strcmp(TOKEN,table[i]))==0)

编译原理实验报告 FA确定化、最小化

编译原理实验报告 FA确定化、最小化

S11 \ \ \ \ \ \ \ \ \ \ \ 0 0 \ \ \ \ \
S12 \ \ \ \ \ \ \ \ \ \ \ \ 0 \ \ \ \ \
S13 \ \ \ \ \ \ \ \ \ \ \ \ \ 0 0 \ \ \
S14 \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 c \ \
DFA 的状态转换图
4
07 级计算机科学与技术:张勇 崔杰 崔鑫 孟凡杨 徐强
正规式:(a|b)^*@*n*.*c*n 的最小DFA 状态转移矩阵 第一列S 表示状态,第一行是终结符,-1 wk.baidu.com示不可达 初态:S0 终态:S1
a b @n . c S0 0 0 3 -1 -1 -1 S1 -1 -1 -1 -1 -1 -1 S2 -1 -1 -1 -1 4 -1 S3 -1 -1 -1 2 -1 -1 S4 -1 -1 -1 -1 -1 5 S5 -1 -1 -1 -1 -1 -1
1
07 级计算机科学与技术:张勇 崔杰 崔鑫 孟凡杨 徐强
2.使用算符优先文法分析方法。
建立算符优先关系表

*
|
^
)
#
(
<
<
<
<
>
>
*
<
>
>

编译原理实验二语法分析器LL实现

编译原理实验二语法分析器LL实现

编译原理程序设计实验报告

——表达式语法分析器的设计班级:计算机1306班姓名:张涛学号:20133967 实验目标:用LL(1)分析法设计实现表达式语法分析器

实验内容:

⑴概要设计:通过对实验一的此法分析器的程序稍加改造,使其能够输出正确的表达式的token序列。然后利用LL(1)分析法实现语法分析。

⑵数据结构:

int op=0; //当前判断进度

char ch; //当前字符

char nowword[10]=""; //当前单词

char operate[4]={'+','-','*','/'}; //运算符

char bound[2]={'(',')'}; //界符

struct Token

{

int code;

char ch[10];

}; //Token定义

struct Token tokenlist[50]; //Token数组

struct Token tokentemp; //临时Token变量struct Stack //分析栈定义

{

char *base;

char *top;

int stacksize;

};

⑶分析表及流程图

Begin PUSH(#),PUSH(E)

POP(x)

x ∈VT x ∈VN

x=w

end W=#n

y NEXT(w)

y

n

err

查LL (1)分析表空?

n PUSH (i )err n

y

逆序压栈

⑷关键函数:

int IsLetter(char ch) //判断ch 是否为字母

int IsDigit(char ch) //判断ch 是否为数字

int Iskey(char *string) //判断是否为关键字

编译原理实验报告二

编译原理实验报告二

深圳大学实验报告

课程名称:编译原理

实验项目名称:语法分析--递归下降法

学院:计算机与软件

专业:软件工程

指导教师:张小建

报告人:文成学号:2011150259 班级: 2 实验时间:2013-12-25

实验报告提交时间:2013-12-26

教务部制

一、实验目的:

掌握自顶向下的语法分析法——递归下降法。

二、实验内容:

用递归下降法对如下所定义的逻辑表达式进行语法分析。

1 L→ L || A

2 L→ A

3 A→ A && R

4 A→ R

5 R→ [ L ]

6 R→ ! L

7 R→ E >= E

8 R→ E > E

9 R→ E <= E

10 R→ E < E

11 R→ E == E

12 R→ E != E

13 R→ E

14 E→ E + T

15 E→ T

16 T→ T * F

17 T→ F

18 F→ ( E )

19 F→ n // 数

20 F→ i // 标识符

三、实验设计:

1、消除该文法的左递归(产生式1、3、14、16);

产生式(1)L→ L || A (2)L→ A

消除左递归得到:L→ A L' L'→ || A L' | з

产生式(3)A→ A && R (4)A→ R

消除左递归得到:A→ RA' A'→ && RA' | з

产生式(14)E→ E + T (15)E→ T

消除左递归得到:E→ TE' E'→ + TE' | з

产生式(16)T→ T * F (17)T→ F

消除左递归得到:T→ FT' T'→ *FT' | з

2、通过抽取公共左因子(产生式7 ~ 12),对该文法进行LL(1)改造;

编译原理-语法分析实验二

编译原理-语法分析实验二

华北水利水电学院编译原理实验报告

2010~2011学年第二学期 xxxx 级计算机专业班级: xxxxx 学号: xxxxx 姓名: xxx

一、实验目的

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。

二、实验要求

⑴选择最有代表性的语法分析方法,如LL(1)分析法、算符优先法或LR分析法

⑵选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

⑶实习时间为6小时。

三、实验内容

选题1:使用预测分析法(LL(1)分析法)实现语法分析:

(1)根据给定文法,先求出first集合、follow集合和select集合,构造预测分析表(要求预测分析表输出到屏幕或者输出到文件);

(2)根据算法和预测分析表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)

(3)给定表达式文法为:

G(E): S→TE

E→+TE | ε

T→FK

K→*FK |ε

F→(S)|i

(4)分析的句子为:

(i+i)*i和i+i)*i

四、程序源代码

#include "stdafx.h"

#include "SyntaxAnalysis.h"

#include "SyntaxAnalysisDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_ char THIS_FILE[] = __FILE__; #endif

/////////////////////////////////////////// // CAboutDlg dialog used for App About

编译原理实验二

编译原理实验二

编译原理二

-------词法分析器

一.问题描述

词法分析程序的功能:

输入源程序,输出单词符号,如图所示:

单词符号

处理过程:在扫描源程序字符串时,一旦识别出关键字、分隔符、标识符、无符号常数中之一,即以单词形式(各类单词均采用相同的结构,即二元式编码形式)输出。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

二.需求分析

1.对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词类型,单词符号)显示;

2.可以将要分析的程序保存到文件中进行读取;

3.删除无用的空白字符、回车符、及其它非实质性符号。

三.程序设计

本程序规定:

(1)关键字"begin","end","if","then","else","while","write","read",

"do", "call","const","char","until","procedure","repeat"

(2)运算符:"+","-","*","/","="

(3)界符:"{","}","[","]",";",",",".","(",")",":"

(4)其他标记如字符串,表示以字母开头的标识符。

(5)空格、回车、换行符跳过。

对于一段可能的输入代码,其结果在屏幕上显示如下:

( 1 , 无符号整数)

( begin , 关键字)

( if , 关键字)

( +, 运算符)

( ;, 界符)

( a , 普通标识符)

关键字或标识符的判断:读入一串字符,将ASCII码在字母范围的字符存入数组中,将该数组与设置好的关键字比较,如果相等则输出是关键字,否则继续读入直至下一字符既非数字也非字母,输出为标识符;

编译原理实验2语法分析器构造

编译原理实验2语法分析器构造
push(curChar); print_process(0, LOW); if(symbols[top]!='#')
goto u; break; case HIGH: error(j); curChar = '#'; break; case EQUAL: push(curChar); print_process(0, EQUAL); if(symbols[top]!='#')
} return 0; }
/* 判断优先级 */ int priority(int t, char a) {
switch(rule[index(symbols[t])][index(a)]) { case -1: return LOW; case 0: return EQUAL; case 1: return HIGH;
printf("%15s\n", "归约"); No[n++] = step-1; } else printf("%15s\n", "移进"); }
/* 规约过程 */ void prior_analysis() {
int i, j, m; char q, str, ch[20]; push('#'); print_process(0, LOW); u: curChar = readVT(k++); j = isVT(symbols[top]) ? top : top - 1; do {

编译原理课设报告2

编译原理课设报告2

编译原理课程设计题目:pl/0编译程序的改进与完善

学生所在学院:信息科学与工程学院

学生所在班级:06级计算机软件1班

学生姓名:

学生学号:

指导教师:张世辉

一、课设目的:

1.阅读、研究、改进、设计和调试一个简单的编译程序;

2.加深对编译程序理论和编译过程的理解。

二、课设内容:

1扩充语句for(<语句>;<条件>;<语句>)<语句>;

2扩充语句if <条件> then <语句> else <语句>;

3扩充语句repeat <语句>;until <条件>;

4增加自增自减运算++和—和+=,-=运算;

5修改不等号#,为!=;

6增加一维数组

声明格式:<ident>[<ident>/<number>:<ident>/<number>];

赋值格式:<ident>[<index>]:=<表达式>;

调用格式:<ident>[<index>]

三、程序结构:

PL/0源程序

图1 编译程序结构图2功能模块调用

1.各功能模块的作用:

Pl0.c:主程序

Error:出错处理,打印出错位置和错误编码

Getsym:词法分析,读取一个单词

Getch:漏掉空格,读取一个字符

Gen:生成目标代码,并送入目标程序区

Test:测试当前当前符号是否合法

Block:分程序分析处理过程,词法语法分析

Enter:登陆名字表

编译原理 实验2 词法分析器

编译原理 实验2 词法分析器

编译原理实验2 词法分析器

一、实验目的

1. 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。

2. 掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

3. 编制一个读单词的程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符和分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)

二、词法分析的基础知识

1. 词法分析器的功能和输出格式

词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。在本实验中,采用的是一类符号一种别码的方式。

标识符的BNF表示:

<标识符>-> <字母><字母数字串>

<字母数字串>-><字母><字母数字串>|<数字><字母数字串>|ε

无符号整数的BNF表示:

<无符号整数>-> <数字><数字串>

<数字串>-> <数字><数字串> |ε

运算符的BNF表示:

<加法运算符>-> +

<减法运算符>-> -

<大于关系运算符>-> >

<大于等于关系运算符>-> >=

2. 超前搜索

词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a > i”,当前字符为“>”,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢?

编译原理实验报告2-词法分析程序的设计.

编译原理实验报告2-词法分析程序的设计.

实验2 词法分析程序的设计

一、实验目的

掌握计算机语言的词法分析程序的开发方法。

二、实验内容

编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。

三、实验要求

1、根据以下的正规式,编制正规文法,画出状态图;

标识符<字母>(<字母>|<数字字符>)*

十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)

八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*

十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*

运算符和界符+ - * / > < = ( ) ;

关键字if then else while do

2、根据状态图,设计词法分析函数int scan( ),完成以下功能:

1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,

2)以二元式形式输出单词<单词种类,单词属性>

其中单词种类用整数表示:

0:标识符

1:十进制整数

2:八进制整数

3:十六进制整数

运算符和界符,关键字采用一字一符,不编码

其中单词属性表示如下:

标识符,整数由于采用一类一符,属性用单词表示

运算符和界符,关键字采用一字一符,属性为空

3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。

四、实验环境

PC微机

DOS操作系统或Windows 操作系统

Turbo C 程序集成环境或Visual C++ 程序集成环境

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

课程实验报告课程名称:《编译原理》

专业班级:信息安全1302

学号:

姓名:

指导教师:

报告日期:2015年11月6日

计算机科学与技术学院

目录

目录 (2)

1 实验一词法分析 (3)

1.1实验目的 (3)

1.2实验要求 (3)

1.3算法思想 (4)

1.4实验程序设计说明 (5)

1.5词法分析实现 (6)

1.6词法实验结果及结果分析 (11)

2 实验二语法分析 (12)

2.1 实验目的 (12)

2.2 实验要求 (12)

2.3 算法思想 (12)

2.4 实验程序设计说明 (14)

2.5 语法分析实现 (14)

4 实验中遇到的问题及解决 (22)

参考资料 (23)

1 实验一词法分析

1.1 实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

1.2 实验要求

1、待分析的简单的词法

(1)关键字:

main int char if else for while

所有的关键字都是小写。

(2)运算符和界符

:= + -* / < <= <> > >= = == != ; ( ) [ ] { } #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter (letter | digit)*

NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2、各种单词符号对应的种别码:

表1 各种单词符号对应的种别码

3、词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

1.3 算法思想

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

1、主程序示意图:

主程序示意图如图1所示。其中初始包括以下两个方面:

⑴关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:

Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};

开始

置初值

调用扫描子程序

输出单词二元组

输入串结束?

结束

图1 主程序示意图

(2)程序中需要用到的主要变量为syn,token 和sum 2、 扫描子程序的算法思想:

首先设置3个变量:①token 用来存放构成单词符号的字符串;②sum 用来整型单词;③syn 用来存放单词符号的种别码。扫描子程序主要部分流程如图2所示。

图2 扫描子程序流程图

1.4 实验程序设计说明

1、数据结构的设计

先来看看WORD 结构的设计: typedef struct {

int typenum; //用于存储该字符串的种别码;

开始

变量初始化

忽略空格

是否文件结束?

返回

拼数

拼字符串

字母 Syn=11

关键字?

Syn=10

Syn 为对应关键字的种别码

对不同符给出相应的syn 值

报错

其他符号

运算符界符等

返回

数字

char *word; //用于存储字符串;

}

这个词法分析中,我们要将我们识别到的字符串输出他们,而且还要将他们的相应的种别码输出,因此我们得用一个结构体来将这两个属性放在一个结构体中。

2、算法的设计

首先将输入端的字符串读入然后进行前期的处理,如去掉空白符号。之后在一个字符一个字符的进行处理,判断下一个字符串所属类型,然后给出相应类型的种别码,返回给主函数进行输出。其中主要部分就是分类属性的判断以及判断之后不同属性种别码的赋值,这就是整个程序中的主要部分。

1.5 词法分析实现

【使用C语言实现:】

#include

#include

#include

#include

#define _KEY_WORD_END "waiting for your expanding"

typedef struct

{

int typenum;

char * word;

} WORD;

char input[255];

char token[255]="";

int p_input;

int p_token;

char ch;

char* KEY_WORDS[]={"main","int","char","if","else","for","while",_KEY_WORD_END}; WORD* scaner();

int main()

{

int over=1;

WORD* oneword=new WORD;

printf("Enter Your words(end with #):");

scanf("%[^#]s",input);

p_input=0;

printf("Your words:\n%s\n",input);

while(over<1000&&over!=-1){

oneword=scaner();

if(oneword->typenum<1000)

printf("(%d,%s)",oneword->typenum,oneword->word);

相关文档
最新文档