[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/utils/abakus/src
From:       Michael Pyne <mpyne () purinchu ! net>
Date:       2008-05-31 22:38:28
Message-ID: 1212273508.701398.20520.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 815013 by mpyne:

Fix exponentiation and unary minus precedence in abakus (I haven't looked at
this stuff in ages, I'm glad I remembered to comment it.)

Now -2^2 gives a result of -4 as expected. 2^3^2 still gives the right answer, all other expressions I've
tested still work.  I haven't developed a testsuite yet and I saw no online testsuite for math parsers
so this may need more testing.

Noted on a bug report by Vincent Lefevre.

I don't intend to backport to the the KDE 3.5 version of abakus (but because I don't feel like trying to
find out where I left it, not because I'm opposed).


 M  +13 -11    parser.yy  


--- trunk/playground/utils/abakus/src/parser.yy #815012:815013
@@ -1,6 +1,6 @@
 /*
  * parser.yy - part of abakus
- * Copyright (C) 2004, 2005 Michael Pyne <michael.pyne@kdemail.net>
+ * Copyright (C) 2004, 2005, 2008 Michael Pyne <michael.pyne@kdemail.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@
 }
 
 %token <value> NUM
-%type <node> EXP FACTOR TERM S EXPONENT NUMBER VALUE FINAL
+%type <node> EXP FACTOR TERM S NUMBER VALUE FINAL
 %type <fn> FUNC
 %token <fn> FN
 %token <ident> ID
@@ -303,17 +303,19 @@
 EXP: EXP '-' FACTOR { $$ = new BinaryOperator(BinaryOperator::Subtraction, $1, $3); }
 EXP: FACTOR { $$ = $1; }
 
-FACTOR: FACTOR '*' EXPONENT { $$ = new BinaryOperator(BinaryOperator::Multiplication, $1, $3); }
-FACTOR: FACTOR '/' EXPONENT { $$ = new BinaryOperator(BinaryOperator::Division, $1, $3); }
-FACTOR: EXPONENT { $$ = $1; }
+FACTOR: FACTOR '*' TERM { $$ = new BinaryOperator(BinaryOperator::Multiplication, $1, $3); }
+FACTOR: FACTOR '/' TERM { $$ = new BinaryOperator(BinaryOperator::Division, $1, $3); }
+FACTOR: TERM { $$ = $1; }
 
-EXPONENT: TERM POWER EXPONENT { $$ = new BinaryOperator(BinaryOperator::Exponentiation, $1, $3); }
-EXPONENT: TERM { $$ = $1; }
-
-TERM: '+' VALUE { $$ = $2; }
-TERM: '-' VALUE { $$ = new UnaryOperator(UnaryOperator::Negation, $2); }
+/*
+ * Handle exponentiation by making them TERMs, which makes the POWER operator bind very
+ * tightly.  Make unary negation a lower precendence so that -2^2 == -4, as 2^2 will be
+ * reduced to a TERM before the -TERM reduction is applied.
+ */
+TERM: VALUE POWER TERM { $$ = new BinaryOperator(BinaryOperator::Exponentiation, $1, $3); }
+TERM: '+' TERM { $$ = $2; }
+TERM: '-' TERM { $$ = new UnaryOperator(UnaryOperator::Negation, $2); }
 TERM: '(' EXP ')' { $$ = $2; }
-TERM: '-' '(' EXP ')' { $$ = new UnaryOperator(UnaryOperator::Negation, $3); }
 
 TERM: VALUE { $$ = $1; }
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic