求救!用C++写编译原理程序!

weiweian 2003-10-09 10:49:20
用C++写:将正规式变成NFA,再将NFA转换为DFA,最后再将DFA状态最少化的算法。
(需要原代码)!!!
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yonyon 2003-10-13
  • 打赏
  • 举报
回复
去看看吧
http://www.programsalon.com/download.asp?type_id=33&pos=20
JetGeng 2003-10-13
  • 打赏
  • 举报
回复
什么地方有lex下,急需。
xunfengxxx 2003-10-11
  • 打赏
  • 举报
回复
回 ding1984(逍飞)
:指针、数组、字符串编程实例
——词法分析程序

题目分析:
这里以开始定义的PASCAL语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文
件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单
词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成
具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含
了源程序中的所有常数和所有标识符。

下面就词法分析程序中的主要变量进行说明:
FILE fp :文件指针,用于指向要分析的PASCAL源程序;
char *key[8]:指针数组,用于指向关键字表;
char *border[6]:指针数组,用于指向符号表;
char *arithmetic[4]:指针数组,指向算术运算符表;
char *relation[6]:指针数组,指向关系运算符表;
char *consts[20]:指针数组,指向常数表;
char *label[20]:指针数组,指向标识符表;
int constnum,labelnum:整型变量,分别用于存放当前常数个数和标识符个数。

程序中的主要子函数:
alphaprocess:关键字和标识符处理子函数;
digitprocess:数字处理函数;
otherprocess:其他字符处理函数;
search:查找子函数;

下面简要分析一下词法分析程序的运行流程:

主函数main():
打开要分析的PASCAL源程序,若不能正确打开,则报错。
先从源程序中读入一个字符ch,然后进行如下处理:
1、ch是字符:转入关键字和标识符处理子函数;
2、ch是数字:转入数字处理函数;
3、ch是其他字符:转入其他字符处理子函数;
结束。

关键字和标识符处理子函数alphaprocess(char buffer);
1、将buffer送入临时数组alphatp[0],再读入一个字符至buffer;
2、判断buffer是否为字符或数字,若是,则alphatp[1]=buffer;
3、重复1,2,直到2判断为假;在alphatp末尾添加'\0';
4、调用search()子函数,在关键字表中匹配alphatp,若匹配成功,则返回序号;
5、调用search,在标识符表中匹配alphatp,若匹配成功,则返回序号;
6、在标识符表中添加alphatp,并返回序号;

其余子函数的处理方式于alphaprocess类似,此处不再赘述。

[程序调试]

现有PASCAL程序清单如下:
BEGIN
IF I=1 THEN
I:=I+1 #
ELSE *&^
IF I=2 THEN
I:=I+11;
END.

运行词法分析程序后,显示如下结果:

BEGIN (1,1)
IF (1,4)
I (6,0)
= (4,2)
1 (5,0)
THEN (1,5)
I (6,0)
:= (2,2)
I (6,0)
+ (3,0)
1 (5,0)
# error,not a word
ELSE (1,2)
* (3,2)
& error,not a word
^ error,not a word
IF (1,4)
I (6,0)
= (4,2)
2 (5,1)
THEN (1,5)
I (6,0)
:= (2,2)
I (6,0)
+ (3,0)
11 (5,2)
; (2,1)
END (1,3)
. (2,3)
over

结果完全正确。


[源程序清单]
以下是词法分析程序的源程序清单,该程序在Pentium 133,16M,Turbo c 2.0环境下运行通过。

#include <stdio.h>
#include <ctype.h>
#include <alloc.h>
#include <stdlib.h>
#include <string.h>
#define NULL 0

FILE *fp;
char cbuffer;
char *key[8]={"DO","BEGIN","ELSE","END","IF","THEN","VAR","WHILE"};
char *border[6]={",",";",":=",".","(",")"};
char *arithmetic[4]={"+","-","*","/"};
char *relation[6]={"<","<=","=",">",">=","<>"};
char *consts[20];
char *label[20];
int constnum=0,labelnum=0;

