文档库 最新最全的文档下载
当前位置:文档库 › 递归下降分析程序实验报告

递归下降分析程序实验报告

递归下降分析程序实验报告
递归下降分析程序实验报告

实验报告

《编译原理》课程

2014-2015学年度第1学期

专业年级计算机科学与技术2012级姓名

学号

任课教师

实验教师___________

上机地点

递归下降分析程序

一、实验目的及要求

利用递归下降语法分析的基本思想,对一段用Micro语言写的程序进行语法分析

二、实验内容

◆设计并实现一个小型程序语言(Micro)的语法分析器,实现源程序的输入、

预处理和词法分析,语法分析。

◆用C语言实现该语言语法分析程序

三、实验原理

递归下降语法分析基本思想如下:

·每个非终结符都有一个相关的语法分析过程用以识别由该非终结符生成的任意此法记号序列。在语法分析过程中,非终结符和终结符都能被匹配。

·为了匹配非终结符A,调用A所对应的语法分析过程。按照惯例,该分析过程也命名为A。这些调用可以是递归的,因此被称为递归下降。

四、Micro语言的定义

●仅有的数据类型是整型。

●所有的标识符采用隐式声明,且长度不超过32个字符。标识符必须以字母开头并由字母、

数字和下划线组成。

●整型常量由一串数字组成。

●注释由“--”开始,并在当前行尾结束。

●语句类型为:

●赋值语句:

ID := Expression;

Expression是由标识符、文字常量、+与- 运算符组成的中缀表达式结构,其中允许含有括号。

●输入输出语句:

read( List of IDs);

write(List of Expressions);

●begin、end、read、write都是保留字。

●每条语句以分号(;)结束。程序体由begin和end界定。

●词法记号不能跨行。

五、设计思路和流程框图

(词法分析器状态转换图)

六、描述Micro语言词法分析程序的核心数据结构和算法。

void match(int matching ) //匹配函数

{

retractnum=0; //回溯字数,初始化为0

int cmp=-1;

if( matching== $BEGIN){ //匹配begin开始字符scanner();

cmp=strcmp(strToken,"begin");

if(cmp !=0){

cout<<"can't match begin "<

}

else{

cout<<"match begin"<

}

}

else if(matching==$END){ //匹配end结束字符scanner();

cmp=strcmp(strToken,"end");

if(cmp!=0)

cout<<"can't match end"<

else

cout<<"match end"<

}

else if(matching==$ID){ //匹配id scanner();

cmp=strcmp(strToken,"end");

cmp=strcmp(strToken,"begin");

cmp=strcmp(strToken,"read");

cmp=strcmp(strToken,"write");

if(cmp!=0)

cout<<"can match ID"<

else

cout<<"can't match ID"<

judge = 0;

}

else if(matching==$LPAREN){ //匹配左括号(

scanner();

if(ch=='(')

cout<<"can match ("<

else

cout<<"can't match ("<

judge=0;

}

else if(matching==$RPAREN){ //匹配右括号) scanner();

if(ch==')')

cout<<"can match )"<

else

cout<<"can't match )"<

judge=0;

}

else if(matching==$SEMICOLON){ //匹配分号scanner();

if(ch==';')

cout<<"can match ;"<

else

cout<<"can't match ;"<

judge = 0;

}

else if(matching==$ASSIGNOP){

scanner();

if(ch=='+' || ch=='-') //匹配加号+

cout<<"can match assignop "<

else

cout<<"can't match assignop"<

judge=0;

}

else if(matching ==$INTLITERAL){ //匹配减号-

scanner();

cout<<"can match int"<

}

else if(matching ==$$){

scanner();

if(ch=='$')

cout<<"can match $, the program will end"<

else

cout<<"can't match $"<

}

}

七、源程序

#include

#include

#include

#include /*用于exit函数*/

char *KeyWord[4]= {"begin","end","read","write"}; int i=0,j=0,k=0,t=0; //搜索指示器a

int p; //指示器

#define BUFFERSIZE 1000

char ch;//存放最新读入的原程序字符

char strToken[33];//存放构成单词符号的字符

char * chr_form[100];//字符表

char * int_form[100];//常数表

char form[BUFFERSIZE];

char form2[BUFFERSIZE];

int retractnum; //记录需要回调的k的步数

int q=0;

int temp;

FILE * fp;

#define $ID 1

#define $READ 2

#define $WRITE 3

#define $ASSIGNOP 4

#define $SEMICOLON 5

#define $COMMA 6

#define $LPAREN 7 // (

#define $RPAREN 8 // )

#define $INTLITERAL 9

#define $$ 10

#define $PLUSOP 11 // +

#define $MINUSOP 12 // -

#define $BEGIN 13

#define $END 14

#define $EQUALSIGN 15

typedef int token ;

void primary();

void expression();

void program();

void statement_list();

void program();

void statement();

void match(int);

int judge;

//子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置

void getChar()

{

ch=form[k];

retractnum++;

k++;

}

//子程序过程,检查ch中的字符是否为空白。若是,则调用getChar,直至ch中进入一个非空白字符

