合肥工业大学编译原理 LL自上而下文法分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再实现教材P.79给出的预测分析表构造算法。程序显示输出预测分析表或输出到指定文件中。
对文法按教材P.76表4.1构造出G的预测分析程序,程序显示输出如P.78那样的匹配过程。
三、实验环境与工具
操作系统:Windows 7
开发语言:C++
输入字符串的分析
最后一步:你的程序读取输入(键盘)的表达和分析。指出,结果是否符合语法。你要尽可能准确的鉴定结果:定位错误在没有辨认出表达式的情况下。
其次,你的程序必须能够完成对输入多个字符串作为输入,不要忘记重新启动你的程序。
5、程序实现
6、程序代码
/*
不支持规则源文件中有空格
注意使用#表示空产生式使用$表示结束符#
4)分析表的结构
具有非递归语法以及“第一个”和“其后”的集合,你的程序现在可以建立预测分析表。
结果以表的形式显示在屏幕上。
图注释:Construction de la table d’analyse分析表的结构
table d’analyse分析表Affichage de la table d’analyse显示分析表
4、开发过程
1)字符要求:
你的程序必须能够根据以下字符来处理语法:
-终端字符:字母,数字,符号例如“+”,“—”,…;
-非终端字母表中的大写字母。
符号“=”,“|”和“#”(替换“ε”,因为它更容易输入到文本文件)被保留用于语法的描述中,因此不能被用作终端。
2)初始状态
您的程序通过读取一个文件中的“文本”格式开始。
结果被存储在数据结构,再次“你的选择。”
然后,这些集合被显示在屏幕上
图注释:Calcul des ensembles « premiers » et « suivants »计算“第一个”和“其后”的集合
Affichage des ensembles显示集合premiers第一个suivants其后
{
for(int x=0;x<firstnumber;x++)
{
if(first[x]==q)
{
for(int y=x;y<firstnumber-1;y++)
结果必须存储在内存中,是一个您所选择的数据结构。然后,使用一个函数再取出数据,存储在内存中并屏幕上显示(以你选择的格式)。
在上面的图中,并在下文中,右列显示的程序的执行的过程,并左栏表示中使用的数据结构。
这些都是明显的例子。你可以使用任何你想要的格式。
3)消除传递
判断你的程序是否包含一个传递关系或没有。如果包含,递归应该被消除。
{
if(q>=funnumber||q<0)
{
cout<<"error wrong delete fun in sign!";
return;
}
for(int x=q;x<funnumber-1;x++)
fun[x]=fun[x+1];
funnumber--;
}
v源自文库id pop_first(char q)//从first集删除某一节点
#define max 100
class sign
{
public:
sign(){}
sign(int check,char fu)
{
if(check!=0&&check!=1) //符号属性只有0和1
{
cout<<"error sign creat!"<<endl;
}
else
{
identity=check; //设置符号属性
合肥工业大学计算机与信息学院
计算机系2013级
编译原理课程设计报告
姓名:马骏
专业年级:信息安全13-1
学号:2013211869
提交时间:2016年07月
1、实验题目
自上而下的LL(1)文法分析
2、实验目的
了解掌握自上而下的LL(1)文法分析过程。
二、实验内容与要求
从语法分析树构造句型所有的推导的程序实现,接受用户任意输入的一个句型的语法分析树(其表示存于指定文件中),生成该语法分析树中包含的该句型的所有推导(显示输出)。
*/
#include<iostream>
#include<string>
#include<fstream>
#include<windows.h>
using namespace std;
const char* sourcefile="ma_grammaira.txt"; //定义源文件
//const int max=100;
构造一程序,实现教材P.78的FIRST(X)集合的构造算法。对任一给定的文法G,程序输出所有非终结符P的FIRST(P)。构造一程序,实现教材P.78的FIRST(X)集合的构造算法。对任一给定的文法G,程序输出所有非终结符P的FIRST(P)。在此基础上,构造一程序,实现教材P.79的FOLLOW(A)集合的构造算法。对任一给定的文法G,程序输出所有非终结符A的FOLLOW (A)。对于给定的一个LL(1)文法,假定所有非终结符号P的集合FIRST(P)和集合FOLLOW(P)都已知,构造其预测分析表(实现教材P.79给出的预测分析表构造算法)。对教材P.79给出的例4.7构造出预测分析表。程序显示输出预测分析表或输出到指定文件中。
指向自己的判断:
您可以创建一个新的数据结构语句来表示其中传递关系已被删除,这有利于进一步加工。
在这种情况下,如果语法不包含判定递归的语句,程序当然必须使用第二数据结构的副本。
3)计算“first集”和“follow集”的集合
为了产生一个分析器,你现在必须计算,每个分支,“第一个”和“其后”的集合·。
这个文件的结构可以随意构建,不做要求,但建议做成简单的<simple>。
例如,程序描述以下语句:
E = E + T |T
T = T * F |F
F =(E)| 0 |1
在这种情况,我们可以很容易确定E,T和F是非终端,而符号“(”,“)”,“*”和“+”和数字“0”和“1”是在终端。
第一个非终端(第一衍生物)被认为是语法的公理。
id=fu; //设置非终结符符号
funnumber=0;//设置符号规则数为0
firstnumber=0;
follownumber=0;
}
}
void add(string sl)//添加产生规则
{
fun[funnumber]=sl;
funnumber++;
}
void pop(int q)//删除某一规则
相关文档
最新文档