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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

pl/0词法分析器

發布時間:2025/6/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pl/0词法分析器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


下面是這個分析器的功能:

1、 ? ?待分析的簡單語言的詞法

(1)??? 關鍵字:

begin? if?? then?? while?? do?? end

所有關鍵字都是小寫。

(2)??? 運算符和界符:

:= ??+?? –?? *?? /?? <?? <=?? <>?? >?? >=?? =?? ;?? (?? )?? #

(3)??? 其他單詞是標識符(ID)和整型常數(NUM),通過以下正規式定義:

ID=letter(letter| digit)*

NUM=digit digit *

(4)??? 空格由空白、制表符和換行符組成。空格一般用來分隔ID、NUM,運算符、界符和關鍵字,詞法分析階段通常被忽略。

2、 ?各種單詞符號對應的種別碼

詞法分析程序的功能

輸入:所給文法的源程序字符串。

輸出:二元組(syn,token或sum)構成的序列。

其中:syn為單詞種別碼;

token為存放的單詞自身字符串;

sum為整型常數。







#include <iostream> #include <fstream> #include <string> #include <windows.h>using namespace std;#define CODE "E:\\code\\code.txt" #define RESULT "E:\\code\\result.txt"//token數組用來接收關鍵字,變量,運算符和界符 //這里限制變量名的長度最多為9 //prog數組存儲的是源代碼字符串長度 char *prog, token[10]; char ch; //syn是各個單詞符號對應的數字 int syn, p, m = 0, n, line, sum = 0; //rwtab數組存儲的是關鍵字 char *rwtab1[10] = { "begin","if","then","while","do","end" }; char *rwtab2[4] = { "const","var","procedure","call" };void scaner() {//規定,標識符只能由字母或數字構成/*共分為三大塊,分別是標示符、數字、符號,對應下面的 if else if 和 else*///將全部置空for (n = 0; n<10; n++)//token為已捕獲的字符數token[n] = NULL;ch = prog[p++];//這樣處理,可以去除空格while (ch == ' '){ch = prog[p];p++;}//在這個if判斷中,范圍是a-z或者A-Z,因為規定變量只能以字母開頭if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z')) //可能是標示符或者變量名{m = 0;//這里,是變量的第一個字符以后,可以是字母,數字while ((ch >= '0'&&ch <= '9') || (ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z')){token[m++] = ch;ch = prog[p++];}//變量的字符串結束標志token[m++] = '\0';p--;syn = 10;//將識別出來的字符和已定義的標示符作比較, 判斷是否是關鍵字,所有關鍵字都是小寫for (n = 0; n<6; n++)if (strcmp(token, rwtab1[n]) == 0){syn = n + 1;break;}for (n = 0; n < 4;n++){if (strcmp(token, rwtab2[n]) == 0){syn = n + 31;break;}}}else if ((ch >= '0'&&ch <= '9')) //數字 ,如果是數字,就用sum來保存這個數字{sum = 0;while ((ch >= '0'&&ch <= '9')){//這里*10是只考慮十進制數sum = sum * 10 + ch - '0';ch = prog[p++];}p--;syn = 11;//可接收的數字的最大值為32767,如果更大,會報錯if (sum>32767)syn = -1;}else switch (ch) //如果是其他的字符{case '<':m = 0;token[m++] = ch;ch = prog[p++];if (ch == '>'){//說明是不等號syn = 21;token[m++] = ch;}else if (ch == '='){//說明是<=syn = 22;token[m++] = ch;}else{//否則,就只是一個<符號syn = 23;//此時p回退一個p--;}break;case '>':m = 0;token[m++] = ch;ch = prog[p++];if (ch == '='){syn = 24;token[m++] = ch;}else{syn = 20;p--;}break;case ':':m = 0;token[m++] = ch;ch = prog[p++];if (ch == '='){//說明是賦值運算符syn = 18;token[m++] = ch;}else{//否則就只是個:syn = 17;p--;}break;case '*':syn = 13;token[0] = ch;break;case '/':syn = 14;token[0] = ch;break;case '+':syn = 15;token[0] = ch;break;case '-':syn = 16;token[0] = ch;break;case '=':syn = 25;token[0] = ch;break;case ';':syn = 26;token[0] = ch;break;case '(':syn = 27;token[0] = ch;break;case ')':syn = 28;token[0] = ch;break;case ',':syn = 29;token[0] = ch;break;case '!':syn = 30;token[0] = ch;break;case '.'://如果接收到的是.,說明到了源代碼的結尾,置syn=0,函數結束syn = 0;token[0] = ch;break;case '\n'://如果接收到的是換行符,則syn=-2,行+1syn = -2;break;default://如果接收到的是其他未定義的字符,置syn=-1,會報錯。syn = -1;break;} }/* 讀取源代碼文件(.txt) */ void read() {FILE *fp;fp = fopen(CODE, "r");fseek(fp, 0, SEEK_END);int file_size;file_size = ftell(fp);fseek(fp, 0, SEEK_SET);prog = (char *)malloc(file_size * sizeof(char));fread(prog, file_size, sizeof(char), fp);//關閉文件流fclose(fp); }int main() {int p = 0;int line = 1;ofstream outfile(RESULT);cout<< "加載代碼文件中......" << endl;Sleep(3000);//讀取源代碼文件read();p = 0;outfile << "詞法分析的結果為:" << endl;do{scaner();switch (syn){case 11://cout << "(" << syn << "," << sum << ")" << endl;outfile << "(" << syn << "," << sum << ")" << endl;break;case -1://cout << "Error in line " << line << "!" << endl;outfile << "Error in line" << line << "!" << endl;break;case -2:line = line++;break;default://cout << "(" << syn << "," << token << ")" << endl;outfile << "(" << syn << "," << token << ")" << endl;break;}} while (syn != 0);outfile.close();cout << "詞法分析完畢,請在result.txt中查看" << endl;system("pause");return 0; }

