输入输出文法1

Input

 8
E E+T
T T*F
E T
T F
F (E)
F i
E E-T
T T/F

Output

G[E]:
E::=E+T | T | E-T
T::=T*F | F | T/F
F::=(E) | i

 

#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
	struct  { int Nv;string VN[10];} Vns={3,"E","T","F"};
	struct  { int Nt;string VT[10];} Vts={7,"+","-","*","/","(",")","i"};
	struct  { int Np;string PL[20],PR[20];} ps={0};
	string S="E"; 
	int N;
	cin >> N;
	std::map<string, vector<string> > m;
	while(N--){
		string a;
		string b;
		cin >> a >> b;
		m[a].push_back(b);
	}

	// print
	cout << "G[" << S << "]:" << endl;
	for (int i = 0; i < Vns.Nv; ++i)
	{
		cout << Vns.VN[i] << "::=";
		for(int j = 0; j < m[Vns.VN[i]].size(); j++){
			if(j < m[Vns.VN[i]].size()-1)
				cout << m[Vns.VN[i]][j] << " | ";
			else
				cout << m[Vns.VN[i]][j];
		}
		cout << endl;
	}
	return 0;
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验2 文法读入、判定和处理 一、实验目的 熟悉文法的结构,了解文法在计算机内的表示方法。 二、实验内容 1、 设计一个表示文法的数据结构; 2、 从文本文件中读入文法,利用定义的数据结构存放文法,并输出; 3、 本实验结果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终结符号集合,在实验中用大写的英文字母表示; Vt 文法的终结符号集合,在实验中用小写的英文字母表示; S 开始符号,在实验中是Vn集合中的一个元素; P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计成结构体形式,结构体中应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计成文法类形式,类中至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计的数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件中读入文法文法事先应写入文本文件); 2) 根据文法产生式的结构,分析出文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法的结构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框中输出文法文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值