📄 6.cpp
字号:
#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];
};//定义二元组的数据结构
void pro_process(char*);//预处理程序
code_val scanner(char*);//扫描预处理后的程序并返回二元组
char reserve(char[]); //判断是否为保留字
void main()
{
char buf[4048]={"\0"};//缓冲区用来存放预处理结果
pro_process(buf);
cout<<buf<<endl;//输出预处理后缓冲区中的内容
ofstream coutf("F:\lex_r.txt",ios::out);
code_val t;
do
{
t=scanner(buf);
cout<<'('<<t.code<<','<<t.val<<')'<<endl;
}while(t.code!='#');//预处理时在程序末尾加一个#用来判断扫描结束
}
void pro_process(char*buf)//此程序将源程序中空格,回车,tab,换行都由一个空格代替,将大写字母替换为相应小写最后加一个'#'.
{ 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,换行都由一个空格代替
else if(cur_c>='A'&&cur_c<='Z')
{
cur_c+=32;
k=0;
buf[i]=cur_c;
}//大写字母替换为相应小写
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;
} //遇到界符和运算符时则在前后加空格
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]='#';//结尾加结束标志
}
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;
} //识别基本字或标识符
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;
}//识别无符号整数
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';//若不是则返回标识符的属性值‘i’
}//end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -