?? 6.cpp
字號(hào):
#include<stdio.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
const int WORDLEN=20;
struct code_val
{
char code;
char val[WORDLEN];
};//定義二元組的數(shù)據(jù)結(jié)構(gòu)
void pro_process(char*);//預(yù)處理程序
code_val scanner(char*);//掃描預(yù)處理后的程序并返回二元組
char reserve(char[]); //判斷是否為保留字
void main()
{
char buf[4048]={"\0"};//緩沖區(qū)用來(lái)存放預(yù)處理結(jié)果
pro_process(buf);
cout<<buf<<endl;//輸出預(yù)處理后緩沖區(qū)中的內(nèi)容
ofstream coutf("F:\lex_r.txt",ios::out);
code_val t;
do
{
t=scanner(buf);
cout<<'('<<t.code<<','<<t.val<<')'<<endl;
}while(t.code!='#');//預(yù)處理時(shí)在程序末尾加一個(gè)#用來(lái)判斷掃描結(jié)束
}
void pro_process(char*buf)//此程序?qū)⒃闯绦蛑锌崭瘢剀嚕瑃ab,換行都由一個(gè)空格代替,將大寫字母替換為相應(yīng)小寫最后加一個(gè)'#'.
{ ifstream cinf("F:\source.txt",ios::in);
int i=0;
char cur_c;
int k=0;
while(cinf.read(&cur_c,sizeof(char)))
{
if(cur_c==' '||cur_c=='\t'||cur_c=='\n')
{
if(k==0)
{
buf[i]=' ';
k=1;
}
else
i--;
}//將源程序中空格,回車,tab,換行都由一個(gè)空格代替
else if(cur_c>='A'&&cur_c<='Z')
{
cur_c+=32;
k=0;
buf[i]=cur_c;
}//大寫字母替換為相應(yīng)小寫
else
{ k=0;
if(cur_c=='+'||cur_c=='-'||cur_c==':'||cur_c=='<'||cur_c=='>'||cur_c==';'||cur_c=='('||cur_c==')'||cur_c==',')
{
buf[i]=' ';
i++;
buf[i]=cur_c;
i++;
buf[i]=' ';
}
else buf[i]=cur_c;
} //遇到界符和運(yùn)算符時(shí)則在前后加空格
if(cur_c=='=')
{
k=0;
if(buf[i-2]==':')
{ i--;
buf[i]=cur_c;
i++;
buf[i]=' ';
}
else
{
buf[i]=' ';
i++;
buf[i]=cur_c;
i++;
buf[i]=' ';
}
}
i++;
}
buf[i]='#';//結(jié)尾加結(jié)束標(biāo)志
}
struct code_val scanner(char*buf)
{ static int i=0;
struct code_val t={'\0',"NUL"};
char token[WORDLEN]={'\0'};
while(buf[i]==' ')i++;//空格不處理
if(buf[i]>='a'&&buf[i]<='z')
{
int k=0;
while(buf[i]>='a'&&buf[i]<='z'||buf[i]>='0'&&buf[i]<='9')
{
token[k]=buf[i];
k++;
i++;
}
t.code=reserve(token);
if(t.code=='a')
strcpy(t.val,token);
return t;
} //識(shí)別基本字或標(biāo)識(shí)符
else if(buf[i]>='0'&&buf[i]<='9')
{
int k=0;
while(buf[i]>='0'&&buf[i]<='9')
{
token[k]=buf[i];
k++;
i++;
}
if(buf[i]==' ')
{
t.code='b';
strcpy(t.val,token);
return t;
}
else
cout<<"Error char!"<<token<<endl;
}//識(shí)別無(wú)符號(hào)整數(shù)
if(buf[i]=='+')
{
t.code ='+';
i++;
return t;
}
else if(buf[i]=='-')
{
t.code ='-';
i++;
return t;
}
else if(buf[i]=='<')
{
t.code ='<';
i++;
return t;
}
else if(buf[i]=='>')
{
t.code ='>';
i++;
return t;
}
else if(buf[i]=='#')
{
t.code ='#';
return t;
}
else if(buf[i]==':')
{
i++;
if(buf[i]=='=')
{
t.code='$';
i++;
return t;
}
else
{
t.code=':';
return t;
}
}
else if(buf[i]=='(')
{
t.code ='(';
i++;
return t;
}
else if(buf[i]==')')
{
t.code =')';
i++;
return t;
}
else if(buf[i]==';')
{
t.code =';';
i++;
return t;
}
else if(buf[i]=='=')
{
t.code ='=';
i++;
return t;
}
else if(buf[i]==',')
{
t.code=',';
i++;
return t;
}
else
cout<<"Error char!"<<buf[i]<<endl;
exit(0);
}
char reserve(char token[])//判斷是否為保留字
{
const char*table[]={"program","begin","end","var","integer","if","then","else","do","while"};
const char code[]={"1234567890"};//保留字的二元組定義
for(int i=0;i<10;i++)
if(strcmp(token,table[i])==0)
return code[i];
return'a';//若不是則返回標(biāo)識(shí)符的屬性值‘i’
}//end
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -