]> www.ginac.de Git - ginac.git/blobdiff - ginsh/ginsh_parser.yy
added decomp_rational()
[ginac.git] / ginsh / ginsh_parser.yy
index ce27972dbfc0f51385c9a31a3622d1d20ff03266..2e514778b27085a9d4db6f1bfbb30f86201f768a 100644 (file)
@@ -89,7 +89,7 @@ static void print_help_topics(void);
 /* 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_QUOTE T_QUOTE2 T_QUOTE3
-%token T_EQUAL T_NOTEQ T_LESSEQ T_GREATEREQ T_MATRIX_BEGIN T_MATRIX_END
+%token T_EQUAL T_NOTEQ T_LESSEQ T_GREATEREQ
 
 %token T_QUIT T_WARRANTY T_PRINT T_IPRINT T_TIME T_XYZZY T_INVENTORY T_LOOK T_SCORE
 
@@ -146,7 +146,7 @@ line        : ';'
                        ex e = $3;
                        if (!e.info(info_flags::integer))
                                throw (std::invalid_argument("argument to iprint() must be an integer"));
-                       long i = ex_to_numeric(e).to_long();
+                       long i = ex_to<numeric>(e).to_long();
                        cout << i << endl;
                        cout << "#o" << oct << i << endl;
                        cout << "#x" << hex << i << dec << endl;
@@ -155,7 +155,7 @@ line        : ';'
                        YYERROR;
                }
        }
-       | '?' T_SYMBOL          {print_help(ex_to_symbol($2).get_name());}
+       | '?' T_SYMBOL          {print_help(ex_to<symbol>($2).get_name());}
        | '?' T_TIME            {print_help("time");}
        | '?' '?'               {print_help_topics();}
        | T_QUIT                {YYACCEPT;}
@@ -207,8 +207,8 @@ exp : T_NUMBER              {$$ = $1;}
                        $$ = (i->second.p)(static_cast<const exprseq &>(*($3.bp)));
                }
        }
-       | T_DIGITS '=' T_NUMBER {$$ = $3; Digits = ex_to_numeric($3).to_int();}
-       | T_SYMBOL '=' exp      {$$ = $3; const_cast<symbol *>(&ex_to_symbol($1))->assign($3);}
+       | T_DIGITS '=' T_NUMBER {$$ = $3; Digits = ex_to<numeric>($3).to_int();}
+       | T_SYMBOL '=' exp      {$$ = $3; const_cast<symbol *>(&ex_to<symbol>($1))->assign($3);}
        | exp T_EQUAL exp       {$$ = $1 == $3;}
        | exp T_NOTEQ exp       {$$ = $1 != $3;}
        | exp '<' exp           {$$ = $1 < $3;}
@@ -224,8 +224,8 @@ exp : T_NUMBER              {$$ = $1;}
        | exp '^' exp           {$$ = power($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);}
@@ -240,8 +240,8 @@ list        : exp                   {$$ = lst($1);}
        | list ',' exp          {lst l(static_cast<lst &>(*($1.bp))); $$ = 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(static_cast<lst &>(*($1.bp))); $$ = l.append($4);}
        ;
 
 row    : exp                   {$$ = lst($1);}
@@ -280,6 +280,7 @@ static ex f_degree(const exprseq &e) {return e[0].degree(e[1]);}
 static ex f_denom(const exprseq &e) {return e[0].denom();}
 static ex f_eval1(const exprseq &e) {return e[0].eval();}
 static ex f_evalf1(const exprseq &e) {return e[0].evalf();}
+static ex f_evalm(const exprseq &e) {return e[0].evalm();}
 static ex f_expand(const exprseq &e) {return e[0].expand();}
 static ex f_gcd(const exprseq &e) {return gcd(e[0], e[1]);}
 static ex f_has(const exprseq &e) {return e[0].has(e[1]) ? ex(1) : ex(0);}
@@ -297,31 +298,37 @@ static ex f_sqrfree1(const exprseq &e) {return sqrfree(e[0]);}
 static ex f_subs2(const exprseq &e) {return e[0].subs(e[1]);}
 static ex f_tcoeff(const exprseq &e) {return e[0].tcoeff(e[1]);}
 
-#define CHECK_ARG(num, type, fcn) if (!is_ex_of_type(e[num], type)) throw(std::invalid_argument("argument " #num " to " #fcn "() must be a " #type))
+#define CHECK_ARG(num, type, fcn) if (!is_a<type>(e[num])) throw(std::invalid_argument("argument " #num " to " #fcn "() must be a " #type))
 
 static ex f_charpoly(const exprseq &e)
 {
        CHECK_ARG(0, matrix, charpoly);
        CHECK_ARG(1, symbol, charpoly);
-       return ex_to_matrix(e[0]).charpoly(ex_to_symbol(e[1]));
+       return ex_to<matrix>(e[0]).charpoly(ex_to<symbol>(e[1]));
 }
 
 static ex f_coeff(const exprseq &e)
 {
        CHECK_ARG(2, numeric, coeff);
-       return e[0].coeff(e[1], ex_to_numeric(e[2]).to_int());
+       return e[0].coeff(e[1], ex_to<numeric>(e[2]).to_int());
 }
 
 static ex f_content(const exprseq &e)
 {
        CHECK_ARG(1, symbol, content);
-       return e[0].content(ex_to_symbol(e[1]));
+       return e[0].content(ex_to<symbol>(e[1]));
+}
+
+static ex f_decomp_rational(const exprseq &e)
+{
+       CHECK_ARG(1, symbol, decomp_rational);
+       return decomp_rational(e[0], ex_to<symbol>(e[1]));
 }
 
 static ex f_determinant(const exprseq &e)
 {
        CHECK_ARG(0, matrix, determinant);
-       return ex_to_matrix(e[0]).determinant();
+       return ex_to<matrix>(e[0]).determinant();
 }
 
 static ex f_diag(const exprseq &e)
@@ -336,14 +343,14 @@ static ex f_diag(const exprseq &e)
 static ex f_diff2(const exprseq &e)
 {
        CHECK_ARG(1, symbol, diff);
-       return e[0].diff(ex_to_symbol(e[1]));
+       return e[0].diff(ex_to<symbol>(e[1]));
 }
 
 static ex f_diff3(const exprseq &e)
 {
        CHECK_ARG(1, symbol, diff);
        CHECK_ARG(2, numeric, diff);
-       return e[0].diff(ex_to_symbol(e[1]), ex_to_numeric(e[2]).to_int());
+       return e[0].diff(ex_to<symbol>(e[1]), ex_to<numeric>(e[2]).to_int());
 }
 
 static ex f_divide(const exprseq &e)
@@ -358,25 +365,25 @@ static ex f_divide(const exprseq &e)
 static ex f_eval2(const exprseq &e)
 {
        CHECK_ARG(1, numeric, eval);
-       return e[0].eval(ex_to_numeric(e[1]).to_int());
+       return e[0].eval(ex_to<numeric>(e[1]).to_int());
 }
 
 static ex f_evalf2(const exprseq &e)
 {
        CHECK_ARG(1, numeric, evalf);
-       return e[0].evalf(ex_to_numeric(e[1]).to_int());
+       return e[0].evalf(ex_to<numeric>(e[1]).to_int());
 }
 
 static ex f_inverse(const exprseq &e)
 {
        CHECK_ARG(0, matrix, inverse);
-       return ex_to_matrix(e[0]).inverse();
+       return ex_to<matrix>(e[0]).inverse();
 }
 
 static ex f_is(const exprseq &e)
 {
        CHECK_ARG(0, relational, is);
-       return (bool)ex_to_relational(e[0]) ? ex(1) : ex(0);
+       return (bool)ex_to<relational>(e[0]) ? ex(1) : ex(0);
 }
 
 static ex f_match(const exprseq &e)
@@ -391,13 +398,13 @@ static ex f_match(const exprseq &e)
 static ex f_normal2(const exprseq &e)
 {
        CHECK_ARG(1, numeric, normal);
-       return e[0].normal(ex_to_numeric(e[1]).to_int());
+       return e[0].normal(ex_to<numeric>(e[1]).to_int());
 }
 
 static ex f_op(const exprseq &e)
 {
        CHECK_ARG(1, numeric, op);
-       int n = ex_to_numeric(e[1]).to_int();
+       int n = ex_to<numeric>(e[1]).to_int();
        if (n < 0 || n >= (int)e[0].nops())
                throw(std::out_of_range("second argument to op() is out of range"));
        return e[0].op(n);
@@ -406,69 +413,69 @@ static ex f_op(const exprseq &e)
 static ex f_prem(const exprseq &e)
 {
        CHECK_ARG(2, symbol, prem);
-       return prem(e[0], e[1], ex_to_symbol(e[2]));
+       return prem(e[0], e[1], ex_to<symbol>(e[2]));
 }
 
 static ex f_primpart(const exprseq &e)
 {
        CHECK_ARG(1, symbol, primpart);
-       return e[0].primpart(ex_to_symbol(e[1]));
+       return e[0].primpart(ex_to<symbol>(e[1]));
 }
 
 static ex f_quo(const exprseq &e)
 {
        CHECK_ARG(2, symbol, quo);
-       return quo(e[0], e[1], ex_to_symbol(e[2]));
+       return quo(e[0], e[1], ex_to<symbol>(e[2]));
 }
 
 static ex f_rem(const exprseq &e)
 {
        CHECK_ARG(2, symbol, rem);
-       return rem(e[0], e[1], ex_to_symbol(e[2]));
+       return rem(e[0], e[1], ex_to<symbol>(e[2]));
 }
 
 static ex f_series(const exprseq &e)
 {
        CHECK_ARG(2, numeric, series);
-       return e[0].series(e[1], ex_to_numeric(e[2]).to_int());
+       return e[0].series(e[1], ex_to<numeric>(e[2]).to_int());
 }
 
 static ex f_sqrfree2(const exprseq &e)
 {
        CHECK_ARG(1, lst, sqrfree);
-       return sqrfree(e[0], ex_to_lst(e[1]));
+       return sqrfree(e[0], ex_to<lst>(e[1]));
 }
 
 static ex f_subs3(const exprseq &e)
 {
        CHECK_ARG(1, lst, subs);
        CHECK_ARG(2, lst, subs);
-       return e[0].subs(ex_to_lst(e[1]), ex_to_lst(e[2]));
+       return e[0].subs(ex_to<lst>(e[1]), ex_to<lst>(e[2]));
 }
 
 static ex f_trace(const exprseq &e)
 {
        CHECK_ARG(0, matrix, trace);
-       return ex_to_matrix(e[0]).trace();
+       return ex_to<matrix>(e[0]).trace();
 }
 
 static ex f_transpose(const exprseq &e)
 {
        CHECK_ARG(0, matrix, transpose);
-       return ex_to_matrix(e[0]).transpose();
+       return ex_to<matrix>(e[0]).transpose();
 }
 
 static ex f_unassign(const exprseq &e)
 {
        CHECK_ARG(0, symbol, unassign);
-       (const_cast<symbol *>(&ex_to_symbol(e[0])))->unassign();
+       (const_cast<symbol *>(&ex_to<symbol>(e[0])))->unassign();
        return e[0];
 }
 
 static ex f_unit(const exprseq &e)
 {
        CHECK_ARG(1, symbol, unit);
-       return e[0].unit(ex_to_symbol(e[1]));
+       return e[0].unit(ex_to<symbol>(e[1]));
 }
 
 static ex f_dummy(const exprseq &e)
@@ -488,6 +495,7 @@ static const fcn_init builtin_fcns[] = {
        {"collect", fcn_desc(f_collect, 2)},
        {"collect_distributed", fcn_desc(f_collect_distributed, 2)},
        {"content", fcn_desc(f_content, 2)},
+       {"decomp_rational", fcn_desc(f_decomp_rational, 2)},
        {"degree", fcn_desc(f_degree, 2)},
        {"denom", fcn_desc(f_denom, 1)},
        {"determinant", fcn_desc(f_determinant, 1)},
@@ -499,6 +507,7 @@ static const fcn_init builtin_fcns[] = {
        {"eval", fcn_desc(f_eval2, 2)},
        {"evalf", fcn_desc(f_evalf1, 1)},
        {"evalf", fcn_desc(f_evalf2, 2)},
+       {"evalm", fcn_desc(f_evalm, 1)},
        {"expand", fcn_desc(f_expand, 1)},
        {"gcd", fcn_desc(f_gcd, 2)},
        {"has", fcn_desc(f_has, 2)},
@@ -573,7 +582,7 @@ void GiNaC::ginsh_get_ginac_functions(void)
 
 static fcn_tab::const_iterator find_function(const ex &sym, int req_params)
 {
-       const string &name = ex_to_symbol(sym).get_name();
+       const string &name = ex_to<symbol>(sym).get_name();
        typedef fcn_tab::const_iterator I;
        pair<I, I> b = fcns.equal_range(name);
        if (b.first == b.second)