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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编译原理【实验1——扫描器的设计与实现】

發布時間:2024/9/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译原理【实验1——扫描器的设计与实现】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 掃描器設計與編程實現(掃描器的設計與實現)
  • NFA確定化算法設計與編程實現(NFA確定化(選做))
  • 遞歸下降分析器設計與實現(預測分析方法設計與實現)
  • 算符優先分析法設計與實現(算符優先分析程序設計實現
  • 目錄

    一、實驗目的

    二、實驗內容

    三、實驗過程與結果

    實驗代碼

    data.txt文件

    代碼運行截圖

    四、總結與體會


    一、實驗目的

    通過設計、編制并調試一個具體的詞法分析程序,加深對詞法分析原理的理解。掌握在對程序設計語言源程序進行掃描過程中,將其分解為各類單詞的詞法分析方法。

    理解詞法分析在編譯程序中的作用;加深對有窮自動機模型的理解;掌握詞法分析程序的實現方法和技術。

    二、實驗內容

    自定義一種程序設計語言,或者選擇已有的一種高級語言,編制它的詞法分析程序。詞法分析程序的實現可以采用任何一種編程語言和編程工具。

    設計詞法分析程序,從輸入的源程序中,識別出各個具有獨立意義的單詞,即關鍵字、標識符、常數、運算符、界符,并依次輸出各個單詞的內部編碼及單詞符號自身值(遇到錯誤時可顯示“Error”,然后跳過錯誤部分繼續顯示)。

    (軟件、硬件)環境:

    軟件環境:Visual Studio Code、CodeBlocks 17.12 編寫、調試并執行實驗代碼

    硬件環境:“Windows 10教育版”計算機

    三、實驗過程與結果

    修改課本P212表C.1,將其擴充為C語言的保留字表,如下所示:

    char *rwtab[] = {"int", "long", "short", "float", "double", "char", "unsigned", "signed", "const", "void", "volatile", "enum", "struct", "union","if", "else", "goto", "switch", "case", "do", "while", "for", "continue", "break", "return", "default", "typedef","auto", "register", "extern", "static", "sizeof", "begin", "then", "end", "cout", "main", _KEY_WORD_END};

    實驗代碼

    參考P212附錄C,編寫源程序,實驗代碼如下所示:

    /*需要的庫和全局變量、函數及主程序*/ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #define _KEY_WORD_END "waiting for your expanding"using namespace std;typedef struct //詞的結構,二元組形式(單詞種別,單詞自身的值) {int typenum; //單詞種別char *word; } WORD; char input[255]; char token[255] = ""; int p_input; //指針 int p_token; char ch; char *rwtab[] = {"int", "long", "short", "float", "double", "char", "unsigned", "signed", "const", "void", "volatile", "enum", "struct", "union","if", "else", "goto", "switch", "case", "do", "while", "for", "continue", "break", "return", "default", "typedef","auto", "register", "extern", "static", "sizeof", "begin", "then", "end", "cout", "main", _KEY_WORD_END}; WORD *scanner(); //掃描 int main() {int over = 1;WORD *oneword = new WORD;//實現從文件讀取代碼段cout << "read something from data.txt" << endl;FILE *fp;if ((fp = freopen("data.txt", "r", stdin)) == NULL){printf("Not found file!\n");return 0;}else{while ((scanf("%[^#]s", &input)) != EOF){p_input = 0;printf("your words:\n%s\n", input);while (over < 1000 && over != -1){oneword = scanner();if (oneword->typenum < 1000){if (oneword->typenum != 999)cout << "[ " << oneword->typenum << "\t" << oneword->word << " ]" << endl;}over = oneword->typenum;}scanf("%[^#]s", input);}}return 0; } //從輸入緩沖區讀取一個字符到ch中 char m_getch() {ch = input[p_input];p_input++; // p_input = p_input + 1;return (ch); } //去掉空白符號 void getbc() {while (ch == ' ' || ch == 10){ch = input[p_input];p_input++; // p_input = p_input + 1;} } //拼接單詞 void concat() {token[p_token] = ch;p_token++; // p_token = p_token + 1;token[p_token] = '\0'; } //判斷是否字母 int letter() {if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')return 1;elsereturn 0; } //判斷是否數字 int digit() {if (ch >= '0' && ch <= '9')return 1;elsereturn 0; }//檢索關鍵字表格 int reserve() {int i = 0;while (strcmp(rwtab[i], _KEY_WORD_END)){if (!strcmp(rwtab[i], token))return i + 1;i++;}return 10; // 如果不是關鍵字,則返回種別碼10 } //回退一個字符 void retract() {p_input--; // p_input = p_input - 1; }//詞法掃描程序 WORD *scanner() {WORD *myword = new WORD;myword->typenum = 10; // 初始值myword->word = "";p_token = 0; //單詞緩沖區指針m_getch();getbc(); //去掉空白if (letter()) //判斷讀取到的首字母是字母{//如intwhile (letter() || digit()){concat(); //連接m_getch();}retract(); //回退一個字符myword->typenum = reserve(); //判斷是否為關鍵字,返回種別碼myword->word = token;return (myword);}else if (digit()) //判斷讀取到的單詞首字符是數字{while (digit()) //所有數字連接起來{concat();m_getch();}retract();//數字單詞種別碼統一為20,單詞自身的值為數字本身myword->typenum = 20;myword->word = token;return (myword);}elseswitch (ch){case '=':m_getch(); //首字符為=,再讀取下一個字符判斷if (ch == '='){myword->typenum = 39;myword->word = "==";return (myword);}retract(); //讀取到的下個字符不是=,則要回退,直接輸出=myword->typenum = 21;myword->word = "=";return (myword);break;case '+':myword->typenum = 22;myword->word = "+";return (myword);break;case '-':myword->typenum = 23;myword->word = "-";return (myword);break;case '/': //讀取到該符號之后,要判斷下一個字符是什么符號,判斷是否為注釋m_getch(); //首字符為/,再讀取下一個字符判斷if (ch == '*') // 說明讀取到的是注釋{m_getch();while (ch != '*'){m_getch(); //注釋沒結束之前一直讀取注釋,但不輸出if (ch == '*'){m_getch();if (ch == '/') //注釋結束{myword->typenum = 999;myword->word = "注釋";return (myword);break;}}}}else{retract(); //讀取到的下個字符不是*,即不是注釋,則要回退,直接輸出/myword->typenum = 25;myword->word = "/";return (myword);break;}case '*':myword->typenum = 24;myword->word = "*";return (myword);break;case '(':myword->typenum = 26;myword->word = "(";return (myword);break;case ')':myword->typenum = 27;myword->word = ")";return (myword);break;case '[':myword->typenum = 28;myword->word = "[";return (myword);break;case ']':myword->typenum = 29;myword->word = "]";return (myword);break;case '{':myword->typenum = 30;myword->word = "{";return (myword);break;case '}':myword->typenum = 31;myword->word = "}";return (myword);break;case ',':myword->typenum = 32;myword->word = ",";return (myword);break;case ':':m_getch();if (ch == '='){myword->typenum = 18;myword->word = ":=";return (myword);break;}else{retract();myword->typenum = 33;myword->word = ":";return (myword);break;}case ';':myword->typenum = 34;myword->word = ";";return (myword);break;case '>':m_getch();if (ch == '='){myword->typenum = 37;myword->word = ">=";return (myword);break;}retract();myword->typenum = 35;myword->word = ">";return (myword);break;case '<':m_getch();if (ch == '='){myword->typenum = 38;myword->word = "<=";return (myword);break;}else if (ch == '<'){myword->typenum = 42;myword->word = "<<";return (myword);break;}else{retract();myword->typenum = 36;myword->word = "<";return (myword);}case '!':m_getch();if (ch == '='){myword->typenum = 40;myword->word = "!=";return (myword);break;}retract();myword->typenum = -1;myword->word = "ERROR";return (myword);break;case ' " ':myword->typenum = 41;myword->word = " \" ";return (myword);break;case '\0':myword->typenum = 1000;myword->word = "OVER";return (myword);break;case '#':myword->typenum = 0;myword->word = "#";return (myword);break;default:myword->typenum = -1;myword->word = "ERROR";return (myword);break;} }

    data.txt文件

    int main() {int a = 1, b = 2;b / a;/*測試注釋和除號*/b > a;cout << "lwx!!!" << endl;return 0; }

    data.txt 文件截圖:

    ?

    代碼運行截圖

    詞法分析器,實驗運行截圖:

    四、總結與體會

    此次實驗,參照課本編寫了掃描器的設計,并將其實現。實驗過程中,遇到了諸多困難,但都一一解決,加深了我對課本概念的理解,收獲甚多。

    使用文件操作的方式,從data.txt文件中讀入要分析的程序,C語言中的文件操作并不難以實現,使用文件操作可以提升用戶的體驗感。編程時,將各個基本功能用函數來實現,使得程序的條理性增強了;全局變量的使用也使得數據在函數間的傳遞更加方便。

    本次實驗結合書本上的理論知識,我進一步了解詞法分析程序構造的一些細節。在實驗中,發現了自身的許多不足,課下我會多加努力。

    總結

    以上是生活随笔為你收集整理的编译原理【实验1——扫描器的设计与实现】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 可乐操亚洲 | 理想之城连续剧40集免费播放 | www.夜夜夜 | 伊人久久大香线蕉av一区 | 在线观看亚洲国产 | 国产精品免费视频一区二区 | 中国国产bdsm紧缚捆绑 | 在线看毛片网站 | 免费视频网站www | 国产欧美综合一区二区三区 | 97国产| 男人添女人囗交视频 | 国产福利视频一区 | 黄色福利网 | 日韩av在线免费观看 | 黄色网址中文字幕 | 日韩新片王网 | 波多野结衣久久精品 | 深夜成人在线 | 性欧美在线 | 亚洲成av人在线观看 | 中文字幕亚洲区 | 秋霞电影一区二区 | 日日爽夜夜爽 | free性欧美hd另类 | 兄弟兄弟全集免费观看 | 国产精品一区二区三区四区五区 | 无码精品一区二区三区AV | 欧美日韩免费在线观看 | 亚洲1234区| 影音先锋在线视频观看 | 一区二区精品视频在线观看 | 波多野结衣欲乱上班族 | 亚洲一区h| 国产人妻一区二区三区四区五区六 | 中日韩精品在线 | 日本一区二区成人 | 91老师国产黑色丝袜在线 | 精品在线不卡 | 欧美无人区码suv | 国产一区二区三区麻豆 | 亚洲人妻一区二区三区 | 婷婷在线免费观看 | 爽爽窝窝午夜精品一区二区 | 粉嫩av一区二区夜夜嗨 | 很黄很黄的网站 | 免费大片av | 国内毛片毛片毛片毛片毛片 | 久久久久国产视频 | 国产理论在线 | 伊人二区 | 大黄一级片 | 五月婷婷六月丁香 | 成人高潮片免费视频 | a级成人毛片 | 日本电影一区 | 少妇又色又紧又大爽又刺激 | 欧美高清性xxxx | 日韩av中文| 梦梦电影免费高清在线观看 | 午夜爽爽视频 | 天天干天天爽天天射 | av片子在线观看 | 免费av在线 | www.美色吧.com | 亚洲区免费 | 国产艳妇疯狂做爰视频 | 97超碰在线免费观看 | 五月天综合视频 | 黑丝袜av | 免费拍拍拍网站 | 国产三级观看 | 在线观看中文字幕一区 | 美女扒开腿让人桶爽 | 视频国产一区 | 91麻豆蜜桃| 色呦呦在线观看视频 | 成人免费视频国产 | 亚洲免费色 | www.色在线 | 午夜爱爱网 | 伊人久久综合影院 | 久久99精品国产.久久久久 | 国产无遮挡一区二区三区毛片日本 | 脱裤吧导航 | 欧美高清视频一区二区三区 | 精品国语对白 | 国产youjizz| 久久综合成人网 | 色哟哟入口国产精品 | 久久久九九九热 | 亚洲hhh| 一级黄色片免费 | 亚洲色图第1页 | 中国一级特黄真人毛片免费观看 | 五个女闺蜜把我玩到尿失禁 | 日韩综合网站 | 欧美一二三级 | 久久免费少妇高潮久久精品99 |