資源簡介
設計并實現 C 語言的詞法分析程序,要求如下。
(1) 可以識別出用C語言編寫的源程序中的每個單詞符號,并以記號的形式輸出每個單詞符號。
(2) 可以識別并讀取源程序中的注釋。
(3) 可以統計源程序中的語句行數、單詞個數和字符個數,其中標點和空格不計算為單詞,并輸出統計結果。
(4) 檢查源程序中存在的非法字符錯誤,并可以報告錯誤所在的行列位置。
(5) 發現源程序中存在錯誤后,進行適當的恢復,使詞法分析可以繼續進行,通過一次詞法分析處理,可以檢查并報告源程序中存在的所有詞法拼寫錯誤。
代碼片段和文件信息
/***********************************************************/
/*??????????????????詞法分析程序的設計與實現???????????????*/
/***********************************************************/
#include?
#include?
#include?
#include?
#include??
using?namespace?std;
const?int?BUFF=4096;????????????//設置緩沖組大小?
char?buffer[BUFF];
int?beginforward;
int?line=1character=1word=0;???//用于統計?
int?rownum=0;????????????????????//記錄列數?
char?get_char(ifstream?&?insofstream?&?outs);?????//從緩沖區讀入一字符?
char?get_nbc(ifstream?&?insofstream?&?outs);??????//從緩沖區讀入一非空白符?
void?retract();????????????????????????????????????//向前掃描指針forward后退一個字符
int?reserve(string?test);??????????????????????????//查保留字表
int?main()
{
?
????int?i;
????int?iskey;???????????????//存放reserve()的返回值?
????char?c;
????string?token;????????????//存放單詞的字符串
????ifstream?ins;????????????//打開輸入和輸出文件?
????ins.open(“in.txt“);
????ofstream?outserr;
????outs.open(“out.txt“);
????err.open(“err.txt“);??????//打開錯誤輸出文件?
????outs?<????buffer[BUFF/2-1]=EOF;?????//設置兩個標志位
????buffer[BUFF-1]=EOF;
????
????begin=forward=0;??????????//初始兩個指針?
????
????
????c=ins.get();
????i=0;
????while(c!=EOF&&i ????{
????????buffer[i]=c;?
????????c=ins.get();??
????????i++;
????}
????buffer[i]=EOF;??
????
????token=““;????????????????????//初始化??????
????c=get_nbc(insouts);
????????
????int?flag=1;
????while(c!=EOF){
????switch(c)
????{
??????????case?‘a‘...‘z‘:?????????//判斷標識符是否為關鍵字?
??????????case?‘A‘...‘Z‘:
??????????case?‘_‘:
???????????????flag=1?;??????????????
???????????????while(isalpha(c)||isdigit(c)||c==‘_‘)
???????????????{
???????????????????token+=c;
???????????????????c=get_char(insouts);
???????????????????if?(c==‘@‘||c==‘‘‘||c==‘$‘||c==‘?‘)
???????????????????{
??????????????????????????????err<??????????????????????????????word--;
??????????????????????????????while(c!=‘\n‘&&c!=‘?‘&&c!=‘\t‘)?????????????//跳過非法字段繼續向下分析?????????????????????????????????????
??????????????????????????????????????????????c=get_char(insouts);
??????????????????????????????flag=0;
???????????????????????????????retract();??????????????????????????????????????????????????????????????????????????????????????
???????????????????}???????????????????
???????????????}
???????????????word++;?
???????????????if(flag)
???????????????{retract();???????????????
???????????????iskey=reserve(token);
???????????????if(iskey==0)
???????????????{?
???????????????????outs?<???????????????????token=““;
???????????????}
???????????????else?
???????????????{
???????????????????outs?<?????????????
- 上一篇:編譯原理語法分析器SLR(1)
- 下一篇:C語言 詞法分析器 C#實現
評論
共有 條評論