pl/0 程序


var m, n, r, q; procedure gcd; begin while r#0 do begin q := m / n; r := m - q * n; m := n; n := r; end; end; begin read(m); read(n); if m < n then begin r := m; m := n; n := r; end; begin r:=1; call gcd; write(m); end; end.
輸出結果


# # using---->25 namespace---->25 std---->25 ;------->41 int---->7 main---->1 (------->42 )------->43 const---->18 string---->25 str---->25 =------->38 hello---->25 ;------->41 const---->18 string---->25 str2---->25 =------->38 world---->25 ;------->41 string---->25 n_str---->25 ;------->41 n_str---->25 =------->38 str---->25 ;------->41 n_str---->25 +------->27 =------->38 str2---->25 ;------->41 cout---->25 <------>33 <------>33 n_str---->25 <------>33 <------>33 endl---->25 ;------->41 return---->17 0------>26 ;------->41





總結

以上是生活随笔為你收集整理的pl/0词法分析器的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 337p亚洲精品色噜噜噜 | 久久露脸国语精品国产 | 国产精品99久久久久久久久久久久 | 中国一及毛片 | 蜜臀av免费一区二区三区水牛 | 伊人精品 | 国产成人一区二区三区视频 | www.成人在线观看 | 91中文字幕视频 | 韩国一级一片高清免费观看 | 都市激情亚洲 | 欧美激情精品久久久久久变态 | 北条麻妃一区二区三区四区五区 | 国产高潮又爽又无遮挡又免费 | 日本精品成人 | 男人插女人下面视频 | 日韩美女三级 | 亚洲国产丝袜 | 综合激情亚洲 | 日韩a级片在线观看 | 韩国明星乱淫(高h)小说 | 国模丫头1000人体 | 欧美成人精品一区二区男人看 | 国产成人精品二区三区亚瑟 | 三度诱惑免费版电影在线观看 | 国模精品视频一区二区 | 狠狠躁夜夜躁av无码中文幕 | 欧美一级全黄 | 日韩极品在线观看 | 久久不射视频 | 大尺度一区二区 | 欧美日韩中文字幕一区 | 黄色国产一区二区 | 国产麻豆剧传媒精品国产 | 特黄视频免费看 | 北条麻妃在线一区二区 | 亚洲精品国产日韩 | 毛片在线免费播放 | 奇米影视欧美 | 婷婷六月丁 | 欧美日韩在线观看一区 | 在线观看亚洲欧美 | 亚洲网在线 | 91看篇| 欧美888| 午夜在线一区二区三区 | 干成人网 | 伊人超碰在线 | 在线免费视频 | 妹子干综合 | 日韩av在线一区二区 | 亚洲免费av在线 | 久久艹在线 | 天天色成人 | 毛片毛片毛片毛片毛片毛片 | 国产精品视频999 | 国产欧美一区二区三区鸳鸯浴 | 欧美一级淫片 | 色噜噜狠狠狠综合曰曰曰88av | 先锋av资源网 | 在线看的av网站 | 成人免费毛片xxx | 日韩视频在线免费播放 | 美女超碰在线 | 一区二区三区精彩视频 | 农民人伦一区二区三区 | 中出白浆| 阿v视频在线免费观看 | av成人免费在线观看 | 免费日韩av | 美女无遮挡网站 | 欧美熟妇激情一区二区三区 | 美女福利视频在线观看 | 狠狠爱免费视频 | 久久99深爱久久99精品 | 欧洲亚洲一区 | 精品一二三四 | 国产精品尤物视频 | 欧美日韩黄| 网友自拍第一页 | 日本一二三区不卡 | 中文字幕日韩欧美一区二区三区 | av片子在线观看 | 日本久久免费 | 91cn.com| 欧美变态视频 | 女生下面流水视频 | 潮喷失禁大喷水无码 | 99re只有精品| www.国产毛片| 国产超级av在线 | 日韩国产一区 | 蜜乳av中文字幕 | 天天综合天天添夜夜添狠狠添 | 巨胸大乳www视频免费观看 | 日韩在线第一区 | 亚洲成人中文字幕 | 亚洲精品乱码 | 国产成年网站 |