实验一 词法分析
开始
忽略空白
是标识符
标识符分析
是常数
常数分析
界符算符分析
返回
是界符或
算符
出错处理
1. 词法分析程序源代码
#include
#include
#include
#include
using namespace std;
const int MLength=255;
//一行允许的字符个数
union WordContent{
char T1[MLength];
int T2;
char T3[3];
//存放单词符号的内容
//存放标识符
//存放整型常数的拼数
//存放其他符号
};
struct Word
{
//单词符号二元式
int code;
//存放种别编码
WordContent value;
};
int Ln=1,Col=1;
char *KeyWord[7]={"main","int","char","if","else","for","while"};
//字符的位置(行,列)
//关键字表
bool TestID(char *&ch);
bool TestNumber(char *&ch);
bool TestSign(char *&ch);
void TestKeyWord(char word[MLength],int &code);
bool WordScan(char *&ch);
void PrintError(char *&ch);
Word word;
//声明一个单词变量
//词法分析
//错误处理
//测试标识符
//测试整型常数
//测试界符和算符
//测试关键字
int main()
{
char program[MLength*10];
int i=0;
cout<<"请输入一段程序并以‘#’结束:"<
cout<<"词法分析结果:"<64 && *ch<91) || (*ch>96 && *ch<123) || (*ch>47 &&
*ch<58)) );
str.T1[k]='\0';
return 1;
}
bool TestNumber(char *&ch)
{
WordContent number;
word.value=str;
word.code=10;
TestKeyWord(word.value.T1,word.code);
//标识符编号为 10
//测试关键字
//测试整型常数
number.T2=atoi(ch);
while(*ch>47 && *ch<58)
//拼数
ch++;Col++;
//移向下一个字符
word.value=number;
word.code=20;
return 1;
}
bool TestSign(char *&ch)
{
int code;
char ch1='\0',ch2='\0';
WordContent sign;
switch(*ch)
{
case '=':
//整形常数编号为 20
//测试界符和算符
//识别界符或算符
ch1='=';code=21;
ch++;Col++;
if(*ch=='=') {ch2='=';code=39;}
else ch--;Col--;
break;
case '+':
ch1='+';code=22;break;
case '-':
ch1='-';code=23;break;
case '*':
ch1='*';code=24;break;
case '/':
ch1='/';code=25;break;
case '(':
ch1='(';code=26;break;
case ')':
ch1=')';code=27;break;
case '[':
ch1='[';code=28;break;
case ']':
ch1=']';code=29;break;
case '{':
ch1='{';code=30;break;
case '}':
ch1='}';code=31;break;
case ',':
ch1=',';code=32;break;
case ':':
ch1=':';code=33;break;
case ';':
ch1=';';code=34;break;
case '>':
ch1='>';code=35;
ch++;Col++;
if(*ch=='=') {ch2='=';code=37;}
else ch--;Col--;
break;
case '<':
ch1='<';code=36;
ch++;Col++;
if(*ch=='=') {ch2='=';code=38;}
else ch--;Col--;
break;
case '!':
ch1='!';
ch++;Col++;
if(*ch=='=') {ch2='=';code=40;}
else return 0;
break;
//遇到无法识别字符
case '&':
ch1='&';code=41;
ch++;Col++;
if(*ch=='&') {ch2='&';code=42;}
else
ch--;Col--;
break;
case '|':
ch1='|';code=43;
ch++;Col++;
if(*ch=='|') {ch2='|';code=44;}
else
ch--;Col--;
//遇到无法识别字符
//移向下一个字符
break;
default:
return 0;
}
ch++;Col++;
sign.T3[0]=ch1;
sign.T3[1]=ch2;
sign.T3[2]='\0';
word.code=code;
word.value=sign;
return 1;
}
void TestKeyWord(char word[MLength],int &code)
{
//测试关键字
int s=0;
for(int i=0;i<7 && s==0;i++)
{
if(strcmp(word,KeyWord[i])==0)
{
code=i+1;
s=1;
}
}
}
bool WordScan(char *&ch)
{
//词法分析
int result=0;
bool Unblank=0;
while(Unblank!=1)
{
//分析结果
//非空白
//忽略空白
//是空格
if(*ch==32)
{ch++;Col++;}
else if(*ch==9)
{ch++;Col+=4;}
else if(*ch==10)
{ch++;Ln++;Col=1;}
else Unblank=1;
//是 tab 制表符
//是换行符
}
if((*ch>64 && *ch<91) || (*ch>96 && *ch<123))
//判断标识符
result=TestID(ch);
else if(*ch>47 && *ch<58)
result=TestNumber(ch);
else
result=TestSign(ch);
//判断整型常数
//判断算符和界符
if(result!=1)
return 0;
return 1;
}
void PrintError(char *&ch)
{
//输出错误
cout<<"输入无法识别字符!";
cout<<"位置 Ln:"<
(注:因为词法分析器无法识别“!<”,即不小于运算符,所以出现错误。)