首页 > 代码库 > 词法分析096

词法分析096

1.

输入:所给文法的源程序字符串,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等

输出:二元组 (单词种别,单词符号的属性值)构成的序列。

 

2.

技术分享

 

3.

<整数常数>→d|d<整数常数>

<标识符>→L|L<字母数字>

<关键字>→ if | then | while | do |<字母> 

<运算符>→ + | - | * | / | = | =<等号>…

<界符>→ , | ; | ( | ) | …

比如: 

S代表a^n , n>=0

S→a|Aa

A→a

 

 4.

#include<stdio.h>#include<string.h>#include<iostream.h>char prog[80],token[8];char ch;int syn,p,m=0,n,row,sum=0;char *rwtab[6]={"begin","if","then","while","do","end"};void scaner(){for(n=0;n<8;n++)token[n]=NULL;ch=prog[p++];while(ch== ){ch=prog[p];p++;}if((ch>=a&&ch<=z)||(ch>=A&&ch<=Z)){m=0;while((ch>=0&&ch<=9)||(ch>=a&&ch<=z)||(ch>=A&&ch<=Z)){token[m++]=ch;ch=prog[p++];}token[m++]=\0;p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>=0&&ch<=9)){{sum=0;while((ch>=0&&ch<=9)){sum=sum*10+ch-0;ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch){case<:m=0;token[m++]=ch;ch=prog[p++];if(ch==>){syn=21;token[m++]=ch;}else if(ch===){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case>:m=0;token[m++]=ch;ch=prog[p++];if(ch===){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case::m=0;token[m++]=ch;ch=prog[p++];if(ch===){syn=18;token[m++]=ch;}else{syn=17;p--;}break;case*:syn=13;token[0]=ch;break;case/:m=0;m=0;token[m++]=ch;if(ch==*){syn=14;token[0]=ch;}if(ch==/){token[m++]=ch;ch=prog[p++];}break;case+:syn=15;token[0]=ch;break;case-:syn=16;token[0]=ch;break;case=:syn=25;token[0]=ch;break;case;:syn=26;token[0]=ch;break;case(:syn=27;token[0]=ch;break;case):syn=28;token[0]=ch;break;case#:syn=0;token[0]=ch;break;case\n:syn=-2;break;default:syn=-1;break;}}int main(){p=0;row=1;cout<<"Please input string:"<<endl;do{cin.get(ch);prog[p++]=ch;}while(ch!=#);p=0;do{scaner();switch(syn){case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break;case -1: cout<<"Error in row"<<row<<"!"<<endl; break;case -2: row=row++;break;default: cout<<"("<<syn<<","<<token<<")"<<endl;break;}}while(syn!=0);}

 

5.

技术分享

词法分析096