設計、編制並除錯乙個詞法分析程式,加深對詞法分析原理的理解。
2.1 待分析的簡單的詞法
(1)關鍵字:
begin if then while do end
所有的關鍵字都是小寫。
(2)運算子和界符
< <= <> > >
(3)其他單詞是識別符號(id)和整型常數(sum),通過以下正規式定義:
id = letter (letter | digit)*
num = digit digit*
(4)空格有空白、製表符和換行符組成。空格一般用來分隔id、sum、運算子、界符和關鍵字,詞法分析階段通常被忽略。
2.2 各種單詞符號對應的種別碼:
表2.1 各種單詞符號對應的種別碼
2.3 詞法分析程式的功能:
輸入:所給文法的源程式字串。
輸出:二元組(syn,token或sum)構成的序列。
其中:syn為單詞種別碼;
token為存放的單詞自身字串;
sum為整型常數。
例如:對源程式begin x:=9: if x>9 then x:=2*x+1/3; end #的原始檔,經過詞法分析後輸出如下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……
演算法的基本任務是從字串表示的源程式中識別出具有獨立意義的單詞符號,其基本思想是根據掃瞄到單詞符號的第乙個字元的種類,拼出相應的單詞符號。
3.1 主程式示意圖:
主程式示意圖如圖3-1所示。其中初始包括以下兩個方面:
⑴ 關鍵字表的初值。
關鍵字作為特殊識別符號處理,把它們預先安排在一張**中(稱為關鍵字表),當掃瞄程式識別出識別符號時,查關鍵字表。如能查到匹配的單詞,則該單詞為關鍵字,否則為一般識別符號。關鍵字表為乙個字串陣列,其描述如下:
char *rwtab[6] = ;
(2)程式中需要用到的主要變數為syn,token和sum
3.2 掃瞄子程式的演算法思想:
首先設定3個變數:①token用來存放構成單詞符號的字串;②sum用來整型單詞;③syn用來存放單詞符號的種別碼。掃瞄子程式主要部分流程如圖3-2所示。
#include <>
#include <>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]=;
scaner();
main()
while(ch!='#');
p=0;
do }while(syn!=0);
getch();
} scaner()
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
}else if((ch>='0')&&(ch<='9'))
p--;
syn=11;
}else switch(ch)
{ case '<':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
syn=22;
token[m++]=ch;
else
syn=20;
p--;
break;
case '>':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
syn=24;
token[m++]=ch;
else
syn=23;
p--;
break;
case '+': token[m++]=ch;
ch=prog[p++];
if(ch=='+')
syn=17;
token[m++]=ch;
else
syn=13;
p--;
break;
case '-':token[m++]=ch;
ch=prog[p++];
if(ch=='-')
syn=29;
token[m++]=ch;
else
syn=14;
p--;
break;
case '!':ch=prog[p++];
if(ch=='=')
syn=21;
token[m++]=ch;
else
syn=31;
p--;
break;
case '=':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
syn=25;
token[m++]=ch;
else
syn=18;
p--;
break;
case '*': syn=15;
token[m++]=ch;
break;
case '/': syn=16;
token[m++]=ch;
break;
case '(': syn=27;
token[m++]=ch;
break;
case ')': syn=28;
編譯原理實驗報告
通過編寫和除錯乙個詞法分析程式,掌握在對程式語言的源程式進行掃瞄的過程中,將字元形式的源程式流轉化為乙個由各類單詞符號組成的流的詞法分析方法。語言中具有的單詞包括五個關鍵字begin end if then else 識別符號 整型常數 六種關係運算子 乙個賦值符和四個算術運算子。參考實現方法簡述如...
編譯原理實驗報告
軟體學院驗證性實驗報告 專業 軟體開發 net方向 年級 班級 2010級 2012 2013學年第一學期 1 實驗目的及實驗專案簡介 運用編譯程式,完成下述源程式的編譯,了解源程式的預處理功能 即通過編譯程式,將高階語言程式 源程式 翻譯成低階語言程式 目標程式 源程式的輸入 設源程式如下所示,其...
編譯原理實驗報告
姓名 專業 班級 學號 指導老師 一 實驗內容 求解乙個文法的first follow select集合並判斷是不是ll 1 文法。一 實驗目的 通過實驗熟練掌握first follow select集合的求解演算法,加深對理論知識的理解。二 實驗原理 集的求解 1 若x vt,則first x 2...