编译原理第2章PL0编译程序
- 格式:ppt
- 大小:541.00 KB
- 文档页数:84


编译原理(PL0编译程序源代码)
/*PL/0编译程序(C语言版)
*编译和运行环境:
*Visual C++6.0
*WinXP/7
*使用方法:
*运行后输入PL/0源程序文件名
*回答是否将虚拟机代码写入文件
*回答是否将符号表写入文件
*执行成功会产生四个文件(词法分析结果.txt符号表.txt虚拟代码.txt源程序和地址.txt)
*/
#include
#include"pl0.h"
#include"string"
#define stacksize 500//解释执行时使用的栈
int main(){
bool nxtlev[symnum];
printf("请输入源程序文件名:");
scanf("%s",fname);
fin=fopen(fname,"r");//以只读方式打开pl0源程序文件
cifa=fopen("词法分析结果.txt","w");
fa1=fopen("源程序和地址.txt","w");//输出源文件及各行对应的首地址
fprintf(fa1,"输入pl0源程序文件名:");
fprintf(fa1,"%s\n",fname);
if(fin){
printf("是否将虚拟机代码写入文件?(Y/N)");//是否输出虚拟机代码 scanf("%s",fname);
listswitch=(fname[0]=='y'||fname[0]=='Y');
printf("是否将符号表写入文件?(Y/N)");//是否输出符号表scanf("%s",fname);
tableswitch=(fname[0]=='y'||fname[0]=='Y');
init();//初始化
err=0;
cc=cx=ll=0;
ch=' ';
if(-1!=getsym()){
fa=fopen("虚拟代码.txt","w");
fas=fopen("符号表.txt","w");
附件1 小组成员:
程序清单
#include<>
#include<>
#include<>
void error(int n);
void getsym();
"。\n");
break;
case 10:printf("语句之间漏了\";\"。\n");
break;
case 11:printf("标识符未说明。\n");
break;
case 12:printf("赋值语句中,赋值号左部标识符属性应是变量。\n");
break;
case 13:printf("赋值语句左部标识符后应是赋值号\":=\"。\n");
break;
case 14:printf("call后应为标识符。\n");
break;
case 15:printf("call后标识符属性应为过程。\n");
break;
case 16:printf("条件语句中丢了\"then\"。\n");
break;
case 17:printf("丢了\"end\"或\";\"。\n");
break; case 18:printf("while型循环语句中丢了\"do\"。\n");
break;
case 19:printf("语句后的符号不正确。\n");
break;
case 20:printf("应为关系运算符。\n");
break;
case 21:printf("表达式内标识符属性不能是过程。\n");
break;
case 22:printf("表达式中漏掉右括号\")\"。\n");
break;
case 23:printf("因子后的非法符号。\n");
《编译原理》
实验报告
项目名称 词法分析程序设计与实现
专业班级
学 号
姓 名
实验成绩:
批阅教师:
年 月 日
实验1《词法分析程序设计与实现》
实验学时: 2 实验地点: 实验日期:
一、实验目的
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
二、实验内容
自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。
从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
三、实验方法
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
主程序初始包括以下两个方面:
⑴ 关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:
Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};
图3-1
(2)程序中需要用到的主要变量为syn,token和sum
扫描子程序的算法思想:
首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。
第十三章 编译程序实现的途径
课前索引
【课前思考】
在第2章我们已经用T型图表示PL/0语言编译程序的功能,用T型图表示一个编译程序的实现功能,容易弄清源语言、目标语言和书写语言3者之间的关系。本章将介绍基于LALR(1的语法分析程序的生成器YACC和基于有限自动机理论的词法分析程序的生成器LEX。因此,建议学员学习本章前复习第3章和第7章的内容。
【学习目标】
◇ 掌握编译程序的书写语言与T型图
◇ 学会用编译程序的自展技术实现一个编译程序
◇ 了解什么是编译程序的移植
◇ 弄清什么是交叉编译
◇ 初步学会使用编译程序的构造工具即:
基于LALR(1的语法分析程序的生成器YACC和基于有限自动机理论的词法分析程序的生成器LEX构造编译程序的思想和步骤。
【学习指南】
本章的学习内容主要是对编译程序构造的几种不同途径,到底采用那种途径,要根据实现的具体环境决定,学员学习时要掌握如何更好地利用已经有的软件资源,能高质量的完成一个编译程序的开发。
【难 重 点】
重点:
◇ 学会用T型图描述实现编译程序的自展技术
◇ 弄清交叉编译与编译程序移植的概念
◇ 理解编译程序的构造工具YACC和LEX的实现原理
◇ 初步学会YACC和LEX的使用方法
难点:用T型图描述实现编译程序的自展技术时,往往对多层T型图的结构理解不清,其原因是没有把一个单层T型图看做是一个程序,而这个程序的功能把一种语言翻译成另一种语
言。
【知 识 点】
由于一个编译程序的设计与实现,不仅要考虑源语言与目标语言,还要考虑实现该编译程序的书写语言,在60年代初,几乎所有的编译程序都是用机器语言或汇编语言书写,而这种低级语言书写的编译程序多为手工构造,可以加工细致,目标程序的效率高,但开发时间长,可读性差,不易调试,不易移植,可维护性和可扩充性更差,可靠性也不高,可以说是效率极低。70年代开始逐步有不少编译程序是用高级语言编写,进而又不断推出编译程序的构造工具,这些技术的发展对编译程序的实现带来极大的方便,不仅缩短了开发周期,提高了开发效率,而且大大增加了可靠性、可移植性、可维护性和可扩充性。本章将介绍编译程序的自展技术、交叉编译、移植和一些编译程序开发工具的应用。