词法分析096

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析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的主要内容,如果未能解决你的问题,请参考以下文章

编译原理 实验一 java语言实现对C语言词法分析

编译原理 实验一 java语言实现对C语言词法分析

词法分析

#yyds干货盘点#Java ASM系列:(096)检测潜在的NPE

词法分析器代码复审

实验一 词法分析器+编译原理