资源简介
C语言编写的pl0语言编译器
pl0作为编译原理最基础的学习编译原理的一个完备语言,最适合作为编写编译器的入门语言。
代码片段和文件信息
// pl/0 compiler with code generation
#include
#include
#include “pl0.h“
void error(long n){
long i;
printf(“ ****“);
for (i=1; i<=cc-1; i++){
printf(“ “);
}
printf(“^%2ld\n“n);
err++;
}
void getch() {
if(cc==ll){
if(feof(infile)){
printf(“************************************\n“);
printf(“ program incomplete\n“);
printf(“************************************\n“);
exit(1);
}
ll=0; cc=0;
printf(“%5ld “ cx);
while((!feof(infile))&&((ch=getc(infile))!=‘\n‘)){
printf(“%c“ch);
ll=ll+1; line[ll]=ch;
}
printf(“\n“);
ll=ll+1; line[ll]=‘ ‘;
}
cc=cc+1; ch=line[cc];
}
void getsym(){
long ijk;
while(ch==‘ ‘||ch==‘\t‘){
getch();
}
if(isalpha(ch)){ // identified or reserved
k=0;
do{
if(k a[k]=ch; k=k+1;
}
getch();
}while(isalpha(ch)||isdigit(ch));
if(k>=kk){
kk=k;
}else{
do{
kk=kk-1; a[kk]=‘ ‘;
}while(k }
strcpy(ida); i=0; j=norw-1;
do{
k=(i+j)/2;
if(strcmp(idword[k])<=0){
j=k-1;
}
if(strcmp(idword[k])>=0){
i=k+1;
}
}while(i<=j);
if(i-1>j){
sym=wsym[k];
}else{
sym=ident;
}
}else if(isdigit(ch)){ // number
k=0; num=0; sym=number;
do{
num=num*10+(ch-‘0‘);
k=k+1; getch();
}while(isdigit(ch));
if(k>nmax){
error(31);
}
}else if(ch==‘:‘){
getch();
if(ch==‘=‘){
sym=becomes; getch();
}else{
sym=nul;
}
}else if(ch==‘<‘){
getch();
if(ch==‘=‘){
sym=leq; getch();
}else if(ch==‘>‘){
sym=neq; getch();
}else{
sym=lss;
}
}else if(ch==‘>‘){
getch();
if(ch==‘=‘){
sym=geq; getch();
}else{
sym=gtr;
}
}else{
sym=ssym[(unsigned char)ch]; getch();
}
}
void gen(enum fct x long y long z){
if(cx>cxmax){
printf(“program too long\n“);
exit(1);
}
code[cx].f=x; code[cx].l=y; code[cx].a=z;
cx=cx+1;
}
void test(unsigned long s1 unsigned long s2 long n){
if (!(sym & s1)){
error(n);
s1=s1|s2;
while(!(sym & s1)){
getsym();
}
}
}
void enter(enum object k){ // enter object into table
tx=tx+1;
strcpy(table[tx].nameid);
table[tx].kind=k;
switch(k){
case constant:
if(num>amax){
error(31);
num = 0;
}
table[tx].val=num;
break;
case variable:
table[tx].level=lev; table[tx].addr=dx; dx=dx+1;
break;
case proc:
table[tx].level=lev;
break;
}
}
long position(char* id){ // find identifier id in table
long i;
strcpy(table[0].nameid);
i=tx;
while(strcmp(table[i].nameid)!=0){
i=i-1;
}
return i;
}
void constdeclaration(){
if(sym==ident){
getsym();
if(sym==eql||sym==becomes){
if(sym==becomes){
error(1);
}
getsym();
if(sym==number){
enter(constant); getsym();
}e
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2804 2012-02-12 09:30 pl0\include\pl0.h
文件 11892 2012-02-12 09:30 pl0\src\pl0.c
文件 281 2012-02-12 09:30 pl0\sample\multiply.pl0
文件 1530 2012-02-12 09:30 pl0\sample\multiply.res
文件 716 2012-02-12 09:30 pl0\sample\tests.pl0
文件 4481 2012-02-12 09:30 pl0\sample\tests.res
文件 162903 2012-02-13 01:41 pl0\doc\pl0.pdf
文件 408 2012-02-12 09:30 pl0\Makefile
文件 130 2012-02-12 09:30 pl0\make.simple
文件 1787 2012-02-13 01:46 pl0\README
目录 0 2012-02-12 09:30 pl0\include\
目录 0 2012-02-12 09:30 pl0\src\
目录 0 2012-02-12 09:30 pl0\sample\
目录 0 2012-02-12 09:31 pl0\test\
目录 0 2012-02-13 01:45 pl0\doc\
目录 0 2012-02-13 01:46 pl0\
相关资源
- 背包问题实验报告C语言实现、文件输
- 矩阵键盘C语言代码,proteus仿真电路
- C语言编写班费管理系统
- 教学计划编制 数据结构 C语言
- ER随机图代码C语言
- 集合的并交叉三种运算,C语言实现
- c语言实现简单数据库
- C语言实现局域网扫描器
- C语言实现企业员工管理系统的源代码
- kalman和ukf滤波C语言源码和
- 用C语言实现简单的数据库增删改查功
- 第6章 C语言和汇编语言混合编程(
- 构建二叉树、输出二叉树、求树深、
- WM(Wu-Manber)算法详解及C语言实现
- 智能双电梯的C语言程序实现
- 数据结构家族谱管理系统C语言源代码
- C语言实现三自由度机械臂轨迹规划源
- C8051F310虚拟I2C C语言代码
- 用C语言实现视频分割
- 数据结构课程设计C语言版运动会分数
- 遗传算法求解中国旅行商问题C语言
- C语言--旅游管理系统文件,结构体数
- 基于c语言的银行业务模拟
- C语言实现:Linux下的myshell
- C语言程序设计药房药品管理系统
- C语言:英文单词小助手源代码
- c语言五子棋代码
- C语言 报刊订阅管理系统
- Jacobi迭代法解方程(C语言代码)
- 迷宫问题c语言源代码
评论
共有 条评论