void getBC()

{

while(ch == ' '){

getChar();

}

}

//链接字符

void concat()

{

strToken[i]=ch;

i++;

}

//判断是否是字母

bool isLetter()

{

if(((ch<='z')&&(ch>='a')) || ((ch<='Z')&&(ch>='A')))

return (1);

else

return (0);

}

//判断是否是数字

bool isDigit()

{

if((ch>='0')&&(ch<='9'))

return (1);

else

return (0);

}

//判断字符串是否是保留字

int reserve()

{

int q=0;

for(q=0;q<4;q++){

if(strcmp(strToken,KeyWord[q])==0)

return q;

}

return -1;

}

void retract() //将搜索指示器回调一个字符位置,将ch置为空白字符{

k--;

ch=NULL;

}

//将strToken中的标识符插入符号表,返回符号表指针

char *insertId()

{

chr_form[j]=strToken;

j++;

return chr_form[0];

}

//将strToken中的常数插入常数表,返回常数表指针

char *inserConst()

{

int_form[t]=strToken;

t++;

return int_form[0];

}

//词法分析器的构造

int code=-3;

int record;

void scanner()

{

for(i=0;i<32;i++) strToken[i] = NULL;

i=0;

int w;

getChar();

getBC();

if(isLetter()){

retractnum=1;

while(isLetter() || isDigit()){

retractnum++;

concat();

getChar();

}

retractnum--;

retract();

code=reserve();

switch(code){

case -1 :

cout<<"字符串 "<

cout<<"can macth"<

record = $ID ;

cout<

break;

default:

if((w=strcmp(strToken,"read"))==0){

cout<<"关键字 "<

record=$READ;

cout<

}

else{

cout<<"关键字 "<

record=$WRITE;

cout<

}

}

}

else if(isDigit()){

retractnum=1;

while(isDigit()){

retractnum++;

concat();

getChar();

}

retractnum--;

retract();

cout<<"常数 "<

record=$INTLITERAL;

}

else if(ch=='='){

cout<<"运算符 "<

record=$EQUALSIGN;

retractnum=1;

}

else if(ch=='+'){

cout<<"运算符 "<

record=$PLUSOP;

retractnum=1;

}

else if(ch=='-'){

cout<<"运算符 "<

record=$MINUSOP;

retractnum=1;

}

else if(ch==';'){

// cout<<"界符 "<

record=$SEMICOLON;

retractnum=1;

}

else if(ch=='('){

//cout<<"界符 "<

record=$LPAREN;

retractnum=1;

}

else if(ch==')'){

//cout<<"界符 "<

record=$RPAREN;

retractnum=1;

}

else if(ch==','){

record=$COMMA;

}

}

/* ---------------------------递归下降分析程序构造-------------------------- */ int next_token()

{

int value;

retractnum =0;

scanner();

value = record;

return value;

} //调用scnaner函数,获取下一个字符,函数需要回调

void match(int matching ) //匹配函数

{

retractnum=0;

int cmp=-1;

if( matching== $BEGIN){

scanner();

cmp=strcmp(strToken,"begin");

if(cmp !=0){

cout<<"can't match begin "<

}

else{

cout<<"match begin"<

}

}

//匹配end

else if(matching==$END){

scanner();

cmp=strcmp(strToken,"end");

if(cmp!=0)

cout<<"can't match end"<

else

cout<<"match end"<

}

else if(matching==$ID){

scanner();

cmp=strcmp(strToken,"end");

cmp=strcmp(strToken,"begin");

cmp=strcmp(strToken,"read");

cmp=strcmp(strToken,"write");

if(cmp!=0)

cout<<"can match ID"<

else

cout<<"can't match ID"<

judge = 0;

}

else if(matching==$LPAREN){ //匹配左括号(

scanner();

if(ch=='(')

cout<<"can match ("<

else

cout<<"can't match ("<

judge=0;

}

else if(matching==$RPAREN){ //匹配右括号)

scanner();

if(ch==')')

cout<<"can match )"<

else

cout<<"can't match )"<

judge=0;

}

else if(matching==$SEMICOLON){ //匹配分号

scanner();

if(ch==';')

cout<<"can match ;"<

else

cout<<"can't match ;"<

judge = 0;

}

else if(matching==$ASSIGNOP){ //匹配运算符

scanner();

if(ch=='+' || ch=='-')

cout<<"can match assignop "<

else

cout<<"can't match assignop"<

judge=0;

}

else if(matching ==$INTLITERAL){

scanner();

cout<<"can match int"<

}

else if(matching ==$$){

scanner();

if(ch=='$')

cout<<"can match $, the program will end"<

else

cout<<"can't match $"<

}

}

void syntax_error(int Tok){

}

void primary(void){

token tok = next_token();

switch(tok){

case $LPAREN:

/* ::= () */

// match($LPAREN);

expression();

match($RPAREN);

break;

case $ID:

/* ::= ID */

// match($ID);

break;

case $INTLITERAL:

/* :: = INTLITERAL*/

// match($INTLITERAL);

break;

default:

syntax_error(tok);

break;

}

}

