词法分析器、语法分析器试验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
词法分析器、语法分析器试验报告
一.程序思路
1.词法分析器
对输入的程序进行分析,将关键字,保留字与系统标识符分开,并对其属性进行说明。
建立数组,将单词读入,对单词的ASCII码进行判断,将在ASCII码值在一定区间进行区分(使用if语句来判断),分开来后,对其所在ASCII值区间的不同,给予以不同的属性(比如:系统保留字…),词法分析器完成后要能识别+,-,=等字符。
2.语法分析器
对输入的程序语句进行分析。对每个非终结点定义单个函数,定义了它的后继节点。然后用一个构造来的函数,使定义的后继节点符合语法,否则报错。
二.源程序
cifafenxi:
#include"string.h"
#include"iostream.h"
#include"stdio.h"
#include"conio.h"
#define OK 1
#define……
#define……
class word
{ int ch;
char code[50][50];
public:
//word();
int scan();
int letter(int ch);
int digit(int ch);
int flag(int ch);
int keyword(char * ch);
int alpha(char * ch);
int judge(char * ch);
};
int word::letter(int ch) //字符判断
int word::alpha(char * ch) //字符属性设定
int word::digit(int ch) //数字判断
int word::flag(int ch)
{
if(((ch>='0')&&(ch<='9'))||((ch>='a')&&(ch<='z'))
||((ch>='A')&&(ch<='Z'))||(ch=='+')||(ch=='-')
||(ch=='*')||(ch=='/')||(ch=='=')||(ch=='==')
||(ch=='%')||(ch=='<')||(ch=='>')||(ch=='(')||(ch==')'))
return(1);
else return(0);
}
int word::keyword(char * ch) //关键字判断
{
if((ch[0]=='i')&&(ch[1]=='n')&&(ch[2]=='t')&&(ch[3]==0))
{ cout<<"\n"<<"The [int] is a keyword !"<<"\n"; return(INT); }
if((ch[0]=='c')&&(ch[1]=='h')&&(ch[2]=='a')&&(ch[3]=='r')&&(ch[4]==0))
{ cout<<"\n"<<"The [char] is a keyword !"<<"\n"; return(CHAR); }
……………………………………………………
{ cout<<"\n"<<"It is a keyword [if] !"<<"\n"; return(SWITCH); }
return(0);
}
int word::judge(char * ch) //数字进位制判断
if((ch[0]=='0')&&((ch[1]>='0')&&(ch[1]<='7')))
{ cout<<"\n"<<"This is a OTC number, OTC value is"<<"["< return(OTC); } …………………………………………………… return(1); } int word::scan() { int i=0,j=0,x=1; cout<<"Please input !"<<"\n"; ch=getc(stdin); while((ch==' ')||(ch==10))ch=getc(stdin); if((flag(ch)==NO)){ cout<<"\n"<<"ERROR"<<"\n"; return(ERROR); } ungetc(ch,stdin); while(x) { ch=getc(stdin); if((letter(ch)==YES)) { i=0; while (letter(ch)||digit(ch)) {code[j][i]=ch;ch=getc(stdin);i++; } code[j][i]=0; if(keyword(code[j])==0) {if(alpha(code[j]))cout<<"The identifier's ID is ["< if((digit(ch)==YES)) { i=0; while(digit(ch)||(ch=='x')||((ch>='a')&&(ch<='f'))) { code[j][i]=ch; ch=getc(stdin); i++; } code[j][i]=0;judge(code[j]);cout<<"The number's ID is ["< if(ch==10)x=0; } if(ch==':') { i=0; code[j][i]=ch; ch=getc(stdin); if(ch=='='){ code[j][i++]=ch; cout<<"The ["<<"code[j]"<<" is (ASSIGN-OP, -) ."; j++; ch=getc(stdin); if(ch==10)x=0; }} switch(ch) { case'+':{ i=0; code[j][i]=ch; code[j][i++]=0; cout<<"\n"<<"The ["< break; case'-':{ i=0; code[j][i]=ch; code[j][i++]=0; cout<<"\n"<<"The ["< break; …………………………………………………… break; case')':{ i=0; code[j][i]=ch; code[j][i++]=0; cout<<"\n"<<"The ["< break; } if(ch==10)x=0; } return(OK); } int main() { char ch1; word word; while(ch1!='q') { word.scan(); ch1=getch(); } return(OK); } yufafenxi: