资源简介

pl0中增加bool类型处理支持,解压以后就可以运行,献给为编译奋斗的人们

资源截图

代码片段和文件信息

// pl0 compiler source code

#include 
#include 
#include 
#include 
#include “set.h“
#include “pl0.h“

//////////////////////////////////////////////////////////////////////
// print error message.
void error(n)//出错处理程序,指明错误类型
{
int i;

printf(“      “);
for (i = 1; i <= cc - 1; i++)          //cc表示已识别字符个数
printf(“ “);
fprintf(outfile “ “);
fprintf(outfile “^\n“);     //fprintf函数是将字符串写入文件,这里是将换行符写入文件
printf(“^\n“);               //printf函数是在屏幕上输出
fprintf(outfile “Error %3d: %s\n“ n err_msg[n]);
printf(“Error %3d: %s\n“ n err_msg[n]);//输出错误类型,err_msg[]在前面已定义
err++;//err表示的是错误数,这里将错误数加一
} // error

//////////////////////////////////////////////////////////////////////
/*这个函数的作用是获取一个字符,即读入下一个字符,比如一行代码如下所示:
const a:=1b:=3;
当它已读入const中的n后,调用这个函数,获取下一个字符就是s,这个函数是为
下一个函数getsym()做铺垫的,getsym()要频繁的调用这个函数*/
void getch(void)
{
if (cc == ll)//字符个数等于长度其中cc表示已识别字符个数,ll表示整行字符串的长度
{      //这个函数使用了缓冲区技术,它先将一行代码读入缓冲区,根据cc和ll来判断缓冲区
             //的字符是否已识别完即ll==cc表明断缓冲区的字符已识别完,需要再读入一行代码
if (feof(infile))  //代码是以文件的形式提供的,这个函数判断是否到了文件末尾
{
printf(“\nPROGRAM INCOMPLETE\n“);
exit(1);
}
ll = cc = 0;
fprintf(outfile “%5d  “ cx);
printf(“%5d  “ cx);
while ( (!feof(infile)) // added & modified by alex 01-02-09
    && ((ch = getc(infile)) != ‘\n‘))
{
fprintf(outfile “%c“ ch);
printf(“%c“ ch);
line[++ll] = ch;
} // while
fprintf(outfile “\n“);
printf(“\n“);
line[++ll] = ‘ ‘;     //缓冲区数组
}
ch = line[++cc];//如果cc!=ll,继续从缓冲区中获取字符
} // getch//ch跳到下一个字符上
//////////////////////////////////////////////////////////////////////
int boolroint()//判断是否是bool类型或者int类型
{
int i=0;
for(i=0;i {
if (line[i]==‘:‘)
{
break;
}
}
if (line[i]==‘:‘)
{
if (line[i+1]==‘b‘)//bool
{
return 1;
}
if(line[i+1]==‘i‘)//intager
{
return 0;
}
}
}
//////////////////////////////////////////////////////////////////////
// gets a symbol from input stream.
/*这个函数的作用是识别关键字、标识符、数字,比如一行代码如下所示:
const a:=1b:=3;
调用这个函数后它就识别出const这个关键字,并将它记入符号表,再调用的话就会识别出‘,’
然后识别出a这个标识符 */
void getsym(void)
{
int i k;
char a[MAXIDLEN + 1];     // MAXIDLEN  标识符的长度  设为 10

while (ch == ‘ ‘|| ch == ‘\t‘) //跳过空格
// modified.修改 by yzhang 02-03-12add some white space
getch();

if (isalpha(ch))//识别出关键字或标识符
{ // symbol is a reserved word or an identifier.
k = 0;
do
{
if (k < MAXIDLEN)
a[k++] = ch;
getch();
}
while (isalpha(ch) || isdigit(ch));//识别出关键字或标识符数字
a[k] = 0;
strcpy(id a);    
word[0] = id;//word关键字集合
i = NRW;        // NRW   关键字的长度  设为 11
while (strcmp(id word[i--]));
if (++i)
{
sym = wsym[i]; // symbol is a reserved word
if (sym == SYM_TRUE)
{
num = 1;
}
if (sym == SYM_FALSE)
{
num = 0;
}
}
else
sym = SYM_IDENTIFIER;   // symbol is an identifier
}
else if (isdigit(ch))//识别出数字
{ // symbol is a number.
k = num = 0;
sym = SYM_NUMBER;
do
{
num = num *

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2012-07-16 22:41  添加BOOL\
     目录           0  2012-07-16 22:41  添加BOOL\Debug\
     文件          44  2002-02-28 10:28  添加BOOL\Debug\e1
     文件      196669  2012-07-16 16:23  添加BOOL\Debug\pl0.exe
     文件      320796  2012-07-16 16:23  添加BOOL\Debug\pl0.ilk
     文件       54859  2012-07-16 16:23  添加BOOL\Debug\pl0.obj
     文件      221984  2012-07-16 15:29  添加BOOL\Debug\pl0.pch
     文件      517120  2012-07-16 16:35  添加BOOL\Debug\pl0.pdb
     文件        6099  2009-06-15 22:47  添加BOOL\Debug\set.obj
     文件       58368  2012-07-16 16:27  添加BOOL\Debug\vc60.idb
     文件       53248  2012-07-16 16:23  添加BOOL\Debug\vc60.pdb
     文件        1504  2012-07-16 16:27  添加BOOL\example.out
     文件         182  2012-07-16 16:25  添加BOOL\example.txt
     文件       28134  2012-07-16 16:21  添加BOOL\pl0.c
     文件        3537  2009-06-21 00:05  添加BOOL\pl0.dsp
     文件         514  2009-06-15 22:18  添加BOOL\pl0.dsw
     文件        5180  2012-07-16 14:52  添加BOOL\pl0.h
     文件      132096  2012-07-16 16:27  添加BOOL\pl0.ncb
     文件       49664  2012-07-16 16:27  添加BOOL\pl0.opt
     文件         750  2012-07-16 16:23  添加BOOL\pl0.plg
     文件        2177  2009-06-15 20:29  添加BOOL\set.c
     文件         377  2012-07-16 15:29  添加BOOL\set.h

评论

共有 条评论