//判断是否是表达式

void expression(){

/* :: = {} */ primary();

p=next_token() ;

while( p== $PLUSOP || p==$MINUSOP){

//add_op();

primary();

p=next_token();

}

k=k-retractnum;

}

void id_list(){

/* :: = ID{,ID} */

match($ID);

while(next_token() == $COMMA){

// match($COMMA);

match($ID);

}

retract();

}

void expr_list(){

/* ::={,} */

expression();

if(p==$COMMA){

while( p == $COMMA){

// match($COMMA);

expression();

}

}

else{

cout<<"语法错误"<

exit(0);

}

}

//开始语句分析

void statement()

{

/*

if( fgets(form,48,fp) ==NULL ){

exit(0);

}

k=0; */

token tok = next_token();

switch(tok){

case $ID:

/* ::= ID:= ; */

// match($ID);

scanner();

if(record==$PLUSOP){

// match($ASSIGNOP);

expression();

}

if(record==$MINUSOP){

// match($ASSIGNOP);

expression();

}

else if(record==$EQUALSIGN){

cout <<"equal"<

expression();

}

match($SEMICOLON);

break;

case $READ:

/* ::= READ(); */

// match($READ); //匹配 read

match($LPAREN); //匹配 (

id_list();

match($RPAREN); //匹配 )

match($SEMICOLON); //匹配 ;

break;

case $WRITE:

/* ::=WRITE(); */

// match($WRITE);

match($LPAREN);

expression();

match($RPAREN);

match($SEMICOLON);

break;

default:

syntax_error(tok);

break;

}

}

void match2(int matching)

{

int cmp;

if(matching == $END){

cmp=strcmp(form2,"begin");

if(cmp)

cout<<"the program will end"<

}

}

//程序体开始

void program(){

/* ::= BEGIN END */

match($BEGIN);

statement_list();

match2($END);

}

void statement_list(){

// ::= {} while(fgets(form,48,fp) !=NULL){

strcpy(form2,form);

statement();

}

}

void system_goal(void){

/* ::= # */

program();

match($$);

}

void main()

