码迷,mamicode.com
首页 > 其他好文 > 详细

词法分析096

时间:2016-09-30 18:38:06      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/a305810827/p/5924455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!