编译原理上机实验报告1.docx

上传人:b****5 文档编号:12213749 上传时间:2023-04-17 格式:DOCX 页数:22 大小:19.55KB
下载 相关 举报
编译原理上机实验报告1.docx_第1页
第1页 / 共22页
编译原理上机实验报告1.docx_第2页
第2页 / 共22页
编译原理上机实验报告1.docx_第3页
第3页 / 共22页
编译原理上机实验报告1.docx_第4页
第4页 / 共22页
编译原理上机实验报告1.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

编译原理上机实验报告1.docx

《编译原理上机实验报告1.docx》由会员分享,可在线阅读,更多相关《编译原理上机实验报告1.docx(22页珍藏版)》请在冰豆网上搜索。

编译原理上机实验报告1.docx

编译原理上机实验报告1

编译技术上机实验题目

实验一

一、题目

编制C语言子集的词法分析程序

二、目的

通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

三、要求

1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。

2.程序功能

输入:

字符串。

输出:

二元式(种别编码,单词自身)构成的序列。

举例:

输入:

a=$;#

输出:

(6,a)

    (12,=)

    FOUNDERROR

    (13,;)

#include

#include

usingnamespacestd;

stringkey[6]={"begin","if","then","while","do","end"};//关键字

boolisKey(stringstr,int&syn)//判断是否为关键字,若是传回相应关键码的种别名

{

    inti;

    for(i=0;i<6;i++)

    {

        if(str==key)

        {

            syn=i+1;

            returntrue;

        }

    }

    returnfalse;

}

boolisLetter(charc)//是否为字母 

{

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

        returntrue;

    else

        returnfalse; 

}

boolisDigit(charc)//是否为数字

{

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

        returntrue;

    else

        returnfalse;

}

voidanalyse(FILE*fileP)

