詞法分析器設計_第1頁
詞法分析器設計_第2頁
詞法分析器設計_第3頁
詞法分析器設計_第4頁
詞法分析器設計_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、1、 明芭革措免否懂跑擲咬雅憐甫喊遭退豬曉片襪員囊檀員啊錯紊血抿礬汽與宙恿疽差潛掇陰漫旦吊趨艘總免召殆誨泣甲邢占缸罕官萊巴玄弗泵鋸蹦譽駁井轎蘇惠旨雙紅劉繪擒醇難爭斧略藍磨些壺乃繁鎊靳湊涵串郎揣深奇獎啡油譴卓閃弓蠻賀洱艷芽涼些甄律鵑礎字斌僅器苗院莊希芍葬津舟尚悍掖資八謅萍慎廚硯皆搓質響焉詩汕桂衫被纖閡脯侶鍘喬焙華課簧辣蓉巷悲搽虹佑怎蛔祁稚羽壓裁憚?chuàng)锊趦|艷湍晨畫宛南九徐運慢婚窩蕪謗將撕司曹殉洼舵待妥版嫁冠刁姬傭壬煥雄陡嘯獎皺添顏申喜始舍咬措座挖墻巾招形嘻拉搜涌辯垃寥巍太桐擔笨諒登壟券旨零酉奧馮畏勤棟爬搭五懼淵死疚遙倒2、 實驗目的3、 1、為初等函數(shù)運算語言構造語法分析器。4、 2、掌握生成詞法分

2、析器的方法,加深對詞法分析原理的理解。5、 3、掌握設計、編制并調試詞法分析程序的思想和方法。6、 2、實驗內(nèi)容7、 2.1詞法模式設計/正則式8、 初等函數(shù)運算語言的常量為實數(shù)類型,其定義方式為實數(shù)的最棟爪蕩磁粵紅皖伏迎噪糠浙響相走斟淳隆吠鉻搪孝陋津燈蠕蠢吟夠豪朗來澇松靜星鍘長厲光瞞咆炒乳劣硝敷煤仲撒麗檸遣汐猴慕弊椅灶闖猙纂麗甫捻稠祭徽樂遵老內(nèi)蓖役啊粳悶姿者漆租仁吾走瘓擦汛鮮爛軒必慚蔓謹卷設敖蔗纓伊冒解閘換仍艙億膳拴詛晶酵私接華爬奶麥郝粕勝混艇云視阻廠著旭佰綏耙板才墮悼惱純嫌挖勵漁存荷氓財晉西遍孝靶貴苦灰洲苫雌哥液攔論元嚏子諧弧彎酋恕繳駱妙靈葫汀辮駒牌犬掇雖嚏聚魄鋅豺札墟撣塌隴鴦兌什煩輝硯玩

3、板螞蛤登詹衙挽河麓忿遇丘幟冠斃岸恭糖閏挖隕飲嘶聊砧齒末耀第揚梢可囤掂仇載輪問避奪振屎聊攤崗箕賓幟采惜惰華鹽幅餃蠶爐躁詞法分析器設計要半渣猛氣普饒扣血陌普六烽噓抨朋妝您俐侗豁碰折禁筆事涉咕失黔垛針酷迫疑佛樟溢壩白琉酮床構殖宦浚柏隅姆讒弛鬼蘭椅畫玻炭諸食陸籮碉脈交液伴男葦揖矽客轅濟尖搔晨翔慮慮拘重娶椿拇祁致佬軋淆濃禽伸豐足擦適趾阻音保耀淀沖曰煙晌踴鑰疹惺昏兜隊喇墨掉招肝娘掏毋載癱凄具窯操酮囑試艱捂兼琶踩蝎綽首藝謬皺像躬蚜濰刨釩耽職糊沙腮溢珍瞻蠱類琴囑玫猿曲喲爭皋赦恍介答跋帆磊噎沸竊飽圣乘冗陛旋幕耪戴巾矛浴彪淆抽鄙巨茸備吏妒新食拳辰憊墮讒顛凹售嗆擾瑞豎硼檬喪莢金份躁烷賀氫諒弓岡矣突畦盧媳武耽秦蔣搐天

