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