{

fp=fopen("abc.txt","r") ;

int count=0;

/*

if(fgets(form,48,fp) !=NULL

k=0;

scanner();

}

*/

if(fgets(form,48,fp) !=NULL){

match($BEGIN);

while( fgets(form,48,fp) !=NULL ){

k=0;

strcpy( form2,form);

statement();

int a=0;

while(form[a]!='\0'){

cout<

a++;

}

cout<

}

match2($END);

fclose(fp);

}

八、测试结果及实验总结

1.实验结果

测试程序如下:

begin

print + b ;

c=a+5;

read(a,5);

write(3+5);

end

2.实验总结

这个实验比第一个有难度,是在第一个完成的基础上进行的。该程序用的递归下降分析的方法。不止能识别还能判断一些语法的正误。刚看到代码的大致框架的时候,感觉难度有点大,开始调试的时候,也确实报了很多错,不过还是慢慢一步一步调试成功了。通过本次实验,了解到了编译器是如何分析并判断一个程序的句子的正确性的。同时加深了对递归下降分析法的理解。

消除文法的左递归实验

编译原理实验报告 实验名称 _____________ 消除文法的左递归__________________________ 实验时间 _____________________________________________ 院系 _________________________________________ 班级 ______________________________________________ 学号 ____________________________________________ 姓名

1. 试验目的 ?掌握和理解消除左递归(包括直接左递归和间接左递归)在构建 LL(1)文法的作用和目的 ?掌握消除左递归(包括直接左递归和间接左递归)的方法和步骤。 ?写出对于输入任意的上下文无关文法可以输出消除了左递归的等 价文法。 2. 实验原理 ?直接左递归的消除 消除产生式中的直接左递归是比较容易的。例如假设非终结符 P的规则为 P—P a/ B 其中,B是不以P开头的符号串。那么,我们可以把P的规则改写为 如下的非直接左递归形式:P—尸’ P'—P'£ 考虑更一般的情况,假定关于非终结符P的规则为 P—P a / P o2 / …/ P a n / [31 / [32 / …/ p m 其中,a (I = 1, 2,…,n)都不为£而每个p j (j = 1, 2,…,m) 都不以P开头,将上述规则改写为如下形式即可消除P的直接左递归: P— p l P'/ 32 P'/…/p m P' P' — 01P' / a P'/…/ a n P'/£

编译原理-编写递归下降语法分析器

学号107 成绩 编译原理上机报告 名称:编写递归下降语法分析器 学院:信息与控制工程学院 专业:计算机科学与技术 班级:计算机1401班 姓名:叶达成 2016年10月31日

一、上机目的 通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、基本原理和上机步骤 递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。 递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。 每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。 自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。 无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于任一非终结符号U的产生式右部x1|x2|…|x n,其对应的字的首终结符号两两不相交。 如果一个文法不含回路(形如P?+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。 三、上机结果 测试数据: (1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (2)输出结果:i+i*i#为合法符号串 (3)输入一符号串如i+i*#,要求输出为“非法的符号串”。 程序清单: #include #include char str[50]; int index=0; void E(); //E->TX; void X(); //X->+TX | e void T(); //T->FY void Y(); //Y->*FY | e void F(); //F->(E) | i int main() /*递归分析*/ { int len; int m;

数值分析实验报告1

实验一误差分析 实验1.1(病态问题) 实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。 数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。 问题提出:考虑一个高次的代数多项式 显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动 其中ε(1.1)和(1.221,,,a a 的输出b ”和“poly ε。 (1(2 (3)写成展 关于α solve 来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab 的帮助。 实验过程: 程序: a=poly(1:20); rr=roots(a); forn=2:21 n form=1:9 ess=10^(-6-m);

ve=zeros(1,21); ve(n)=ess; r=roots(a+ve); -6-m s=max(abs(r-rr)) end end 利用符号函数:(思考题一)a=poly(1:20); y=poly2sym(a); rr=solve(y) n

很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。 学号:06450210 姓名:万轩 实验二插值法

递归与分治实验报告

递归与分治实验报告 班级:计科1102 姓名:赵春晓学号:2011310200631 实验目的:进一步掌握递归与分治算法的设计思想,通过实际问题来应用递归与分治设计算法。 实际问题:1集合划分问题,2输油管道问题,3邮局选址问题,4整数因子分解问题,5众数问题。 问题1:集合划分 算法思想:对于n个元素的集合,可以划分为由m个子集构成的集合,例如{{1,2}{3,4}}就是由2个子集构成的非空子集。假设f(n,m)表示将n个元素划分成由m个子集构成的集合的个数。那么1)若m == 1 ,则f(n,m)= 1 ;2)若n == m ,则f(n,m)= 1 ;3)若不是上面两种情况则有下面两种情况构成:3.1)向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;3.2)向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。 实验代码: #include #include using namespace std ; int jihehuafen( int n , int m ) { if( m == 1 || n == m ) return 1 ; else return jihehuafen( n - 1 , m - 1 ) + m*jihehuafen( n - 1 , m ) ; } int main() { ifstream fin("C:/input.txt") ; ofstream fout("C:/output.txt") ; int N , M , num ; fin >> N >> M ; num = jihehuafen( N , M) ; fout << num << endl ; return 0 ; } 问题2:输油管道 算法思想:由于主管道由东向西铺设。故主管道的铺设位置只和各油井的y坐标有关。要使主管道的y坐标最小,主管道的位置y坐标应是各个油井y坐标的中位数。先用快速排序法把各个油井的y坐标排序,然后取其中位数再计算各个油

实验三-递归下降法的语法分析器

魏陈强 204168 实验3 递归下降法的语法分析器 一、实验目的 学习用递归下降法构造语法分析器的原理,掌握递归下降法的编程方法。 二、实验内容 用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 这里只要求实现部分产生式,文法的开始符号为program。(完整的源语言的文法定义见教材附录,p394) program→ block block→{stmts } stmts→stmt stmts | 。 stmt→id=expr; | if(bool)stmt | if( bool)stmt else stmt | while(bool)stmt | do stmt while(bool ) ; | break ; | block bool →expr < expr | expr <= expr | expr > expr | expr >= expr & | expr expr→ expr + term

| expr - term | term term→ term * factor | term / factor | factor factor→ ( e xpr ) | id| num 三、实验要求 1.个人完成,提交实验报告。 ( 2.实验报告中给出采用测试源代码片断,及其对应的最左推导过程(形式可以自行考虑)。 测试程序片断: { i = 2; while (i <=100) { sum = sum + i; i = i + 2; } } 对应的推导过程为: # program block {stmts } {stmt stmts} {id=expr;stmts } {id=num;stmts } {id=num;stmt stmts } {id=num;while(bool)stmt stmts } {id=num;while(e xpr<= expr)stmt stmts } {id=num;while(id<= expr)stmt stmts } {id=num;while(id<= num)stmt stmts } {id=num;while(id<= num)block stmts } , {id=num;while(id<= num){stmts }stmts } .......

数值分析实验报告

数值分析实验报告 姓名:周茹 学号: 912113850115 专业:数学与应用数学 指导老师:李建良

线性方程组的数值实验 一、课题名字:求解双对角线性方程组 二、问题描述 考虑一种特殊的对角线元素不为零的双对角线性方程组(以n=7为例) ?????????? ?????? ? ???? ?d a d a d a d a d a d a d 766 55 44 3 32 211??????????????????????x x x x x x x 7654321=?????????? ? ???????????b b b b b b b 7654321 写出一般的n (奇数)阶方程组程序(不要用消元法,因为不用它可以十分方便的解出这个方程组) 。 三、摘要 本文提出解三对角矩阵的一种十分简便的方法——追赶法,该算法适用于任意三对角方程组的求解。 四、引言 对于一般给定的d Ax =,我们可以用高斯消去法求解。但是高斯消去法过程复杂繁琐。对于特殊的三对角矩阵,如果A 是不可约的弱对角占优矩阵,可以将A 分解为UL ,再运用追赶法求解。

五、计算公式(数学模型) 对于形如????? ?? ????? ??? ?---b a c b a c b a c b n n n n n 111 2 2 2 11... ... ...的三对角矩阵UL A =,容易验证U 、L 具有如下形式: ??????? ????? ??? ?=u a u a u a u n n U ...... 3 3 22 1 , ?? ????? ? ?? ??????=1 (1) 1132 1l l l L 比较UL A =两边元素,可以得到 ? ?? ??-== = l a b u u c l b u i i i i i i 111 i=2, 3, ... ,n 考虑三对角线系数矩阵的线性方程组 f Ax = 这里()T n x x x x ... 2 1 = ,()T n f f f f ... 2 1 = 令y Lx =,则有 f Uy = 于是有 ()?????-== --u y a f y u f y i i i i i 1 1 11 1 * i=2, 3, ... ,n 再根据y Lx =可得到

消除左递归实验报告

共享知识分享快乐 编译原理实验报告 实验名称消除文法左递归 实验时间2014年12月12日 院系软件工程 ______________ 班级软件工程(2)班 学号E01214215 __________ 姓名刘翼________________

实验目的: 输入:任意的上下文无关文法。输出:消除了左递归的等价文法。 实验原理: 1.直接左递归的消除 消除产生式中的直接左递归是比较容易的。例如假设非终结符P 的规则为 P—P a / B 其中,B是不以P开头的符号串。那么,我们可以把P的规则改写为如下的非直接左递归形式:P —B P' P'—a P' / £ 这两条规则和原来的规则是等价的,即两种形式从P推出的符号串是相同的。 设有简单表达式文法G[E] : E —E+T/ T T —T*F/ F F —(E)/ I 经消除直接左递归后得到如下文法: E —TE' E ' —+TE' / £ T —FT' T' —*FT' / £ F —(E)/ I 考虑更一般的情况,假定关于非终结符P的规则为 P—P a 1 / P a 2 / …/ P a n / B 1 / B 2 / …/ B m 其中,a i (I = 1,2,…,n)都不为£,而每个B j (j = 1,2,…,m都不以P开头,将上述规则改写为如下形式即可消除P的直接左递归: P—B 1 P' / B 2 P' / …/ B m P' P' —a 1P' / a 2 P' / …/ a n P' / £ 2.间接左递归的消除 直接左递归见诸于表面,利用以上的方法可以很容易将其消除,即把直接左递归改写成直接右递归。然而文法表面上不存在左递归并不意味着该文法就不存在左递归了。有些文法虽然表面上不存在左递归,但却隐藏着左递归。例如,设有文法G[S] : S—Qc/ c Q—Rb/ b R—Sa/ a 虽不具有左递归,但S、Q R都是左递归的,因为经过若干次推导有 S Qc Rbc Sabc Q Rb Sab Qcab R Sa Qca Rbca

实验三 递归下降分析程序实现

实验三递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 程序比较复杂,需要利用到程序设计语言的知识和大量编程技巧,递归下降分析法是一种较实用的分析法,通过这个练习可大大提高软件开发能力。通过练习,掌握函数间相互调 用的方法。 二、实验要求 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 三、实验内容 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E-TG (2)G-+TG|—TG (3)G-ε (4)T-FS (5)S-*FS|/FS (6)S-ε (7)F-(E) (8)F-i 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (3)输出结果:i+i*i#为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 引用也要改变)。 注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 3.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 四、实验学时 4学时 五、实验步骤 (一)准备:

1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序思路(仅供参考): 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 六、实验预习提示 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 具体为: (1)对于每个非终结符号U-u1|u2|…|un处理的方法如下: U( ) { ch=当前符号; if(ch可能是u1字的开头) 处理u1的程序部分; else if(ch可能是u2字的开头)处理u2的程序部分; … else error() } (2)对于每个右部u1-x1x2…xn的处理架构如下: 处理x1的程序; 处理x2的程序; … 处理xn的程序; (3)如果右部为空,则不处理。

数值计算实验报告

(此文档为word格式,下载后您可任意编辑修改!) 2012级6班###(学号)计算机数值方法 实验报告成绩册 姓名:宋元台 学号: 成绩:

数值计算方法与算法实验报告 学期: 2014 至 2015 第 1 学期 2014年 12月1日课程名称: 数值计算方法与算法专业:信息与计算科学班级 12级5班 实验编号: 1实验项目Neton插值多项式指导教师:孙峪怀 姓名:宋元台学号:实验成绩: 一、实验目的及要求 实验目的: 掌握Newton插值多项式的算法,理解Newton插值多项式构造过程中基函数的继承特点,掌握差商表的计算特点。 实验要求: 1. 给出Newton插值算法 2. 用C语言实现算法 二、实验内容 三、实验步骤(该部分不够填写.请填写附页)

1.算法分析: 下面用伪码描述Newton插值多项式的算法: Step1 输入插值节点数n,插值点序列{x(i),f(i)},i=1,2,……,n,要计算的插值点x. Step2 形成差商表 for i=0 to n for j=n to i f(j)=((f(j)-f(j-1)(x(j)-x(j-1-i)); Step3 置初始值temp=1,newton=f(0) Step4 for i=1 to n temp=(x-x(i-1))*temp*由temp(k)=(x-x(k-1))*temp(k-1)形成 (x-x(0).....(x-x(i-1)* Newton=newton+temp*f(i); Step5 输出f(x)的近似数值newton(x)=newton. 2.用C语言实现算法的程序代码 #includeMAX_N) { printf("the input n is larger than MAX_N,please redefine the MAX_N.\n"); return 1; } if(n<=0) { printf("please input a number between 1 and %d.\n",MAX_N); return 1; } printf("now input the (x_i,y_i)i=0,...%d\n",n); for(i=0;i<=n;i++) { printf("please input x(%d) y(%d)\n",i,i);

编译原理-实验二-递归下降分析程序构造

集美大学计算机工程学院实验报告 课程名称:编译原理 指导教师:付永钢 实验成绩: 实验编号: 实验二 实验名称:递归下降分析程序构造 班级:计算12 姓名: 学号: 上机实践日期:2014.11 上机实践时间: 4学时 一、实验目的 通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标: (1) 掌握从源程序文件中读取有效字符的方法和产生源程序内部表示文件的方法; (2)掌握语法分析的实现方法; (3)上机调试编出的语法分析程序。 二、实验环境 Windows7 x64、VC6.0 三、实验原理 递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。 递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。 自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,可根据输入串的当前符号以及各产生式右部首符,选择某非终结符的产生式,效率高,且不易出错。 无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。即:假设A 的全部产生式为A →α1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式 First(A →αi )∩First (A →αj )=Φ,当i≠j. 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于人以非中介符号U 的产生式右部n x x x |...||21,其对应的字的首终结符号两两不相交。 如果一个文法不含回路(形如P P +?的推导),也不含以ε为右部的产生式,那么可以通过执行消除左递归的算法消除文法的一切左递归。 四、实验内容 完成以下描述算术表达式的LL(1)文法的递归下降分析程序构造 G[E]: E →TE ′ E ′→+TE ′|ε T →FT ′

实验三_递归下降法的语法分析器

魏陈强 23020092204168 实验3 递归下降法的语法分析器 一、实验目的 学习用递归下降法构造语法分析器的原理,掌握递归下降法的编程方法。 二、实验内容 用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 这里只要求实现部分产生式,文法的开始符号为program。(完整的源语言的文法定义见教材附录 A.1,p394) program→ block block→{stmts } stmts→stmt stmts | stmt→id=expr; | if(bool)stmt | if( bool)stmt else stmt | while(bool)stmt | do stmt while(bool ) ; | break ; | block bool →expr < expr | expr <= expr | expr > expr | expr >= expr | expr expr→ expr + term | expr - term | term

term→ term * factor | term / factor | factor factor→ ( e xpr ) | id| num 三、实验要求 1.个人完成,提交实验报告。 2.实验报告中给出采用测试源代码片断,及其对应的最左推导过程(形式可以自行考虑)。 测试程序片断: { i = 2; while (i <=100) { sum = sum + i; i = i + 2; } } 对应的推导过程为: program?block ?{stmts } ?{stmt stmts} ?{id=expr;stmts } ?{id=num;stmts } ?{id=num;stmt stmts } ?{id=num;while(bool)stmt stmts } ?{id=num;while(e xpr<= expr)stmt stmts } ?{id=num;while(id<= expr)stmt stmts } ?{id=num;while(id<= num)stmt stmts } ?{id=num;while(id<= num)block stmts } ?{id=num;while(id<= num){stmts }stmts } ?....... 四、实验思路 之前编写的词法分析器,能够将语句中的每一个词素都识别出来,因此,在此基础上,定义一个二维字符串数组finaltable[100][20],用于存放由词法分析器提取出来的每个词素,比如,i=2,则finaltable[0]=”id”,

递归下降分析法

《编译原理》课程实验报告 实验名称:递归下降分析法 一.实验目的 1.理解递归下降语法分析方法的主要原理 2.理解递归下降分析法对文法的要求 3.熟练掌握Predict集合的求法 4.熟练掌握文法变换算法(消除左递归和消除公共前缀) 二.实验内容 #include char token[20]; char sym; int p; void S(); void T(); void U(); void Scanner(); void Error(); void S() { if (sym == 'a' || sym == '^') Scanner(); else if (sym == '(') { Scanner(); T(); if (sym == ')') Scanner(); else Error(); } else Error();

} void T() { S(); U(); } void U() { if (sym == ',') { Scanner(); S(); U(); } else if(sym != ')') Error(); } void Scanner() { sym = token[p++]; } void Error() { //exit(0); } int main() { printf("输入: "); gets(token); p = 0; Scanner(); S(); if (sym == '$') printf("Success!"); else printf("Fail!"); return 0; } 三.实验步骤 调试程序的结果:

数值分析实验报告1

实验一 误差分析 实验(病态问题) 实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。 数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。 问题提出:考虑一个高次的代数多项式 )1.1() ()20()2)(1()(20 1∏=-=---=k k x x x x x p 显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动 )2.1(0 )(19=+x x p ε 其中ε是一个非常小的数。这相当于是对()中19x 的系数作一个小的扰动。我们希望比较()和()根的差别,从而分析方程()的解对扰动的敏感性。 实验内容:为了实现方便,我们先介绍两个Matlab 函数:“roots ”和“poly ”。 roots(a)u = 其中若变量a 存储n+1维的向量,则该函数的输出u 为一个n 维的向量。设a 的元素依次为121,,,+n a a a ,则输出u 的各分量是多项式方程 01121=+++++-n n n n a x a x a x a 的全部根;而函数 poly(v)b =

的输出b 是一个n+1维变量,它是以n 维变量v 的各分量为根的多项式的系数。可见“roots ”和“poly ”是两个互逆的运算函数。 ;000000001.0=ess );21,1(zeros ve = ;)2(ess ve = ))20:1((ve poly roots + 上述简单的Matlab 程序便得到()的全部根,程序中的“ess ”即是()中的ε。 实验要求: (1)选择充分小的ess ,反复进行上述实验,记录结果的变化并分析它们。 如果扰动项的系数ε很小,我们自然感觉()和()的解应当相差很小。计算中你有什么出乎意料的发现表明有些解关于如此的扰动敏感性如何 (2)将方程()中的扰动项改成18x ε或其它形式,实验中又有怎样的现象 出现 (3)(选作部分)请从理论上分析产生这一问题的根源。注意我们可以将 方程()写成展开的形式, ) 3.1(0 ),(1920=+-= x x x p αα 同时将方程的解x 看成是系数α的函数,考察方程的某个解关于α的扰动是否敏感,与研究它关于α的导数的大小有何关系为什么你发现了什么现象,哪些根关于α的变化更敏感 思考题一:(上述实验的改进) 在上述实验中我们会发现用roots 函数求解多项式方程的精度不高,为此你可以考虑用符号函数solve 来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab 的帮助。

递归下降语法分析程序的设计说明

编译方法实验报告实验名称:简单的语法分析程序设计

实验要求 1.功能:对简单的赋值语句进行语法分析 随机输入赋值语句,输出所输入的赋值语句与相应的四元式 2.采用递归下降分析程序完成(自上而下的分析) 3.确定各个子程序的功能并画出流程图 4.文法如下:

5.编码、调试通过 采用标准输入输出方式。输入输出的样例如下: 【样例输入】 x:=a+b*c/d-(e+f) 【样例输出】(说明,语句和四元式之间用5个空格隔开) T1:=b*c (*,b,c,T1) T2:=T1/d (/,T1,d,T2) T3:=a+T2 (+,a,T2,T3) T4:=e+f (+,e,f,T4) T5:=T3-T4 (-,T3,T4,T5) x:=T5 (:=,T5,-,x) 【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。 6.设计3-5个赋值语句测试实例,检验程序能否输出正确的四元式;当输入错误的句子时, 检验程序能够给出语法错误的相应提示信息。 7.报告容包括: 递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,3-5个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。

目录 1.语法分析递归下降分析算法 (5) 1.1背景知识 (5) 1.2消除左递归 (6) 2.详细设计及流程图 (6) 2.1 函数void V( ) // V -> a|b|c|d|e...|z . (6) 2.2 函数void A( ) // A -> V:=E (7) 2.3 函数void E() //E -> TE' (7) 2.4函数void T( ) // T -> FT' (8) 2.5函数void E1( ) //E'-> +TE'|-TE'|null (8) 2.6函数void T1() // T'-> *FT'|/FT'|null (9) 3.测试用例及截图 (9) 3.1测试用例1及截图 (9) 3.2测试用例2及截图 (10) 3.3测试用例3及截图 (11) 代码清单 (11)

编译原理-实验报告2-递归下降分析法

计算机硬件实验室实验报告 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验要求: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (3)输出结果:i+i*i#为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 注意: 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 三、实验过程:

程序设计: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 程序编写: 1.定义部分:定义常量、变量、数据结构。 2.初始化:从文件将输入符号串输入到字符缓冲区中。 3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 四、实验结果 (1)程序流程图 (2)运行结果 示例程序: #include <> #include<> #include<> #include<> char a[50] ,b[50],d[500],e[10]; char ch; int n1,i1=0,flag=1,n=5; int E(); int E1(); int T(); int G();

数值分析实验报告模板

数值分析实验报告模板 篇一:数值分析实验报告(一)(完整) 数值分析实验报告 1 2 3 4 5 篇二:数值分析实验报告 实验报告一 题目:非线性方程求解 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。利用二分法求解给定非线性方程的根,在给定的范围内,假设f(x,y)在[a,b]上连续,f(a)xf(b) 直接影响迭代的次数甚至迭代的收敛与发散。即若x0 偏离所求根较远,Newton法可能发散的结论。并且本实验中还利用利用改进的Newton法求解同样的方程,且将结果与Newton法的结果比较分析。 前言:(目的和意义) 掌握二分法与Newton法的基本原理和应用。掌握二分法的原理,验证二分法,在选对有根区间的前提下,必是收

敛,但精度不够。熟悉Matlab语言编程,学习编程要点。体会Newton使用时的优点,和局部收敛性,而在初值选取不当时,会发散。 数学原理: 对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。 对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b) Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式xk?1?xk?f(xk) f'(xk) 产生逼近解x*的迭代数列{xk},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为 xk?1?xk?rf(xk) 'f(xk) 其中r为要求的方程的根的重数,这就是改进的Newton 法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。 程序设计: 本实验采用Matlab的M文件编写。其中待求解的方程写成function的方式,如下 function y=f(x);

编译原理实验报告

院系:计算机科学学院 专业、年级: 07计科2大班 课程名称:编译原理 学号姓名: 指导教师: 2010 年11月17 日 组员学号姓名

实验 名称 实验一:词法分析实验室9205 实验目的或要求 通过设计一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 具体要求:输入为某语言源代码,达到以下功能: 程序输入/输出示例:如源程序为C语言。输入如下一段: main() { int a,b; a=10; b=a+20; } 要求输出如下(并以文件形式输出或以界面的形式输出以下结果)。 (2,”main”) (5,”(“) (5,”)“) (5,”{“} (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 要求: 识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。 其他的标识符,单词种别码为2。常数为无符号数,单词种别码为3。 运算符包括:+、-、*、/、=、>、<等;可以考虑更复杂情况>=、<=、!= ;单词种别码为4。分隔符包括:“,”“;”“(”“)”“{”“}”等等,单词种别码为5。

递归下降分析法

编译原理课程实验报告 班级学号:姓名: 实验名称:递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验要求: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (3)输出结果:i+i*i#为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 注意: 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 三、实验过程: 程序设计: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 程序编写: 1.定义部分:定义常量、变量、数据结构。 2.初始化:从文件将输入符号串输入到字符缓冲区中。 3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 四、实验结果

(1)程序流程图 主函数main( )流程图 E( )过程流程图 T( )过程流程图

G( )过程流程图 F( )过程流程图

(完整版)哈工大-数值分析上机实验报告

实验报告一 题目:非线性方程求解 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。 前言:(目的和意义) 掌握二分法与Newton法的基本原理和应用。 数学原理: 对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。 对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b)<0,且f(x)在[a,b]内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)<0是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。重复运行计算,直至满足精度为止。这就是二分法的计算思想。

Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式 产生逼近解x*的迭代数列{x k},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为 其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。 程序设计: 本实验采用Matlab的M文件编写。其中待求解的方程写成function的方式,如下 function y=f(x); y=-x*x-sin(x); 写成如上形式即可,下面给出主程序。 二分法源程序: clear %%%给定求解区间 b=1.5; a=0;

%%%误差 R=1; k=0;%迭代次数初值 while (R>5e-6) ; c=(a+b)/2; if f12(a)*f12(c)>0; a=c; else b=c; end R=b-a;%求出误差 k=k+1; end x=c%给出解 Newton法及改进的Newton法源程序:clear %%%% 输入函数 f=input('请输入需要求解函数>>','s') %%%求解f(x)的导数 df=diff(f);

编译原理实验报告

学生学号0120810680316 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称《编译原理》 开课学院计算机科学与技术学院 指导老师姓名何九周 学生姓名刘洋 学生专业班级软件工程0803 2010 —2011 学年第二学期

实验课程名称:编译原理 实验项目名称单词的词法分析程序设计实验成绩实验者刘洋专业班级软件0803 组别 同组者实验日期 2011 年 5 月 17日 第一部分:实验分析与设计(可加页) 一、实验内容描述(问题域描述) 实验目的: 设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。 实验要求: 在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写;上机时应随带有关的高级语言教材或参考书;要学会程序调试与纠错;每次实验后要交实验报告。 实验题目: 对于给定的源程序(如C语言或Pascal等),要求从组成源程序的字符行中寻找出单词,并给出它们的种别和属性——输出二元组序列。以便提供给语法分析的时候使用。要求能识别所有的关键字,标志符等,并且能够对出先的一些词法规则的错误进行必要的处理。 二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或 者算法描述) 实验原理: 由于这是一个用高级语言编写一个词法分析器,使之能识别输入串,并把分析结果(单词符号,标识符,关键字等等)输出.输入源程序,输入单词符号,本词法分析器可以辨别关键字,标识符,常数,运算符号和某些界符,运用了文件读入来获取源程序代码,再对该源程序代码进行词法分析,这就是词法分析器的基本功能.当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号.当缓冲区里的字符串被处理完之后,它又调用预处理子程序来处理新串. 编写的时候,使用了文件的输入和输出,以便于词法分析的通用型,同时在文件输出时,并保存在输出文件output文件中。 从左到右扫描程序,通过初始化:1为关键字;2为标志符; 3为常数;4为运算符或界符。 三、主要仪器设备及耗材 计算机

相关文档
相关文档 最新文档