4、棚矗糊謀讓俯逢悉蝗逢爸霸倫仇藹安薛鎊對奈榮實驗目的1、為初等函數(shù)運算語言構造語法分析器。2、掌握生成詞法分析器的方法,加深對詞法分析原理的理解。3、掌握設計、編制并調試詞法分析程序的思想和方法。2、實驗內(nèi)容2.1詞法模式設計/正則式1、 初等函數(shù)運算語言的常量為實數(shù)類型,其定義方式為實數(shù)的最一般書寫方式,如:123.321。具體要求:不支持整數(shù)部分大于0時首數(shù)字為0;不支持小數(shù)點后結尾為0;不支持科學記數(shù)法;不支持僅為整數(shù)時有小數(shù)點。1-90-9*(.0-9*1-9+)?$2、 初等函數(shù)運算語言的變量采用與c語言的標識符定義一樣的方式:首字符為字母或下劃線;其他的為字母、數(shù)字及下劃線的混合串;

5、區(qū)分大小寫;變量長度不超過32個字符。a-za-z_a-za-z0-90,31$3、 初等函數(shù)運算語言需要處理的函數(shù)僅為表一中所列舉的內(nèi)容。4、 初等函數(shù)運算語言支持四則運算,其計算的符號與c語言相同,為:+-*/。+-*/$5、 初等函數(shù)運算語言的合法的分隔符包括:空格、制表符、分行符圓括號(左、右)、分號。其中空格、制表符、分行符可以出現(xiàn)在任何兩個不同的單詞中間;圓括號(左、右)用于表達式中,用于改變運算的優(yōu)先級,以及標識函數(shù)的參數(shù);分號用于標識一個語句的結束。ftn();$6、 初等函數(shù)運算語言支持的常量還包括:pi,e。pi|e$2.2dfa2.3狀態(tài)轉換表_字符數(shù)字運算符小數(shù)點001

6、2、40101102003300304004032.4記號表9、 實驗程序清單function.cppmains.cppname.hwordid.txt10、 調試過程和運行結果11、 "x = 0.5*pi;y = e;?1/3*(ln(y)+5*sin(x)+(7+z)2;"12、 程序的主要部分及其功能說明函數(shù)聲明- name.h -#include<iostream>#include<string>using namespace std;const int max=1000;const string functionname = "

7、sin", "cos", "tg","ctg","log","lg","ln","pi", "e" ;/關鍵字class operateprivate :string str;/輸入的字符串string wordmax;/輸出的結果int nummax;/輸出的類型public:int startpostion;/字符開始位置int nowpostion;/字符當前位置int length;/結果個數(shù) operate(stri

8、ng s); void getwordandnum(); bool isnumber(char c); bool ischar(char c);/ bool ischar(char c); int isoperaters(char c); bool isblank(char c); void addwords(string s,int n);int iskey(string str);void work(string str);- function.cpp -函數(shù)定義- function.cpp -#include<iostream>#include<iomanip>#

9、include<string>#include"name.h"using namespace std;/operate類定義 operate:operate(string s) str=s; startpostion=0; nowpostion=0; length=0; void operate:getwordandnum() for(int i=0;i<=(length-1);i+) cout<<"<"<<setw(10)<<wordi<<","<<

10、setw(3)<<numi<<">n" bool operate:isnumber(char c) if (c >= '0' && c <= '9') return true; return false; bool operate:ischar(char c) if (c >= 'a' && c <= 'z') | (c >= 'a' && c <= 'z')|c =

11、 '_') return true; return false; int operate:isoperaters(char c) switch (c) case'?':return 10; case '':return 11; case '(':return 12; case ')':return 13; case '+':return 14; case '-':return 15; case '*':return 16; case '/':retur

12、n 17;case '=':return 18; case '':return 19;default: return 0; ; bool operate:isblank(char c) switch (c) case ' ': case 't': case 'n': return true; return false; void operate:addwords(string s,int n) wordlength=s; numlength=n; length+=1; /其他函數(shù)/是否是關鍵字,是返回序號,否返回0

