之前的代码有稍许错误进行了修改,另:加入了对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: