Weird multithreading stuff
asdf via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jan 29 20:26:39 PST 2016
I'm writing a program to parse and evaluate mathematical
expressions
the parse tree is in the format:
struct node
{
string token;
node*[] children;
}
it is parsed such that for the input 1*(2+3)-4*(5+6), the tree
ends up looking like
-
* *
1 + 4 +
2 3 5 6
When the time comes to evaluate this I thought a sensible way to
do it would be this
real evaluate(node top)
{
real output;
string token = top.token;
if (tokenIsAnOperator)
{
real[2] operands;
foreach (i, child; parallel(top.children))
{
operands[i] = evaluate(*child);
}
output = someFunctionWiththeRightOperator(operands[0],
operands[1]);
}
else // it must be a number
{
output = parse!real();
}
return output;
}
Which works perfectly - about 20-30% of the time
I can literally paste 1*(2+3)-4*(5+6) into the input over and
over, and I get
0
5
-39
no digits seen
Floating point conversion error for input "".
seemingly randomly (those two errors are apparently coming from
somewhere in the std library)
When I put in less complicated expressions I get the right answer
more of the time, but it can still come out wrong occasionally
And the weirdest part: when I remove "parallel" from the foreach
loop, it always gives me the correct answer
anyone know what's going on here, and/or how to fix it?
More information about the Digitalmars-d-learn
mailing list