//这是我编译原理的一次作业,中间有许多不足之处希望大家指正
/*编写PL/0语言的词法分析程序
要求:
1、读入用PL/0语言编写的源程序,正确的进行词法分析,并输出二元式序列。
2、若源程序有词法错误,能够给出出错的准确位置。
3、词法代号如下
(+,+);
(-,-);
(*,*);
(/,/);
((,();
(),));
(,,,);
(;,;);
(.,.);
(#,#);
(=,=);
(>,>);
(<,<);
(:=,a);
(>=,b);
(<=,c);
(数字,d);
(标识符,e);
关键字代号:
(begin,f);
(call,g);
(const,h);
(do,i);
(end,j);
(if,k);
(odd,l);
(procedure,m);
(read,n);
(then,o);
(var,p);
(while,q);
(write,r);
4、等于运算符号为一个 =
测试程序:
A.C
======================
CONST A=10;
VAR B,C;
PROCEDURE P;
VAR D;
PROCEDURE Q;
VAR X;
BEGIN
READ(X);
D:=X;
WHILE X<0
DO CALL P;
END;
BEGIN
WRITE(D);
CALL Q;
END;
BEGIN
CALL P;
END.
*/
/*program name:chifufenxi*/
/*作者:小万 QQ:421404493*/
/*date:2004.10.11*/
#include
#include
#include
#include
#include
#define N 256//每一行的字符数不能超过256个
char buffer[N]; //用作存放一行字符
char word[20]; //用作存放经过分析单词
char *kword[13]={"begin","call","const","do","end","if","odd","procedure","read","then","var","while","write"};
char ktype[13]={'f','g','h','i','j','k','l','m','n','o','p','q','r'};
int len;//记录每一行的长度
int count=0;//用来记录行数
void write(char *wstr,char wc,FILE *wout)//将分析结果按照规则写入到文件
{
fputc('(',wout);
fputs(wstr,wout);
fputc(',',wout);
fputc(wc,wout);
fputc(')',wout);
}
int readbuffer(FILE *fp)
{
char ch;
len=0;
ch=fgetc(fp);
while(!feof(fp) && ch!='\n')//读取字符到缓冲区
{
buffer[len]=ch;
ch=fgetc(fp);
len++;
}
len--;//用来控制词法分析时行分析中字母的个数
if(feof(fp))//标志文件是否结束
return 0;
else
return 1;
}
void error(int type)
{