实验1 词法分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1 词法分析

一、实验目的

通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。

二、实验要求

(1)掌握词法分析的实现方法。

(2)上机调试编出的词法分析程序。

(3)源程序可以从键盘输入也可以事先存在文件中

(4)将源程序中的各个单词读出后可以显示在屏幕中也可以存在文件中(包括单词的类别)

三、实验题目

用 C/C++ 语言编写以下 C/C++ 子集的词法分析程序。

四、实验代码

/*测试数据

BEGIN

VAR A+,2A,A3,A4:INTEGER;

A1:=1,A2:=123,A3:=123-12;

WHILE A2=A3 DO A4:=234A*123/45+A1

iF A1>A2

THEN A1:=A4;

ELSE

A4:=(A1+A2)*A!;

END

*/

#include

#include

#include

using namespace std;

int letter(char c)//字母

{

if(c>='A' && c<='Z')return 1;

else return 0;

}

int digit(char c)//数字

{

if(c>='0' && c<='9')return 1;

else return 0;

}

int oper(char c)//运算符

{

if(c=='+' || c=='-' || c=='*' || c=='/')return 1;

else return 0;

}

int relation(char c)//关系运算符

{

if(c=='<'||c=='>'||c=='=')return 1;

else return 0;

}

int jiefu(char c)//界符

{

if(c==',' || c==':' || c==';'|| c=='.'|| c=='('|| c==')')return 1;

else return 0;

}

int border(char c)//单词边界

{

if(c==',' || c==':' || c==';'|| c==' '|| c=='.' || c=='('|| c==')'|| c=='+' || c=='-' || c=='*' || c=='/' || c=='<' || c=='>'|| c=='=' ) return 1;

else return 0;

}

int illegal(char *s)//找非法字符

{

int i,l=strlen(s);

for(i=0;i

{

if(!letter(s[i]) && !digit(s[i]))

return 1;

}

return 0;

}

int identifier(char *s)//标识符

{

if(illegal(s))return 0;

if( letter(s[0]) ) return 1;

else return 0;

}

int unsigned_word(char *s)//无符号数

{

int i,len=strlen(s);

for(i=0;i

if(!digit(s[i]))return 0;

return 1;

}

int r_word(char *s)//保留字

{

if(illegal(s))return 0;

else if(!strcmp(s,"INTEGER")) return 1;

else if(!strcmp(s,"WHILE")) return 1;

else if(!strcmp(s,"BEGIN")) return 1;

else if(!strcmp(s,"ELSE")) return 1;

else if(!strcmp(s,"VAR")) return 1;

else if(!strcmp(s,"END")) return 1;

else if(!strcmp(s,"IF")) return 1;

else if(!strcmp(s,"DO")) return 1;

else if(!strcmp(s,"THEN")) return 1;

else return 0;

}

void judge_word(char *s)//判断单词

{

int len=strlen(s);

if(len==0)return ;

if(r_word(s))cout<<"保留字: "<

else if(identifier(s))cout<<"标识符: "<

else if(unsigned_word(s))cout<<"无符号数: "<

else cout<<"非法单词: "<

}

void main()

{

char s[100],word[100];

while(gets(s))

{

int i,j=0,len=strlen(s);

for(i=0;i

{

if(border(s[i]))

{

word[j]='\0';j=0;

judge_word(word);

if(s[i]==':' && s[i+1]=='=')

{

cout<<"赋值符:"<

i++;

word[0]='\0';

continue;

}

else if(s[i]=='>' && s[i+1]=='=' || s[i]=='<' && s[i+1]=='=' || s[i]=='<' && s[i+1]=='>')

相关文档
最新文档