{

    intn;

    charc;

    stringstr="";

    while((c=fgetc(fileP))!

=EOF)

    {

        if(c==''||c=='\n'||c=='\t')

            continue;

        elseif(isDigit(c))//数字

        {

            while(isDigit(c))

            {

                str+=c;

                c=fgetc(fileP);

            }

            fseek(fileP,-1,SEEK_CUR);

            cout<<"(11,"<

            str="";

        }

        elseif(isLetter(c))//字母开头的

        {

            while(isDigit(c)||isLetter(c))

            {

                str+=c;

                c=fgetc(fileP);

            }

            fseek(fileP,-1,SEEK_CUR);

            if(isKey(str,n))

                cout<<"("<

            else

                cout<<"(10,"<<"\'"<

            str="";

        }

        else//操作符等

        {

            switch(c)

            {

            case'+':

                cout<<"(13,+)"<

                break;

            case'-':

                cout<<"(14,-)"<

                break;

            case'*':

                cout<<"(15,*)"<

                break;

            case'/':

                cout<<"(16,/)"<

                break;

            case':

':

                {

                    if(c=fgetc(fileP)=='=')

                        cout<<"(18,:

=)"<

                    else

                    {

                        cout<<"(17, 编译技术上机实验题目

实验一

一、题目

编制C语言子集的词法分析程序

二、目的

通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

三、要求

1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。

2.程序功能

输入:

字符串。

输出:

二元式(种别编码,单词自身)构成的序列。

举例:

输入:

a=$;#

输出:

(6,a)

(12,=)

FOUNDERROR

(13,;)

#include

#include

usingnamespacestd;

stringkey[6]={"begin","if","then","while","do","end"};//关键字

boolisKey(stringstr,int&syn)//判断是否为关键字,若是传回相应关键码的种别名

{

inti;

for(i=0;i<6;i++)

{

if(str==key)

{

syn=i+1;

returntrue;

}

}

returnfalse;

}

boolisLetter(charc)//是否为字母

{

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

returntrue;

else

returnfalse;

}

boolisDigit(charc)//是否为数字

{

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

returntrue;

else

returnfalse;

}

voidanalyse(FILE*fileP)

{

intn;

charc;

stringstr="";

while((c=fgetc(fileP))!

=EOF)

{

if(c==''||c=='\n'||c=='\t')

continue;

elseif(isDigit(c))//数字

{

while(isDigit(c))

{

str+=c;

c=fgetc(fileP);

}

fseek(fileP,-1,SEEK_CUR);

cout<<"(11,"<

str="";

}

elseif(isLetter(c))//字母开头的

{

while(isDigit(c)||isLetter(c))

{

str+=c;

c=fgetc(fileP);

}

fseek(fileP,-1,SEEK_CUR);

if(isKey(str,n))

cout<<"("<

else

cout<<"(10,"<<"\'"<

str="";

}

else//操作符等

{

switch(c)

{

case'+':

cout<<"(13,+)"<

break;

case'-':

cout<<"(14,-)"<

break;

case'*':

cout<<"(15,*)"<

break;

case'/':

cout<<"(16,/)"<

break;

case':

':

{

if(c=fgetc(fileP)=='=')

cout<<"(18,:

=)"<

else

{

cout<<"(17,"<

fseek(fileP,-1,SEEK_CUR);

}

break;

}

case'<':

{

c=fgetc(fileP);

if(c=='=')

cout<<"(22,<=)"<

elseif(c=='>')

cout<<"(21,<>)"<

else

{

cout<<"(20,<)"<

fseek(fileP,-1,SEEK_CUR);

}

break;

}

case'>':

{

c=fgetc(fileP);

if(c=='=')

cout<<"(24,>=)"<

else

{

cout<<"(23,>)"<

fseek(fileP,-1,SEEK_CUR);

}

break;

}

case'=':

cout<<"(25,=)"<

break;

case';':

cout<<"(26,;)"<

break;

case'(':

cout<<"(27,()"<

break;

case')':

cout<<"(28,))"<

break;

case'#':

cout<<"(0,#)"<

break;

default:

cout<<"FOUNDERROR!

"<

}

}

}

}

intmain()

{

FILE*fileP;

fileP=fopen("test.txt","r");

cout<<"------词法分析如下------"<

analyse(fileP);

return0;

}

 

实验二

/*

一、题目

编制递归下降法的语法分析程序

二、目的

通过设计、编制、调试一个典型的语法分析程序,能识别由加+、乘*、括号()、操作数所组成的算术表达式,其文法如下:

E→TE'

E'→+TE'∣ε

T→FT'

T'→*FT'∣ε

F→(E)∣i

三、要求

1.程序功能(举例)

输入:

#i1*(i2+i3)#

输出:

SUCCESS

输入:

#i1*(i2+i3#

输出:

FOUNDERROR

*/

实验代码:

#include

#include

usingnamespacestd;

FILE*fileP;

chara[100];

voidEe();

voidT();

voidTt();

voidF();

voidE();

inti=0;

intj=0;

intflag=0;

boolisLetter(charc)//是否为字母

{

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

returntrue;

else

returnfalse;

}

boolisDigit(charc)//是否为数字

{

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

returntrue;

else

returnfalse;

}

voidread()

{

if(fgetc(fileP)=='#')

{

charc=fgetc(fileP);

while(c!

='#')

{

a[j++]=c;

c=fgetc(fileP);

}

}

}

 

voidE()

{

T();

Ee();

}

voidEe()

{

if(a=='+')

{

i++;

T();

Ee();

}

}

voidT()

{

F();

Tt();

}

voidTt()

{

if(a=='*')

{

i++;

F();

Tt();

}

}

voidF()

{

charc=a;

if(isLetter(c))

{

while(isDigit(c)||isLetter(c))

{

i++;

c=a;

}

}

elseif(isDigit(c))

{

while(isDigit(c))

{

i++;

c=a;

}

}

elseif(c=='(')

{

i++;

E();

if(a==')')

{

}

else

flag=1;

}

else

flag=1;

}

 

voidmain()

{

if((fileP=fopen("test.txt","r"))==NULL)

{

cout<<"请创建test.txt资源文件"<

}

else

{

read();

cout<<"------test文件词法分析结果如下------"<

E();

if(flag==0)

cout<<"success"<

else

cout<<"faild"<

cout<<"----------------------------"<

}

if((fileP=fopen("test.txt","r"))==NULL)

{

cout<<"请创建test2.txt资源文件"<

}

else

{

read();

cout<<"------test2文件词法分析结果如下------"<

E();

if(flag==0)

cout<<"success"<

else

cout<<"faild"<

cout<<"----------------------------"<

}

}

 

请自行新建test.txt

"<

                        fseek(fileP,-1,SEEK_CUR);

                    }

                    break;

                }

            case'<':

                {

                    c=fgetc(fileP);

                    if(c=='=')

                        cout<<"(22,<=)"<

                    elseif(c=='>')

                        cout<<"(21,<>)"<

                    else

                    {

                        cout<<"(20,<)"<

                        fseek(fileP,-1,SEEK_CUR);

                    }

                    break;

                }

            case'>':

                {

                    c=fgetc(fileP);

                    if(c=='=')

                        cout<<"(24,>=)"<

                    else

                    {

                        cout<<"(23,>)"<

                        fseek(fileP,-1,SEEK_CUR);

                    }

                    break;

                }

            case'=':

                cout<<"(25,=)"<

                break;

            case';':

                cout<<"(26,;)"<

                break;

            case'(':

                cout<<"(27,()"<

                break;

            cas

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 营销活动策划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1