* This file must be processed with yacc/bison. */
/*
- * GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2007 Johannes Gutenberg University Mainz, Germany
*
* 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
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
%{
#include <stdexcept>
-#include "input_lexer.h"
#include "ex.h"
+#include "input_lexer.h"
#include "relational.h"
+#include "operators.h"
#include "symbol.h"
#include "lst.h"
#include "power.h"
/* Tokens (T_LITERAL means a literal value returned by the parser, but not
of class numeric or symbol (e.g. a constant or the FAIL object)) */
-%token T_NUMBER T_SYMBOL T_LITERAL T_DIGITS T_EQUAL T_NOTEQ T_LESSEQ T_GREATEREQ
+%token T_EOF T_NUMBER T_SYMBOL T_LITERAL T_DIGITS T_EQUAL T_NOTEQ T_LESSEQ T_GREATEREQ
/* Operator precedence and associativity */
%right '='
*/
%%
-input : exp {
+input : exp T_EOF {
try {
parsed_ex = $1;
YYACCEPT;
YYERROR;
}
}
- | error {yyclearin; yyerrok;}
;
exp : T_NUMBER {$$ = $1;}
if ($3.nops() != 1)
throw (std::runtime_error("too many arguments to sqrt()"));
$$ = sqrt($3.op(0));
+ } else if (n == "pow" || n == "power") {
+ if ($3.nops() != 2)
+ throw std::invalid_argument("wrong number of arguments to pow()");
+ $$ = power($3.op(0), $3.op(0));
} else {
unsigned i = function::find_function(n, $3.nops());
$$ = function(i, ex_to<exprseq>($3)).eval(1);