编译原理 实验一 词法分析

实验一 词法分析

【实验目的】

  (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;
}

【实验结果】

 

猜你喜欢

转载自www.cnblogs.com/wyqzh/p/12805934.html