int search(char searchchar[],int wordtype)
{
int i=0;
switch (wordtype) {
case 1:for (i=0;i<=7;i++)
{
if (strcmp(key[i],searchchar)==0)
return(i+1);
};

case 2:{for (i=0;i<=5;i++)
{
if (strcmp(border[i],searchchar)==0)
return(i+1);
};
return(0);
}

case 3:{for (i=0;i<=3;i++)
{
if (strcmp(arithmetic[i],searchchar)==0)
{
return(i+1);
};
};
return(0);
};

case 4:{for (i=0;i<=5;i++)
{
if (strcmp(relation[i],searchchar)==0)
{
return(i+1);
};
};
return(0);
};

case 5:{for (i=0;i<=constnum;i++)
{
if (strcmp(consts[i],searchchar)==0)
{
return(i+1);
};
}
consts[i-1]=(char *)malloc(sizeof(searchchar));
strcpy(consts[i-1],searchchar);
constnum++;
return(i);
};

case 6:{for (i=0;i<=labelnum;i++)
{
if (strcmp(label[i],searchchar)==0)
{
return(i+1);
};
}
label[i-1]=(char *)malloc(sizeof(searchchar));
strcpy(label[i-1],searchchar);
labelnum++;
return(i);
};

}


}


char alphaprocess(char buffer)
{
int atype;
int i=-1;
char alphatp[20];
while ((isalpha(buffer))||(isdigit(buffer)))
{
alphatp[++i]=buffer;
buffer=fgetc(fp);
};
alphatp[i+1]='\0';
if (atype=search(alphatp,1))
printf("%s (1,%d)\n",alphatp,atype-1);
else
{
atype=search(alphatp,6);
printf("%s (6,%d)\n",alphatp,atype-1);
};
return(buffer);
}

char digitprocess(char buffer)
{
int i=-1;
char digittp[20];
int dtype;
while ((isdigit(buffer)))
{
digittp[++i]=buffer;
buffer=fgetc(fp);
}
digittp[i+1]='\0';
dtype=search(digittp,5);
printf("%s (5,%d)\n",digittp,dtype-1);
return(buffer);
}

char otherprocess(char buffer)
{

int i=-1;
char othertp[20];
int otype,otypetp;
othertp[0]=buffer;
othertp[1]='\0';
if (otype=search(othertp,3))
{
printf("%s (3,%d)\n",othertp,otype-1);
buffer=fgetc(fp);
goto out;
};

if (otype=search(othertp,4))
{
buffer=fgetc(fp);
othertp[1]=buffer;
othertp[2]='\0';
if (otypetp=search(othertp,4))
{
printf("%s (4,%d)\n",othertp,otypetp-1);
goto out;
}
else
othertp[1]='\0';
printf("%s (4,%d)\n",othertp,otype-1);
goto out;
};

if (buffer==':')
{
buffer=fgetc(fp);
if (buffer=='=')
printf(":= (2,2)\n");
buffer=fgetc(fp);
goto out;
}
else
{
if (otype=search(othertp,2))
{
printf("%s (2,%d)\n",othertp,otype-1);
buffer=fgetc(fp);
goto out;
}
};

if ((buffer!='\n')&&(buffer!=' '))
printf("%c error,not a word\n",buffer);
buffer=fgetc(fp);
out: return(buffer);
}



void main()
{
int i;
for (i=0;i<=20;i++)
{
label[i]=NULL;
consts[i]=NULL;
};
if ((fp=fopen("\\DEMO.PAS","r"))==NULL)
printf("error");
else
{
cbuffer = fgetc(fp);
while (cbuffer!=EOF)
{
if (isalpha(cbuffer))
cbuffer=alphaprocess(cbuffer);
else if (isdigit(cbuffer))
cbuffer=digitprocess(cbuffer);
else cbuffer=otherprocess(cbuffer);
};
printf("over\n");
};
}





TopCoderONE 2003-10-11
  • 打赏
  • 举报
回复
看一下LEX的源码吧,然后再修改一下
ding1984 2003-10-10
  • 打赏
  • 举报
回复
关注。。
还有用C++作词法分析器,,怎么做呀???
xunfengxxx 2003-10-10
  • 打赏
  • 举报
回复
汇编语言
是编译原理
xunfengxxx 2003-10-10
  • 打赏
  • 举报
回复
我知道是汇编语言里的8个算法其中三个要实现的
将正规式变成NFA,再将NFA转换为DFA,最后再将DFA状态最少化的算法。
关键问题我怎么表达正规表达式呢?????/
用邻接表还是其他
有谁有原代码吗
bailingke 2003-10-10
  • 打赏
  • 举报
回复
什么语言?
难道是C++的编译器吗?
建议把问题说清楚!
WindTrace 2003-10-10
  • 打赏
  • 举报
回复
Our teacher also wants us to write a program about compilation,and I have no idea now!
xunfengxxx 2003-10-09
  • 打赏
  • 举报
回复
我也要谢谢有具体实现的思路也行

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