@@ -223,15 +223,14 @@ Method* parseMethod(char* &cur) {
223223
224224std::map<char ,char > precedence_map () {
225225 std::map <char ,char > prec;
226- prec[OP_ARRAYGET] = 6 ; // Careful
227- prec[OP_ARRAYSET] = 6 ; // Careful
228- prec[OP_FIELDGET] = 6 ; // Careful
229- prec[OP_FIELDSET] = 6 ; // Careful
230- prec[OP_DEREFGET] = 6 ; // Careful
231- prec[OP_DEREFSET] = 6 ; // Careful
232-
233- prec[OP_ADDR] = 5 ; // Careful
226+ prec[OP_ARRAYGET] = 5 ; // Careful
227+ prec[OP_ARRAYSET] = 5 ; // Careful
228+ prec[OP_FIELDGET] = 5 ; // Careful
229+ prec[OP_FIELDSET] = 5 ; // Careful
230+ prec[OP_DEREFGET] = 5 ; // Careful
231+ prec[OP_DEREFSET] = 5 ; // Careful
234232
233+ prec[OP_ADDR] = 4 ; // Careful
235234 prec[OP_NOT] = 4 ;
236235 prec[OP_NEG] = 4 ; // Careful, this has to be parsed from a urinary -
237236
@@ -279,6 +278,7 @@ Expression* parseExpr(char* &cur) {
279278 std::stack<std::stack<opprec>*> parseStack;
280279 std::stack<opprec>* oper = new std::stack<opprec>();
281280 char lastType = -1 , nextType = -1 ;
281+ bool prefix = false ;
282282 while (*cur) {
283283 char * tok = next (cur);
284284 lastType = nextType;
@@ -378,6 +378,14 @@ Expression* parseExpr(char* &cur) {
378378 if (lastType == POPERATOR && tok[0 ] == POPERATOR && tok[1 ] == OP_SUB) // special operator renaming
379379 tok[1 ] = OP_NEG;
380380 char prec = precedence[tok[1 ]];
381+ switch (tok[1 ]) {
382+ case OP_NEG:
383+ case OP_NOT:
384+ case OP_ADDR:
385+ prefix = true ;
386+ oper->push (mk_opprec (Operator::get (tok[1 ]),prec));
387+ goto next_exprparse;
388+ }
381389 while (!oper->empty () && prec <= oper->top ().prec ) {
382390 expr.push_back (oper->top ().op );
383391 oper->pop ();
@@ -452,6 +460,11 @@ Expression* parseExpr(char* &cur) {
452460 next_exprparse:
453461 debug (" next_exprparse" );
454462 cur = tok;
463+ if (!prefix && !oper->empty () && oper->top ().prec == 4 ) {
464+ expr.push_back (oper->top ().op );
465+ oper->pop ();
466+ }
467+ if (prefix) prefix = false ;
455468 }
456469 end_exprparse:
457470 debug (" end_exprparse" );
0 commit comments