- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理实验报告
上机实验检查(总计70分):
(1)分离解释和编译器(20分):
将解释器从已有代码中分离出来,形成一个独立的解释器,对于中间代码文件,可以执行并输出相应的结果。 (2)注释处理(10):
增加对注释的支持,注释由 (* 和 *)包含,不允许嵌套。 (3)布尔数据处理(10分):
增加对于布尔类型的支持,其产生式见《编译原理实践教程》。 (4)布尔表达式的短路处理(10分):
在上面工作的基础上,对 and 和 or 采取短路计算。 (5)for 语句处理(20分):
参照C语言,增加对于 for 语句处理。
完成情况(15分):
修改后的PL/0词法(正规式)
下面是本设计用到的正规式,bool类型的常量与变量都是通过保留字来体现的,number只是用于识别整型变量与常量。
空白
w-’ ’; //空格
n-\n; //回车
t-Tab; //制表
blank - (w | n | t)+;
保留字
begin -begin; //保留字
end - end;
if - if;
then - then;
while - while;
do - do;
call-call;
const - const;
var - var;
procedure - procedure;
boolean -boolean;
bool -true|false;//布尔常量
数字以及ID
digit - 0|1|2|3|4|5|6|7|8|9;
number - digit(digit)*;
letter - a-zA-Z;
id - letter (digit|letter)*;
特殊符号
becomes-:=;
leq- ‘=’;
les - ’’;
req- ‘=’;
res - ‘’;
relation - = | = | = | | ;//关系运算符
plus - ‘+’;
minus- ‘-’;
times - ‘*’;
slash - ‘/’;
odd - ‘odd’;
equ -’=’;
lparen -’(’;
rparen - ‘)’;
comma - ‘,’;
semicolon - ‘;’;
period - ‘.’;
and - ‘’;
or - ‘|’;
not - ‘!’;
修改后的PL/0语法(产生式)
设计采用递归预测分析的方法进行语法分析。
P-B. //P代表Program,B代表block
B-MS; //M代表申明, S代表语句序列
M - C|V|P|L|e //C代表常量申明,V代表变量申明,P代表程序体申明,L代表bool申明,e代表空
C - const C’
C’- id = number C’ | id = bool C’ | ; | ,C’
V -var V’
V’-idV’ |,V’|;
P- procedure id ; B ;
L - boolean L’
L’-idL’|, L’ |;
语句序列
S - S’;S | S’
语句的产生式
S’- I | C| G|F|W
//I代表赋值语句,C代表call语句 ,G代表begin语句,F代表if语句,W代表while语句
I -id := X //X代表表达式
C -call id
G -begin S end
F - if T then S’ //T代表条件
W - while T do S’
条件
T - X | odd X| X relation X
表达式
X - + R| -R |R
R- PR’;
R’-+PR’ | -PR’ | |PR’ | e
P-HP’
P’-*HP’ | /HP’| HP’ | e
H-!H | C
C-id | number | (X)
各任务的实现伪代码或者主要思想
任务一:注释
实现该任务,只需要在getsym()函数中添加一点功能即可。也就是在词法分析的部位,利用那种与跳过空白类似的技术。由于代码比较短,下面直接贴出,并给予解释。
if(ch == ( )
{
stored = ch;
getch();
if( ch == * )
{
flag = 1;
getch();
do
{
while( ch != * )
{
getch();
}
getch();
}while(ch != ));
flag = 0;
getch(
文档评论(0)