scheme编译器-预处理器(二)多态性的宏

之前的代码有稍许错误进行了修改,另:加入了对scheme宏的完全支持:

只改动了InitSyntax函数:

bool WordReader::InitSyntax()
{
	std::string in;
	std::string pre;
	std::string name;
	
	syntax syntax_;
	SyntaxMap.clear();
	if (str.empty())return false;
	std::istringstream is(str);
	std::ostringstream os;
	is >> in;
	while (!is.eof())
	{
		
		if (in == "define-syntax")
		{
			is >> name;

			EOFERROR(P003, name);
			ASSUMEMATCH("(",P002);
			ASSUMEMATCH("syntax-rules", P002);
			ASSUMEMATCH("(", P002);
			ASSUMEMATCH(")", P002);
			is >> in;
			EOFERROR(P002, name);
			do{
				syntax_.params.clear();
				if (in != "(")	
				{
					std::ostringstream eos;
					eos << P002 << name << std::endl;
					err = eos.str();	return false;
				}										//Rules Match Start
				ASSUMEMATCH("(", P002);					//Modern Match Start
				ASSUMEMATCH(name, P002);
				EOFERROR(P003, name);
				is >> in;
				while (in != ")")
				{
					syntax_.params.push_back(in);
					EOFERROR(P003, name);
					is >> in;
				}										//Params Match OK
				std::ostringstream cs;					//Context(Modern) Match Start
				int i_match = 0;
				while (i_match != -1)
				{
					EOFERROR(P004, name);
					is >> in;
					cs << " " << in <<" ";
					if (in == "(")i_match++;
					if (in == ")")i_match--;
				}
				syntax_.defination = cs.str();
				syntax_.defination.pop_back();
				syntax_.defination.pop_back();
				syntax_.defination.pop_back();
				std::list<syntax>& ls = SyntaxMap[name];
				ls.push_back(syntax_);					//Context Match OK
				is >> in;
				EOFERROR(P006,name);
			}while(in!=")");
			ASSUMEMATCH(")", P006);
			continue;
		}
		os << " " << in << " ";
		is >> in;
	}
	str = os.str();
	return true;
}//2015/4/8
//2015/4/9 Add Muti-paramnum Syntax Supporting
运行图片,显示了每个过程以及读入的宏map:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值