日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

089-袁佳鹏-实验报告1

發(fā)布時間:2025/7/25 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 089-袁佳鹏-实验报告1 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

實(shí)驗(yàn)一、詞法分析實(shí)驗(yàn)

專業(yè):商業(yè)軟件工程?? 姓名:袁佳鵬? 學(xué)號:201506110089

一、??????? 實(shí)驗(yàn)?zāi)康?/strong>

(1)??? 理解詞法分析在編譯程序中的作用。

(2)??? 加深對有窮自動機(jī)模型的理解。

(3)??? 掌握詞法分析程序的實(shí)現(xiàn)方法。

(4)??? 用C語言對一個簡單語言的子集編制一個一遍掃錨的編譯理解,掌握編譯程序的實(shí)現(xiàn)方法和技術(shù)。

二、??????? 實(shí)驗(yàn)內(nèi)容和要求

1,待分析的簡單語言的詞法

2,各種單詞符號對應(yīng)的種別碼。

3,詞法分析程序的功能(輸入,輸出)。

三、??????? 實(shí)驗(yàn)方法、步驟及結(jié)果測試

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

char TOken[10];//分開進(jìn)行比較

char ch;

/*char rwtab[6]={"begin","if","then","while","do","end"};*/

char r1[]={"auto"};

char r2[]={"break"};

char r3[]={"case"};

char r4[]={"char"};

char r5[]={"const"};

char r6[]={"continue"};

char r7[]={"default"};

char r8[]={"do"};

char r9[]={"double"};

char r10[]={"else"};

char r11[]={"enum"};

char r12[]={"extern"};

char r13[]={"float"};

char r14[]={"for"};

char r15[]={"goto"};

char r16[]={"if"};

char r17[]={"int"};

char r18[]={"long"};

char r19[]={"register"};

char r20[]={"return"};

char r21[]={"short"};

char r22[]={"signed"};

char r23[]={"sizeof"};

char r24[]={"static"};

char r25[]={"struct"};

char r26[]={"switch"};

char r27[]={"typedef"};

char r28[]={"union"};

char r29[]={"unsigned"};

char r30[]={"void"};

char r31[]={"volatile"};

char r32[]={"while"};

char r33[]={"end"};

char r34[]={"include"};

char r35[]={"stdio"};

char r36[]={"string"};

char r37[]={"main"};

char r38[]={"stdlib"};//這是我定義的

char A[10000];//輸入的所有值

int syn,row;

int n,m,p,sum,j;

static int i = 0;

?

?

void scaner()

{

/*

共分為三大塊,分別是標(biāo)示符、數(shù)字、符號,對應(yīng)下面的 if else if 和 else

?

?

*/

for(n=0;n<7;n++)

TOken[n]=0;//每次循環(huán)完就清零

ch=A[i];

while(ch==' '||ch=='\n')//如果字符是空格或者回車,跳過

{

i++;

ch=A[i];

}

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是標(biāo)示符或者變量名

{

m=0;

while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//找到一個變量名或者關(guān)鍵字,直到遇到空格為止

{

TOken[m]=ch;m++;

i++;ch=A[i];

}

TOken[m]='\0';

//將識別出來的字符和已定義的標(biāo)示符作比較, //因?yàn)槎x的begin為1,if為2......

if(strcmp(TOken,r1)==0){syn=1;}

else if(strcmp(TOken,r2)==0){syn=2; }

else if(strcmp(TOken,r3)==0){syn=3;}

else if(strcmp(TOken,r4)==0){syn=4;}

else if(strcmp(TOken,r5)==0){syn=5;}

else if(strcmp(TOken,r6)==0){syn=6;}

else if(strcmp(TOken,r7)==0){syn=7;}

else if(strcmp(r8,TOken)==0){syn=8;}

else if(strcmp(r9,TOken)==0){syn=9;}

else if(strcmp(r10,TOken)==0){syn=10;}

else if(strcmp(r11,TOken)==0){syn=11;}

else if(strcmp(r12,TOken)==0){syn=12;}

else if(strcmp(r13,TOken)==0){syn=13;}

else if(strcmp(r14,TOken)==0){syn=14;}

else if(strcmp(r15,TOken)==0){syn=15;}

else if(strcmp(r16,TOken)==0){syn=16;}

else if(strcmp(r17,TOken)==0){syn=17;}

else if(strcmp(r18,TOken)==0){syn=18;}

else if(strcmp(r19,TOken)==0){syn=19;}

else if(strcmp(r20,TOken)==0){syn=20;}

else if(strcmp(r21,TOken)==0){syn=21;}

else if(strcmp(r22,TOken)==0){syn=22;}

else if(strcmp(r23,TOken)==0){syn=23;}

else if(strcmp(r24,TOken)==0){syn=24;}

else if(strcmp(r25,TOken)==0){syn=25;}

else if(strcmp(r26,TOken)==0){syn=26;}

else if(strcmp(r27,TOken)==0){syn=27;}

else if(strcmp(r28,TOken)==0){syn=28;}

else if(strcmp(r29,TOken)==0){syn=29;}

else if(strcmp(r30,TOken)==0){syn=30;}

else if(strcmp(r31,TOken)==0){syn=31;}

else if(strcmp(r32,TOken)==0){syn=32;}

else if(strcmp(r33,TOken)==0){syn=33;}

else if(strcmp(r34,TOken)==0){syn=34;}

else if(strcmp(r35,TOken)==0){syn=35;}

else if(strcmp(r36,TOken)==0){syn=36;}

else if(strcmp(r37,TOken)==0){syn=37;}

else if(strcmp(r38,TOken)==0){syn=38;}

else{syn=100;} //變量名

}

else if((ch>='0'&&ch<='9')) //數(shù)字

{

sum=0;

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

{

sum=sum*10+ch-'0';//顯示其數(shù)字sum

i++;

ch=A[i];

}

syn=40;

}

else switch(ch) //其他字符

{

case'<':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')//<>為22

{

syn=41;

TOken[m]=ch;m++;i++;

}

else

{

syn=46;

}

break;

case'>':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')

{

syn=42;

TOken[m]=ch;m++;i++;

}

else

{

syn=47;

}

break;

case':':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')

{

syn=44;

TOken[m]=ch;m++;i++;

}

else

{

syn=49;

}

break;

case'@':syn=0;TOken[0]=ch;i++;break;

case'=':syn=48;TOken[0]=ch;i++;break;

case'#':syn=50;TOken[0]=ch;i++;break;

case'+':syn=50;TOken[0]=ch;i++;break;

case'-':syn=51;TOken[0]=ch;i++;break;

case'*':syn=52;TOken[0]=ch;i++;break;

case'/':syn=53;TOken[0]=ch;i++;break;

case'(':syn=54;TOken[0]=ch;i++;break;

case')':syn=55;TOken[0]=ch;i++;break;

case'{':syn=56;TOken[0]=ch;i++;break;

case'}':syn=57;TOken[0]=ch;i++;break;

case';':syn=58;TOken[0]=ch;i++;break;

case'.':syn=59;TOken[0]=ch;i++;break;

case'\'':syn=60;TOken[0]=ch;i++;break;

case'\n':syn=-2;break;

default: syn=-1;break;

}

}