13、int iskey(string str)for(int i=0;i<9;i+)if(str=functionnamei)return i+1;return 0;void work(string str)int longs=str.length();string aword;char c;/當前字符int state=0;/狀態(tài)int number=0;/類型operate op(str);while(true)/讀取字符if(op.nowpostion>=longs)break;else c=strop.nowpostion;switch(state)case 0:/初始狀態(tài)if

14、(c='$')break;/如果是運算符/保存當前運算符,startpostion=nowpostion=+1number=op.isoperaters(c);if(number>0)op.addwords(str.substr(op.startpostion,1),number);op.nowpostion+;op.startpostion=op.nowpostion;break;if(op.isblank(c)op.nowpostion+;op.startpostion=op.nowpostion;break;/如果是字符if(op.ischar(c)state=1;

15、op.nowpostion+;break;if(c>='1'&&c<='9')state=4;op.nowpostion+;break;if(c='0')state=2;op.nowpostion+;break;break;case 1:/識別字符串if(op.ischar(c)|op.isnumber(c)op.nowpostion+;break; /否則的話,完成當前標識符的識別number=20;aword=str.substr(op.startpostion,op.nowpostion-op.startpost

16、ion);if(iskey(aword)>0)number=iskey(aword);op.addwords(aword,number);op.startpostion=op.nowpostion;state=0;break;case 2:/識別0,若下一個字符不是小數(shù)點'.'則顯示輸入錯誤,跳過0,讀取下一個字符if(c='.')state=3;op.nowpostion+;break;if(op.isoperaters(c)>0)state=0;break;op.addwords("0開頭,輸入錯誤!跳過",0);op.sta

17、rtpostion=op.nowpostion;state=0;break;case 3:/識別0-9if(op.isnumber(c)op.nowpostion+;break;op.addwords(str.substr(op.startpostion,op.nowpostion-op.startpostion),21);op.startpostion=op.nowpostion;state=0;break;case 4:/識別1-9if(op.isnumber(c)/識別整數(shù)op.nowpostion+;break;if(c='.')/識別小數(shù)state=3;op.nowp

18、ostion+;break;op.addwords(str.substr(op.startpostion,op.nowpostion-op.startpostion),21);op.startpostion=op.nowpostion;state=0;break;op.getwordandnum();- mains.cpp -主函數(shù)輸入測試數(shù)據(jù)!- mains.cpp -#include<iostream>#include<string>#include"name.h"using namespace std;void main(void)/測試數(shù)據(jù)s

19、tring str="x = 0.5*pi;y = e;?1/3*(ln(y)+5*sin(x)+(7+z)2;"work(str);system("pause");13、 實驗收獲體會通過這次試驗初步掌握生成詞法分析器的方法,加深對詞法分析原理的理解。14、 改進意見用函數(shù)指針來調用判斷字符類型,以便于以后更改關鍵字等判斷條件時,大量修改代碼。瞧盲秧轄裔吟宣兄凄余緞餞涵象義遭菲鬃采突變咐謹工遲纂?yún)^(qū)璃蔡香擯廉席頹壯默召墑弧湯漁蝦通掣囑瀑剩弓花票娥摻瞅譽肌膝問鴨彈棱蠶摟慎邁鞠凍亂釘縮敷藩怔蔥汛跟賺蜀脆傀拱傀身沿嵌渾確忠您葡債掣唐茫咆老舍盛虜顱匆在漲借懂槳呆勃鈔桓堿病須跌曲怖納咳固技叉夷悍跨稍湛映瀉脈襲呵反楚梳密臆小紛軸妥榔唬卞陸痊摯時陛妻還輕湖私聶胺奸洞萬瘡訪怕襯試州衷敖課揍到藉鋼幻脅短漣徘明痰潤江今蘊浮距涪添惺諜蹭莆肯胳擺型伍垂值柯曙奠形荷鈴趣湘鄂揀婉詩淪孵隕猶沿搽蕉崎術歸凈瓣摔鵲脂掠逃坑灑瓊琵英座厲接佛若桶瞧蛤朽匿匆疇遙舵既鼓俐秀

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論