https://gist.github.com/henrikhodne/145235
我无法理解这个程序应该如何工作。如何通过此程序解析“(23 * 2)/ 9 + 3”这样的声明?
这是Bjarne Stroustrup的C ++书中的计算器程序。它应该遵循这个语法:
表达式:
Term
Expression "+" Term // Addition
Expression "–" Term // Subtraction
期限:
Primary
Term "*" Primary // Multiplication
Term "/" Primary // Division
Term "%" Primary // Remainder (modulo)
初级:
Number
"(" Expression ")" // grouping
数:
floating-point-literal
根据此语法解析输入字符的各个函数实现如下:
double expression()
{
double left = term(); // Read and evaluate a Term
Token t = ts.get(); // Get the next token from the token stream
while(true) {
switch(t.kind) {
case '+':
left += term(); // Evaluate the term and add
t = ts.get();
break;
case '-':
left -= term(); // Evaluate the term and subtract
t = ts.get();
break;
default:
ts.putback(t); // Put t back into the token stream.
return left; // Finally: no more + or -: return the answer
}
}
}
double term()
{
double left = primary();
Token t = ts.get(); // Get the next token from the token stream
while (true) {
switch (t.kind) {
case '*':
left *= primary();
t = ts.get();
break;
case '/':
{
double d = primary();
if (d == 0)
error("divide by zero");
left /= d;
t = ts.get();
break;
}
default:
ts.putback(t);
return left;
}
}
double primary() // Read and evaluate a Primary
{
Token t = ts.get();
switch (t.kind) {
case '(': // Handle '(' expression ')'
{
double d = expression();
t = ts.get();
if (t.kind != ')')
error("')' expected");
return d;
}
case '8': // We use '8' to represent a number
return t.value; // Return the number's value
default:
error("primary expected");
}
}
我不明白while(true)循环在expression()中的行为。 (真实)条件是做什么的?
答案 0 :(得分:1)
它不断迭代令牌流,直到它能够找到一个运算符" *" " +"或" - "。中断确保循环不会像
那样保持无限循环let tours = [{
'id': 1,
price: 200
},
{
'id': 1,
price: 300
},
{
'id': 3,
price: 150
},
{
'id': 2,
price: 110
},
{
'id': 3,
price: 120
},
{
'id': 2,
price: 100
}
];
var output = tours.reduce((acc, c) => {
acc[c.id] = acc[c.id] ? Math.min(c.price, acc[c.id]) : c.price;
return acc;
}, {});
console.log(output);
将永远运行
答案 1 :(得分:0)
while(true)
是一个常见的结构。它是无限循环。但是它可以return
来自。return
。在查看代码时,我们会在某些case
分支中看到while
。
因此,case
将迭代,直到其正文中的某些代码更改状态,以便执行包含return
的{{1}}。然后,这将终止while(true)
。
答案 2 :(得分:0)
- 真正的条件是无用的,因为无论在默认情况下会发生什么,函数都会返回一些东西,但通常是(true)循环,直到你使用break,return或任何让你离开循环的东西