Linux环境下的针对PL0语言的语法词法语义分析

摘 要

此次编译原理课程设计,我利用flex工具进行PL/0语言的词法分析、自己用C++语言实现了LR语法分析、语义分析以及中间代码生成,我选择的是布尔表达式文法,对符合文法的布尔表达式能够产生相应四元式,处理了控制结构的真链与假链,对错误的表达式能够给出错误提示。

鉴于flex工具原本来自Unix以及个人日常习惯,本实验开发环境选用Linux,代码在Ubuntu16.10中测试通过。

关键字:flex;词法分析;Linux;语法分析;中间代码生成;真假链

引 言

编译原理是一门实践性比较强的学科,学习了课本上理论知识,阅读了书后示例PL/0编译程序,此次课程设计针对PL/0语言进行了词法分析、语法分析及布尔表达式的中间代码(四元式)生成。其中PL/0的词法分析程序的功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析;而语法分析的任务是识别单词符号序列是否符合给定的语法规则。实验中在语法分析过程中需要用到flex工具,这个工具源于Unix和Linux,很多同学使用Windows还需要配置相关环境,我日常使用Linux,因此选用它作为编程环境,免去了不必要的麻烦,配置较为方便。

一、实验目的

实现对布尔表达式的词法分析、语法分析、语义分析并产生四元式中间代码,完成真假链的回填及合并。

1.1 词法分析部分

利用C++和flex工具设计编写一个词法分析程序,实现对标志符、数字、保留字和算符等一系列符号的识别,用于后面做语法分析和语义分析;

1.2 语法分析部分

采用LR(0)语法分析方法,设计、开发如下文法描述语言的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,加深课堂相关理论教学内容的理解,提高语法分析方法的实践能力。语法分析完成之后可用于语义分析。

1.3 语义分析部分

基于以上两步词法和语法分析的工作,采用一边归约一边建立语义栈并做语义分析的方法,分析给出的布尔表达式是否符合相应文法,最后产生四元式 ,实现真假链的回填及合并 。

点击此处下载文档和源码

pl0语法分析器,编译原理实验; 用C写的。 /语法分析过程中 /利用词法分析的结果进行分析 /严格按照PL0程序定义来编写 / /<程序> ::= <程序首部> <分程序>. /<程序首部> ::= PROGRAM <标识符>; /<分程序> ::= [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句部分> /<常量说明部分> ::= CONST <常量定义>{,<常量定义>}; /<常量定义> ::= <标识符>=<无符号整数> /<变量说明部分> ::= VAR <标识符>{,<标识符>}; /<过程说明部分> ::= <过程首部>;<分程序>;【原课件中没有最后的分号,经分析应该有分号】 /<过程首部> ::= PROCEDURE <标识符> /<语句部分> ::= <语句>|<复合语句> /<复合语句> ::= BEGIN <语句>{;<语句>} END【符合语句应该注意的是,END前距离END最近的那条语句一定没有分号,其他语句必须有分号】 /<语句>::= <赋值语句>|<条件语句>|<当型 循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句> /<赋值语句> ::= <标识符>:=<表达> /<读语句> ::= READ(<标识符>{,<标识符>}) /<写语句> ::= WRITE(<表达>{,<表达>}) /<过程调用语句> ::= CALL <标识符>【原课件中有分号,实际不应该有】 /<条件语句> ::= IF <条件> THEN <语句> /<当型循环语句> ::= WHILE <条件> DO <语句> /<因子> ::= <标识符>|<常量>|(<表达>) /<项> ::= <因子>{<乘法运算符><因子>} /<乘法运算符> ::= *|/ /<表达> ::= [+|-]<项>{<加法运算符><项>} /<加法运算符> ::= +|- /<条件> ::= <表达><关系运算符><表达>|ODD <表达> /<关系运算符> ::= #|=|>|>=|<|<=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值