新聞中心
實(shí)驗(yàn)報(bào)告??????? 一、實(shí)驗(yàn)?zāi)康?p>通過設(shè)計(jì)編制調(diào)試一個(gè)具體的詞法分析程序,加深對詞法分析原理的理解。并掌握在對程序設(shè)計(jì)語言源程序進(jìn)行掃描過程中將其分解為各類單詞的詞法分析方法。
編制一個(gè)讀單詞過程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類。并依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值。(遇到錯(cuò)誤時(shí)可顯示“Error”,然后跳過錯(cuò)誤部分繼續(xù)顯示)
二、實(shí)驗(yàn)內(nèi)容在詞法分析中,自文件頭開始掃描源程序字符,一旦發(fā)現(xiàn)符合“單詞”定義的源程序字符串時(shí),將它翻譯成固定長度的單詞內(nèi)部表示,并查填適當(dāng)?shù)男畔⒈怼=?jīng)過詞法分析后,源程序字符串(源程序的外部表示)被翻譯成具有等長信息的單詞串(源程序的內(nèi)部表示),并產(chǎn)生兩個(gè)表格:常數(shù)表和標(biāo)識(shí)符表,它們分別包含了源程序中的所有常數(shù)和所有標(biāo)識(shí)符。
1.初始化:從文件將源程序全部輸入到字符緩沖區(qū)中。2.取單詞前:去掉多余空白。
3.取單詞后:去掉多余空白(可選,看著辦)。
4.取單詞:利用實(shí)驗(yàn)一的成果讀出單詞的每一個(gè)字符,組成單詞,分析類型。(關(guān)鍵是如何判斷取單詞結(jié)束?取到的單詞是什么類型的單詞?)
5.顯示結(jié)果。
#include?#include?#include?#include?#define?FILENAME?"D:\\java\\text.c"
#define?MODE?"r"
const?char?*key[]?=?{"main",?"int",?"char",?"f1oat",?"doub1e",?"if",?"for",?"while",?"?return"};
const?char?*border[]?=?{",",?";",?"{",?"}",?"(",?")"};
const?char?*arithmetic[]?=?{"+",?"_",?"*",?"/",?"<",?">",?"<=",?">=",?"=",?"<>"};
FILE?*fp;
char?nextChar()?{
char?ch?=?EOF;
if?(!feof(fp))?{
ch?=?fgetc(fp);
}
return?ch;
}
int?isin(char?str[],?int?type)?{
int?i?=?0;
switch?(type)?{
case?1:?{
for?(i?=?0;?i?9;?++i)?{
if?(strcmp(str,?key[i])?==?0)?{
return?i?+?1;
}
}
break;
}
case?4:?{
for?(i?=?0;?i?10;?++i)?{
if?(strcmp(str,?arithmetic[i])?==?0)?{
return?i?+?1;
}
}
break;
}
case?5:?{
for?(i?=?0;?i?6;?++i)?{
if?(strcmp(str,?border[i])?==?0)?{
return?i?+?1;
}
}
break;
}
}
return?0;
}
char?alphaprocess(char?ch)?{
char?buffer[1024];
int?bufPtr?=?0;
while?(isalpha(ch)?||?isdigit(ch)?||'_'?==?ch)?{
buffer[bufPtr++]?=?ch;
ch?=?nextChar();
}
buffer[bufPtr]?=?'\0';
if?(isin(buffer,?1))?{
printf("(1,\"%s\")\n",?buffer);
}?else?{
printf("(2,\"%s\")\n",?buffer);
}
return?ch;
}
char?digitprocess(char?ch)?{
char?buffer[1024];
int?bufPtr?=?0;
while?(isdigit(ch)?||?'.'?==?ch)?{
buffer[bufPtr++]?=?ch;
ch?=?nextChar();
}
buffer[bufPtr]?=?'\0';
printf("(3,\"%s\")\n",?buffer);
return?ch;
}
char?otherprocess(char?ch)?{
char?buffer[3];
buffer[0]?=?ch;
buffer[1]?=?buffer?[2]?=?'\0';
char?lookahead?=?nextChar();
if?(isspace(ch))?{
return?lookahead;
}?else?if?(isin(buffer,?5))?{
printf("(5,?\"%s\")\n",?buffer);
}?else?if?(isin(buffer,?4))?{
buffer[1]?=?lookahead;
if?(isin(buffer,?4))?{
printf("(4,\"%s\")\n",?buffer);
}?else?{
buffer[1]?=?'\0';
ungetc(lookahead,?fp);
printf("(4,\"%s\")\n",?buffer);
}
}
return?lookahead;
}
int?main(void)?
{
char?ch;
if?((fp?=?fopen(FILENAME,MODE))?==?NULL)?{
printf("Error?:?File?does?not?exist.");
}
ch?=?nextChar();
while?(ch?!=?EOF)?{
if?(isalpha(ch))?{
ch?=?alphaprocess(ch);
}?
else?if?(isdigit(ch))?{
ch?=?digitprocess(ch);
}?else?{
ch?=?otherprocess(ch);
}
}
fclose(fp);
system("pause");
return?0;
}
運(yùn)行圖:
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文名稱:編譯原理實(shí)驗(yàn)二詞法分析【C語言實(shí)現(xiàn)】-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://www.ef60e0e.cn/article/dpcggd.html