1506200056肖志伟-实验一

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广州大学学生实验报告

一、实验目的

学生运用编译原理的知识在实验技能和方法小组设计实验方案并加以实现。

二、基本知识

1、完整的编译过程

2、LR分析法

三、实验环境

1、Windows操作系统

2、C++语言

四、实验要求

运用编译原理知识,经检验,该程序能正确运行。

五、实验内容

完成一个相对完整的编译器,该编译完成对变量类型(整数/浮点数)定义、赋值、四则运算、逻辑运算、跳转与循环控制功能。其输入是源程序(参见“一个四则运算源程序示例”),输出是所有变量的最终值。

要求:

(1)输入任意一个正确的文法G[S],都能分析,并得出一个等价的LL(1)文法G[E];

(2)根据该LL(1)文法G[E]的文法规则建立LL(1)分析表;

(3)输出输入串分析过程。其分析过程。

六、实验代码及实验截图

实验代码如下:

(2)根据该LL(1)文法G[E]的文法规则建立LL(1)分析表;

(3)输出输入串分析过程。其分析过程。

#define _CRT_SECURE_NO_DEPRECATE

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAX 507

using namespace std;

map > first;

map > follow;

map VN_dic;

vector VN_set;

bool used[MAX];

class WF

{

public:

string left;

set right;

WF(char s[])

{

left = s;

}

void print()

{

printf("%s->", left.c_str());

set::iterator it = right.begin();

if (right.begin() != right.end())

{

printf("%s", it->c_str());

it++;

}

for (; it != right.end(); it++)

printf("|%s", it->c_str());

puts("");

}

void insert(char s[])

{

right.insert(s);

}

};

void dfs(int x)

{

if (used[x]) return;

used[x] = 1;

string& left = VN_set[x].left;

set& right = VN_set[x].right;

set::iterator it = right.begin();

for (; it != right.end(); it++)

for (int i = 0; i < it->length(); i++)

{

if (!isupper(it->at(i)) && it->at(i) != '\'')

{

first[left].insert(it->at(i));

break;

}

if (isupper(it->at(i)))

{

int y;

if (i != it->length() - 1 && it->at(i + 1) == '\'')

y = VN_dic[it->substr(i, 2)] - 1;

else y = VN_dic[it->substr(i, 1)] - 1;

string& tleft = VN_set[y].left;

dfs(y);

set& temp = first[tleft];

set::iterator it1 = temp.begin();

bool flag = true;

for (; it1 != temp.end(); it1++)

{

if (*it1 == '~') flag = false;

first[left].insert(*it1);

}

if (flag) break;

}

else continue;

}

}

void make_first()

{

memset(used, 0, sizeof(used));

for (int i = 0; i < VN_set.size(); i++)

dfs(i);

#define DEBUG

#ifdef DEBUG

puts("***************FIRST集***********************");

map >::iterator it = first.begin();

for (; it != first.end(); it++)

{

printf("FIRST(%s)={", it->first.c_str());

set & temp = it->second;

set::iterator it1 = temp.begin();

bool flag = false;

for (; it1 != temp.end(); it1++)

{

if (flag) printf(",");

printf("%c", *it1);

flag = true;

}

puts("}");

}

#endif

}

void append(const string& str1, const string& str2)

{

set& from = follow[str1];

set& to = follow[str2];

set::iterator it = from.begin();

for (; it != from.end(); it++)

to.insert(*it);

}

void make_follow()

{

while (true)

{

bool goon = false;

for (int i = 0; i < VN_set.size(); i++)

{

string& left = VN_set[i].left;

set& right = VN_set[i].right;

set::iterator it = right.begin();

相关文档
最新文档