* This file must be processed with yacc/bison. */
/*
- * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2002 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
#include "input_lexer.h"
#include "ex.h"
#include "relational.h"
+#include "operators.h"
#include "symbol.h"
#include "lst.h"
#include "power.h"
#include "matrix.h"
#include "inifcns.h"
-#ifndef NO_NAMESPACE_GINAC
namespace GiNaC {
-#endif // ndef NO_NAMESPACE_GINAC
#define YYERROR_VERBOSE 1
/* 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 T_MATRIX_BEGIN T_MATRIX_END
+%token T_NUMBER T_SYMBOL T_LITERAL T_DIGITS T_EQUAL T_NOTEQ T_LESSEQ T_GREATEREQ
/* Operator precedence and associativity */
%right '='
if (is_lexer_symbol_predefined($1))
$$ = $1.eval();
else
- throw (std::runtime_error("unknown symbol '" + ex_to_symbol($1).getname() + "'"));
+ throw (std::runtime_error("unknown symbol '" + ex_to<symbol>($1).get_name() + "'"));
}
| T_LITERAL {$$ = $1;}
| T_DIGITS {$$ = $1;}
| T_SYMBOL '(' exprseq ')' {
- unsigned i = function::find_function(ex_to_symbol($1).getname(), $3.nops());
- $$ = function(i, static_cast<const exprseq &>(*($3.bp))).eval(1);
+ std::string n = ex_to<symbol>($1).get_name();
+ if (n == "sqrt") {
+ if ($3.nops() != 1)
+ throw (std::runtime_error("too many arguments to sqrt()"));
+ $$ = sqrt($3.op(0));
+ } else {
+ unsigned i = function::find_function(n, $3.nops());
+ $$ = function(i, ex_to<exprseq>($3)).eval(1);
+ }
}
| exp T_EQUAL exp {$$ = $1 == $3;}
| exp T_NOTEQ exp {$$ = $1 != $3;}
| exp '^' exp {$$ = pow($1, $3);}
| exp '!' {$$ = factorial($1);}
| '(' exp ')' {$$ = $2;}
- | '[' list_or_empty ']' {$$ = $2;}
- | T_MATRIX_BEGIN matrix T_MATRIX_END {$$ = lst_to_matrix(ex_to_lst($2));}
+ | '{' list_or_empty '}' {$$ = $2;}
+ | '[' matrix ']' {$$ = lst_to_matrix(ex_to<lst>($2));}
;
exprseq : exp {$$ = exprseq($1);}
- | exprseq ',' exp {exprseq es(static_cast<exprseq &>(*($1.bp))); $$ = es.append($3);}
+ | exprseq ',' exp {exprseq es(ex_to<exprseq>($1)); $$ = es.append($3);}
;
list_or_empty: /* empty */ {$$ = *new lst;}
;
list : exp {$$ = lst($1);}
- | list ',' exp {lst l(static_cast<lst &>(*($1.bp))); $$ = l.append($3);}
+ | list ',' exp {lst l(ex_to<lst>($1)); $$ = l.append($3);}
;
-matrix : T_MATRIX_BEGIN row T_MATRIX_END {$$ = lst($2);}
- | matrix ',' T_MATRIX_BEGIN row T_MATRIX_END {lst l(static_cast<lst &>(*($1.bp))); $$ = l.append($4);}
+matrix : '[' row ']' {$$ = lst($2);}
+ | matrix ',' '[' row ']' {lst l(ex_to<lst>($1)); $$ = l.append($4);}
;
row : exp {$$ = lst($1);}
- | row ',' exp {lst l(static_cast<lst &>(*($1.bp))); $$ = l.append($3);}
+ | row ',' exp {lst l(ex_to<lst>($1)); $$ = l.append($3);}
;
return parser_error;
}
-#ifndef NO_NAMESPACE_GINAC
} // namespace GiNaC
-using GiNaC::parser_error;
-#endif // ndef NO_NAMESPACE_GINAC
-
// Error print routine (store error string in parser_error)
int ginac_yyerror(char *s)
{
- parser_error = std::string(s) + " at " + std::string(ginac_yytext);
+ GiNaC::parser_error = std::string(s) + " at " + std::string(ginac_yytext);
return 0;
}