C_minus语言词法分析器的设计

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

实验一:词法分析程序的设计与实现

姓名:专业班级:学号:

一、实验目的

设计一个简单的词法分析器,从而进一步加深对词法分析器工作原理的理解。

二.、实验内容

编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。

三、实验要求

根据PL/0语言文法,编制词法分析程序GETSYM完成以下功能:

1)从键盘读入数据,分析出一个单词。

2)返回单词种别(用整数表示),

3)返回单词属性(不同的属性可以放在不同的全局变量中)。

四.、实验步骤

1. 采用C语言,设计GETSYM ,实现该算法

2. 编制测试程序(主函数main)。

3. 调试程序:输入一组单词,检查输出结果。

五.、实验设计分析

1.词法的正规式描述

S=aA|a

A=(aA|dA)}(a|d)

2.变换后的正规文法

S→aA

S→a

A→aA

A→dA

A→a

A→d

3.词法分析程序的程序代码

#include "stdafx.h"

#include

#include

using namespace std;

#define MAX 17

char ch =' ';

string

key[17]={"const","long","float","double","void","main","if","else","then","break","int","char","in clude","for","while","printf","scanf"};

int Iskey(string c)

{ //关键字判断

int i;

for(i=0;i

{

if(key[i].compare(c)==0) return 1;

}

return 0;

}

int IsLetter(char c)

{ //判断是否为字母

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

else return 0;

}

int IsLetter1(char c)

{ //判断是否为a~f字母

if(((c<='f')&&(c>='a'))||((c<='F')&&(c>='A'))) return 1;

else return 0;

}

int IsDigit(char c)

{ //判断是否为数字

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

else return 0;

}

void scan(FILE *fpin)

{

string arr="";

while((ch=fgetc(fpin))!=EOF)

{

arr="";

if(ch==' '||ch=='\t'||ch=='\n'){}

else if(IsLetter(ch)||ch=='_')

{

arr=arr+ch;

ch=fgetc(fpin);

while(IsLetter(ch)||IsDigit(ch))

{

if((ch<='Z')&&(ch>='A')) ch=ch+32;

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

if (Iskey(arr)){cout<

else cout<

}

else if(IsDigit(ch))

{

int flag=0;

if(ch=='0')

{

arr=arr+ch;

ch=fgetc(fpin);

if(ch>='0'&&ch<='7')

{

while(ch>='0'&&ch<='7')

{

flag=1;

arr=arr+ch;

ch=fgetc(fpin);

}

}

else if(ch=='x'||ch=='X')

{

flag=2;

arr=arr+ch;

ch=fgetc(fpin);

while(IsDigit(ch)||IsLetter1(ch))

{

arr=arr+ch;

ch=fgetc(fpin);

}

}

else if(ch==' '||ch==','||ch==';' )

{

cout<

}

fseek(fpin,-1L,SEEK_CUR);

if(flag==1) cout<

else if(flag==2) cout<

}

else

{

arr=arr+ch;

ch=fgetc(fpin);

while(IsDigit(ch))

{

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

cout<

}

}

else switch(ch)

{

相关文档
最新文档