資源簡介
IF-ELSE條件語句的翻譯程序設(shè)計(簡單優(yōu)先法、輸出三地址表示).rar

代碼片段和文件信息
#include
#include
#include
using?namespace?std;
//全局變量聲明:
int??m;//存儲源程序文本字符個數(shù)。
char?ssym[11]={‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘=‘‘‘‘.‘‘#‘‘;‘};//存儲單字運算符和界符,雙字符的在程序中判斷。
char?keyword[14][20]={{“begin“}{“call“}{“const“}{“do“}{“end“}{“if“}{“else“}{“odd“}{“procedure“}{“read“}{“then“}{“var“}{“while“}{“write“}};
//存儲關(guān)鍵字符,采用2維數(shù)組,每個關(guān)鍵字是一個字符數(shù)組。
char???charbuffer[1000];//存儲源程序的每一個字符,包括換行符,制表符,回車符,也即初始設(shè)定源程序字符長度最大為1000。
int????word_code[1000];///存儲進行詞法分析后得到的每一個單詞符號的代號。
string?word_value[1000];//存儲進行詞法分析后得到的每一個單詞符號的值。
//子函數(shù)定義:
void?scanner(char*?charbufferint*word_codestring*word_valuechar*?filename)//詞法分析器,修改全局數(shù)組的值,通過指針傳遞參數(shù)。
{
fstream?infileoutfile;int?pos=0;//定義文件流對象infile操作源程序文本,outfile為分析結(jié)果文本,pos記錄源程序文本中的所有字符個數(shù)。
infile.open(filename);
while(!infile.eof())
{
infile.seekg(pos);//初始pos為0將定位文件的開始位置,后續(xù)隨著pos的改變每次定位于當前最末位置一邊繼續(xù)掃描。
infile.get(charbuffer[pos]);
pos++;
}
infile.close();
outfile.open(“resultfile.txt“ios::out);?
int?j=0;m=0;
string?err;
err=“錯誤標識“;
cout?<<“詞法分析結(jié)果為:“< while(j<(pos-1))
{
if(charbuffer[j]==‘?‘||charbuffer[j]==10||charbuffer[j]==9)//10代表換行,9代表橫表。
???j++;
else?if(charbuffer[j]>=‘a(chǎn)‘&&charbuffer[j]<=‘z‘)
{
string?b;
do
{
b.append(1charbuffer[j]);//獲取單詞。
????????????????????j++;
?}while(charbuffer[j]>=‘a(chǎn)‘&&charbuffer[j]<=‘z‘||charbuffer[j]>=‘0‘&&charbuffer[j]<=‘9‘);
int?k=0;
for(?k=0;k<=13;k++)
{
if(b==keyword[k])
{
k=-1;//設(shè)置標記。
break;
}
}
if(k==-1)
{
cout<<2<<“???“< if(b==“if“)
word_code[m]=2;//關(guān)鍵字if代號為2
else?if(b==“else“)
word_code[m]=6;//關(guān)鍵字else代號為6
else?if(b==“then“)
word_code[m]=4;//關(guān)鍵字then代號為4.
else?
word_code[m]=20;//其余關(guān)鍵字都代號為20.
word_value[m]=b;
m++;
outfile.put(‘2‘);
outfile.put(‘?‘);
outfile.put(‘?‘);
outfile.write(&b[0]b.size());
outfile.put(10);
}
else
{
cout<<3<<“???“<????????????? word_code[m]=9;???//變量令為類型9
word_value[m]=b;
m++;
outfile.put(‘3‘);
outfile.put(‘?‘);
outfile.put(‘?‘);
outfile.write(&b[0]b.size());//在輸出文本中寫入單詞
outfile.put(10);
}
}
else?if(charbuffer[j]>=‘0‘&&charbuffer[j]<=‘9‘)
{
int?num=0k=0;
do
{
num=num*10+charbuffer[j]-‘0‘;//獲得數(shù)字。
word_value[m].append(1charbuffer[j]);//添加字符。
j++;
k++;
}while(charbuffer[j]>=‘0‘&&charbuffer[j]<=‘9‘);
cout<<1<<“???“< word_code[m]=11;?//數(shù)字令為類型11
m++;
outfile.put(‘1‘);
outfile.put(‘?‘);
outfile.put(‘?‘);
outfile.write(&charbuffer[j-k]k);//j-k計算該字符的初始位置。
outfile.put(10);//換行。
}
else?if(charbuffer[j]==‘:‘)
{
word_value[m].append(1charbuffer[j]);
j++;
if(charbuffer[j]==‘=‘)
{
cou
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????11734??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\BuildLog.htm
?????文件????????663??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\IF-ELSE簡單優(yōu)先分析.exe.em
?????文件????????728??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\IF-ELSE簡單優(yōu)先分析.exe.em
?????文件????????621??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\IF-ELSE簡單優(yōu)先分析.exe.intermediate.manifest
?????文件?????112502??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\IF-ELSE語句的簡單優(yōu)先分析.obj
?????文件?????????63??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\mt.dep
?????文件?????166912??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\vc90.idb
?????文件?????217088??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug\vc90.pdb
?????文件???????3960??2010-01-07?19:01??IF-ELSE簡單優(yōu)先分析\IF-ELSE簡單優(yōu)先分析.vcproj
?????文件???????1409??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\IF-ELSE簡單優(yōu)先分析.vcproj.IBM-PC.IBM.user
?????文件??????14131??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\IF-ELSE語句的簡單優(yōu)先分析.cpp
?????文件?????????94??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\resultfile.txt
?????文件?????????38??2010-01-10?19:51??IF-ELSE簡單優(yōu)先分析\sourcefile.txt
?????目錄??????????0??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析\Debug
?????目錄??????????0??2010-01-10?19:52??IF-ELSE簡單優(yōu)先分析
-----------?---------??----------?-----??----
???????????????529943????????????????????15
評論
共有 條評論