实验一 词法分析
【实验目的】
(1)熟悉词法分析器的基本功能和设计方法;
(2)掌握状态转换图及其实现;
(3)掌握编写简单的词法分析器方法。
【实验内容】
对一个简单语言的子集编制一个一遍扫描的词法分析程序。
【实验要求】
(1)待分析的简单语言的词法
1) 关键字 begin if then while do end
2) 运算符和界符 := + - * / < <= <> > >= = ; ( ) #
3) 其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
4) 空格由空白、制表符和换行符组成。空格一般用来分隔 ID、NUM、运算符、界符和 关键字,词法分析阶段通常被忽略。
(2)各种单词符号对应的种别编码
(3)词法分析程序的功能
输入:所给文法的源程序字符串
输出:二元组(syn,token 或 sum)构成的序列。
syn 为单词种别码;
token 为存放的单词自身字符串;
sum 为整形常数。
【实验代码】
#include<iostream>
#include<string.h>
#include<conio.h>
#include<ctype.h>
using namespace std;
int sum,syn,p,m,n;
char ch,chs[8],s[100];
char *tab[6]={"begin","if","then","while","do","end"};
int scanner(){
for(n=0;n<8;n++) chs[n]='\0';
m=0;
n=0;
ch=s[p++];
while(ch==' ') ch=s[p++];
if(isalpha(ch)){
while(isalpha(ch)||isdigit(ch)){
chs[m++]=ch;
ch=s[p++];
}
syn=10;
for(n=0;n<6;n++)
if(strcmp(chs,tab[n])==0) syn=n+1;
p--;
}else if(isdigit(ch)){
sum=0;
while(isdigit(ch)){
sum=sum*10+(ch-'0');
ch=s[p++];
}
syn=11;
p--;
}else if(ch==':'){
syn=17;
chs[m++]=ch;
ch=s[p++];
if(ch=='='){ syn=18;chs[m]=ch;p++;}
p--;
}else if(ch=='<'){
syn=20;
chs[m++]=ch;
ch=s[p++];
if(ch=='>') { syn=21;chs[m]=ch;p++;}
if(ch=='=') { syn=22;chs[m]=ch;p++;}
p--;
}else if(ch=='>'){
syn=23;
chs[m++]=ch;
ch=s[p++];
if(ch=='=') { syn=24;chs[m]=ch;p++;}
p--;
}else switch(ch){
case '+':syn=13;chs[m]=ch;break;
case '-':syn=14;chs[m]=ch;break;
case '*':syn=15;chs[m]=ch;break;
case '/':syn=16;chs[m]=ch;break;
case '=':syn=25;chs[m]=ch;break;
case ';':syn=26;chs[m]=ch;break;
case '(':syn=27;chs[m]=ch;break;
case ')':syn=28;chs[m]=ch;break;
case '#':syn=0;chs[m]=ch;break;
default:syn=-1;
}
return 0;
}
int main(){
p=0;
cout<<"Please input code and end with character '#':"<<endl;
do{
//cin>>ch;不识别空格
ch=getchar();
s[p++]=ch;
}while(ch!='#');
p=0;
do{
scanner();
switch(syn){
case 11:cout<<'('<<syn<<','<<sum<<')'<<endl;break;
case -1:cout<<'('<<syn<<','<<"error"<<')'<<endl;break;
default:cout<<'('<<syn<<','<<chs<<')'<<endl;
}
}while(syn!=0);
return 0;
}
【实验结果】