main()

{

row = 0 ;

p = 0 ;

printf("Please input string:(end of '@')\n");

do

{

scanf("%c",&ch);

A[p]=ch;

p++;

}//輸入值到數(shù)組A【】中,以@結(jié)束

while(ch!='@');

do

{

scaner();//進(jìn)入函數(shù)進(jìn)行判定

switch(syn)

{

case 40: printf("(%d,%d)\n",syn,sum); break;//如果是40,那么就是數(shù)字

case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是@ 結(jié)束

case -2: row=row++;break;

default: printf("(%d,%s)\n",syn,TOken);break;//否則,就是變量名、關(guān)鍵詞

}

}

while (syn!=0);

}

  • 1.????? 源程序名:詞法分析.c
  • ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

  • 2.????? 原理分析及流程圖
  • 主要總體設(shè)計問題。

    (包括存儲結(jié)構(gòu),主要算法,關(guān)鍵函數(shù)的實(shí)現(xiàn)等)

    詞法分析主程序示意圖

    ?

    ?

    ?

    ?

    ?

    ?

  • 3.????? 主要程序段及其解釋:
  • 實(shí)現(xiàn)主要功能的程序段,重要的是程序的注釋解釋。

    void scaner()

    {

    /*

    共分為三大塊,分別是標(biāo)示符、數(shù)字、符號,對應(yīng)下面的 if else if 和 else

    ?

    ?

    */

    for(n=0;n<7;n++)

    TOken[n]=0;//每次循環(huán)完就清零

    ch=A[i];

    while(ch==' '||ch=='\n')//如果字符是空格或者回車,跳過

    {

    i++;

    ch=A[i];

    }

    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是標(biāo)示符或者變量名

    {

    m=0;

    while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//找到一個變量名或者關(guān)鍵字,直到遇到空格為止

    {

    TOken[m]=ch;m++;

    i++;ch=A[i];

    }

    TOken[m]='\0';

    //將識別出來的字符和已定義的標(biāo)示符作比較, //因?yàn)槎x的begin為1,if為2......

    if(strcmp(TOken,r1)==0){syn=1;}

    else if(strcmp(TOken,r2)==0){syn=2; }

    else if(strcmp(TOken,r3)==0){syn=3;}

    else if(strcmp(TOken,r4)==0){syn=4;}

    else if(strcmp(TOken,r5)==0){syn=5;}

    else if(strcmp(TOken,r6)==0){syn=6;}

    else if(strcmp(TOken,r7)==0){syn=7;}

    else if(strcmp(r8,TOken)==0){syn=8;}

    else if(strcmp(r9,TOken)==0){syn=9;}

    else if(strcmp(r10,TOken)==0){syn=10;}

    else if(strcmp(r11,TOken)==0){syn=11;}

    else if(strcmp(r12,TOken)==0){syn=12;}

    else if(strcmp(r13,TOken)==0){syn=13;}

    else if(strcmp(r14,TOken)==0){syn=14;}

    else if(strcmp(r15,TOken)==0){syn=15;}

    else if(strcmp(r16,TOken)==0){syn=16;}

    else if(strcmp(r17,TOken)==0){syn=17;}

    else if(strcmp(r18,TOken)==0){syn=18;}

    else if(strcmp(r19,TOken)==0){syn=19;}

    else if(strcmp(r20,TOken)==0){syn=20;}

    else if(strcmp(r21,TOken)==0){syn=21;}

    else if(strcmp(r22,TOken)==0){syn=22;}

    else if(strcmp(r23,TOken)==0){syn=23;}

    else if(strcmp(r24,TOken)==0){syn=24;}

    else if(strcmp(r25,TOken)==0){syn=25;}

    else if(strcmp(r26,TOken)==0){syn=26;}

    else if(strcmp(r27,TOken)==0){syn=27;}

    else if(strcmp(r28,TOken)==0){syn=28;}

    else if(strcmp(r29,TOken)==0){syn=29;}

    else if(strcmp(r30,TOken)==0){syn=30;}

    else if(strcmp(r31,TOken)==0){syn=31;}

    else if(strcmp(r32,TOken)==0){syn=32;}

    else if(strcmp(r33,TOken)==0){syn=33;}

    else if(strcmp(r34,TOken)==0){syn=34;}

    else if(strcmp(r35,TOken)==0){syn=35;}

    else if(strcmp(r36,TOken)==0){syn=36;}

    else if(strcmp(r37,TOken)==0){syn=37;}

    else if(strcmp(r38,TOken)==0){syn=38;}

    else{syn=100;} //變量名

    }

    else if((ch>='0'&&ch<='9')) //數(shù)字

    {

    sum=0;

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

    {

    sum=sum*10+ch-'0';//顯示其數(shù)字sum

    i++;

    ch=A[i];

    }

    syn=40;

    }

    else switch(ch) //其他字符

    {

    case'<':m=0;TOken[m]=ch;m++;

    i++;ch=A[i];

    if(ch=='=')//<>為22

    {

    syn=41;

    TOken[m]=ch;m++;i++;

    }

    else

    {

    syn=46;

    }

    break;

    case'>':m=0;TOken[m]=ch;m++;

    i++;ch=A[i];

    if(ch=='=')

    {

    syn=42;

    TOken[m]=ch;m++;i++;

    }

    else

    {

    syn=47;

    }

    break;

    case':':m=0;TOken[m]=ch;m++;

    i++;ch=A[i];

    if(ch=='=')

    {

    syn=44;

    TOken[m]=ch;m++;i++;

    }

    else

    {

    syn=49;

    }

    break;

    case'@':syn=0;TOken[0]=ch;i++;break;

    case'=':syn=48;TOken[0]=ch;i++;break;

    case'#':syn=50;TOken[0]=ch;i++;break;

    case'+':syn=50;TOken[0]=ch;i++;break;

    case'-':syn=51;TOken[0]=ch;i++;break;

    case'*':syn=52;TOken[0]=ch;i++;break;

    case'/':syn=53;TOken[0]=ch;i++;break;

    case'(':syn=54;TOken[0]=ch;i++;break;

    case')':syn=55;TOken[0]=ch;i++;break;

    case'{':syn=56;TOken[0]=ch;i++;break;

    case'}':syn=57;TOken[0]=ch;i++;break;

    case';':syn=58;TOken[0]=ch;i++;break;

    case'.':syn=59;TOken[0]=ch;i++;break;

    case'\'':syn=60;TOken[0]=ch;i++;break;

    case'\n':syn=-2;break;

    default: syn=-1;break;

    }

    }

  • 4.????? 運(yùn)行結(jié)果及分析
  • 一般必須配運(yùn)行結(jié)果截圖,結(jié)果是否符合預(yù)期及其分析。

    ?? (截圖需根據(jù)實(shí)際,截取有代表性的測試?yán)?#xff09;

    ?

    ?

    ?

    ?

    四、??????? 實(shí)驗(yàn)總結(jié)

    ?

    心得體會,實(shí)驗(yàn)過程的難點(diǎn)問題及其解決的方法。

    對于詞法分析還不是很熟練,實(shí)驗(yàn)當(dāng)中對于各個標(biāo)識符的辨別有些難度,沒辦法準(zhǔn)確輸出,對于C語言的一些用法由于太久沒用也顯得有一些生疏,整體上來說有很大不足。

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/a13798508446/p/5961105.html

    總結(jié)

    以上是生活随笔為你收集整理的089-袁佳鹏-实验报告1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。