軟體學院
《編譯原理》實驗報告
題目詞法、語法分析
專業軟體工程
班級rb軟體w101
學號201007104141
學生姓名田博
指導教師陸筱霞
日期2013-6-21
除錯並完成乙個詞法分析程式,加深對詞法分析原理的理解。
1、 待分析的簡單語言的詞法
(1) 關鍵字:
begin if then while do end
所有關鍵字都是小寫。
(2) 運算子和界符< <= <> > >
(3) 其他單詞是識別符號(id)和整型常數(num),通過以下正規式定義:
id=letter(letter| digit)*
num=digit digit *
(4) 空格由空白、製表符和換行符組成。空格一般用來分隔id、num,運算子、界符和關鍵字,詞法分析階段通常被忽略。
2、 各種單詞符號對應的別碼
3、 詞法分析程式的輸入
所給文法的源程式字串。輸出:二元組(syn,token或sum)構成的序列。其中:syn為單詞種別碼;
token為存放的單詞自身字串;
sum為整型常數。
#include#include#includechar prog[80],token[8];char ch;int syn,p,m=0,n,row,sum=0;char *rwtab[6]=;
void scaner()
if((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z'))
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
syn=n+1;
break;
}else if((ch>='0'&&ch<='9'))
p--;
syn=11;
if(sum>32767)
syn=-1;
}else switch(ch)
else if(ch=='=')
else
break;case'>':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
else
break;case':':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
else
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=0;token[0]=ch;break;case'\n':syn=-2;break;default: syn=-1;break;
}}void main()
while(ch!='#');
p=0;
do}while (syn!=0);}
4、 給定源程式
begin x:=9; if x>0 then x:=2*x+1/3; end#
輸出結果
5、 源程式(包括上式未有的while、do以及判斷錯誤語句):beginx<=$;whilea<0dob<>9-x;end#輸出結果
通過此次實驗,讓我了解到如何設計、編制並除錯詞法分析程式,加深對詞法分析原理的理解;熟悉了構造詞法分析程式的手工方式的相關原理,根據識別語言單詞的狀態轉換圖,使用某種高階語言(例如c++語言)直接編寫此法分析程式。另外,也讓我重新熟悉了c++語言的相關內容,加深了對c++語言的用途的理解。比如:
main()函式中,用cin>>ch;語句得到ch值的話,給定源程式的結果第一行得到的是(10,beginx),因為得到的字串中省略了空格,改用cin.get(ch);問題便解決了。另外,我在程式中加入了row變數,以便能夠準確得到錯誤所在。
編譯原理語法分析器實驗報告
1、實驗目的:
結合課堂上學習的理論知識,通過c++實現語法分析器,更加深入的掌握語法分析;同時也可以更加了解語法分析的原理。
2、實驗過程:
1、設計思路:
首先判斷輸入文法是否為算符文法,若是算符文法則構造它的firstvt和lastvt集,然後構造它的算符優先表,判斷是否為算符優先文法;最後進行歸約。
2、實驗過程中的問題:
一開始實驗很生疏,很難把理論知識融匯到程式設計上,後來通過多次看ppt和書本內容,漸漸把握到訣竅; 不明確輸入輸出;這個也是通過ppt解決;和以前編其他東西很不一樣,一開始不知道如何下手;通過網上的成熟**學習了下。實驗**:#include#include#includetypedef structarray;
typedef struct charlode;
typedef structcharstack;
char str[80][80],arr[80][80],brr[80][80];array f[20];int m,kk,p,ppp,ff=1;char r[10];int crr[20][20],flag=0;char ccrr1[1][20],ccrr2[20][1];
void initstack(charstack &s)//定義棧
int isletter(char ch) //判斷是不是大寫字母(非終結符)
//judge1是判斷是否是算符文法:若產生式中含有兩個相繼的非終結符則不是算符文法int judge1(int n){
詞法分析實驗報告
實驗報告 課程名稱編譯原理 實驗名稱詞法分析實驗 班級學號姓名指導教師 實驗日期 一 實驗目的 1.了解詞法分析的主要任務。2.熟悉編譯程式的編制 通過設計 除錯詞法分析程式,實現從源程式中分出各種單詞的方法 熟悉詞法分析程式所用的工具自動機,進一步理解自動機理論 掌握文法轉換成自動機的技術及有窮自...
編譯原理詞法分析實驗報告
實驗1 詞法分析實驗報告 一 實驗目的 除錯並完成乙個詞法分析程式,加深對詞法分析原理的理解。二 實驗要求 1 待分析的簡單語言的詞法 1 關鍵字 begin if then while do end 所有關鍵字都是小寫。2 運算子和界符 3 其他單詞是識別符號 id 和整型常數 num 通過以下正...
編譯原理詞法分析實驗報告
實驗一詞法分析器設計 實驗目的 1 熟悉詞法分析的基本原理,詞法分析的過程和詞法分析中要注意的問題。2 複習高階語言,進一步加強用高階語言來解決實際問題的能力。3 通過完成詞法分析程式,了解詞法分析的過程。實驗內容 用c語言編寫乙個pl 0詞法分析器,為語法語義分析提供單詞,使之能把輸入的字串形式的...