我正在Stroustrup的新书"使用C++编程原理和实践"中进行练习,并且想知道SO上是否有人做过这些并愿意分享这些知识?特别是关于在第6章和第7章中开发的计算器.例如关于添加的计算器!运营商和sqrt(),pow()等我已经完成了这些,但我不知道我所拥有的解决方案是否是"好"的做事方式,并且Bjarne网站上没有已发布的解决方案.我想知道我是否走上正轨.也许我们可以为练习制作一个维基?
基本上我有一个令牌解析器.它从cin一次读取一个字符.它意味着标记像5*3 + 1这样的表达式,它的效果非常好.其中一个练习是添加一个sqrt()函数.所以我修改了令牌化代码以检测"sqrt("然后返回表示sqrt的Token对象.在这种情况下,我使用char的'.这是其他人会怎么做的?如果我需要实现sin()怎么办?案件陈述会变得混乱.
char ch;
cin >> ch; // Note that >> skips whitespace (space, newline, tab, etc.)
switch (ch) {
case ';': // For "print"
case 'q': // For "quit"
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
case '!':
return Token(ch); // Let each character represent itself
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
cin.putback(ch); // Put digit back into the input stream
double val;
cin >> val; // Read a floating-point number
return Token('8', val); // Let '8' represent "a number"
}
case 's':
{
char q, r, t, br;
cin >> q >> r >> t >> br;
if (q == 'q' && r == 'r' && t == 't' && br == '(') {
cin.putback('('); // Put back the bracket
return Token('s'); // Let 's' represent sqrt
}
}
default:
error("Bad token");
}
Run Code Online (Sandbox Code Playgroud)
小智 212
在Stroustrup - Programming上发布的解决方案很少,而且随着时间的推移会有更多的解决方案.
尝试使用目前在书中提供的语言功能和库设施来解决练习 - 真正的新手用户不能做任何其他事情.然后返回以查看如何改进解决方案.
Pow*_*101 10
我认为函数指针的字符串映射可能是一种简洁的方式来表示像sqrt,sin,cos等取一个double并返回double的东西:
map<std::string, double (*)(double)> funcs;
funcs["sqrt"] = &sqrt;
funcs["sin"] = &sin;
funcs["cos"] = &cos;
Run Code Online (Sandbox Code Playgroud)
然后,当解析器检测到正确的字符串(str)时,它可以使用参数(arg)调用该函数,如下所示:
double result = funcs[str](arg);
Run Code Online (Sandbox Code Playgroud)
使用此方法,单个调用可以处理所有类型的函数(该类型).
实际上我不确定这是否是正确的语法,任何人都可以确认吗?
这看起来像一个有用的方法吗?