X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Finput_parser.yy;h=1685c796fec666086f8d44cf8687c91092cd43de;hp=e714c9bf97d0f8f04eedcf31de911fb1fc1b72e6;hb=bfb395b4e24e659fc46abc2d2ad4305168d1c6f2;hpb=ed19b17bdd0513282c75a2684c77aec3f4fa7088 diff --git a/ginac/input_parser.yy b/ginac/input_parser.yy index e714c9bf..1685c796 100644 --- a/ginac/input_parser.yy +++ b/ginac/input_parser.yy @@ -4,7 +4,7 @@ * This file must be processed with yacc/bison. */ /* - * GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2001 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 @@ -45,14 +45,11 @@ namespace GiNaC { #define YYERROR_VERBOSE 1 -#define yylex ginac_yylex -#define yyerror ginac_yyerror - // Parsed output expression ex parsed_ex; // Last error message returned by parser -static string parser_error; +static std::string parser_error; %} /* Tokens (T_LITERAL means a literal value returned by the parser, but not @@ -81,8 +78,8 @@ input : exp { try { parsed_ex = $1; YYACCEPT; - } catch (exception &e) { - parser_error = e.what(); + } catch (std::exception &err) { + parser_error = err.what(); YYERROR; } } @@ -90,11 +87,16 @@ input : exp { ; exp : T_NUMBER {$$ = $1;} - | T_SYMBOL {$$ = $1.eval();} + | T_SYMBOL { + if (is_lexer_symbol_predefined($1)) + $$ = $1.eval(); + else + 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()); + unsigned i = function::find_function(ex_to_symbol($1).get_name(), $3.nops()); $$ = function(i, static_cast(*($3.bp))).eval(1); } | exp T_EQUAL exp {$$ = $1 == $3;} @@ -107,14 +109,13 @@ exp : T_NUMBER {$$ = $1;} | exp '-' exp {$$ = $1 - $3;} | exp '*' exp {$$ = $1 * $3;} | exp '/' exp {$$ = $1 / $3;} - | exp '%' exp {$$ = $1 % $3;} | '-' exp %prec NEG {$$ = -$2;} | '+' exp %prec NEG {$$ = $2;} | exp '^' exp {$$ = pow($1, $3);} | exp '!' {$$ = factorial($1);} | '(' exp ')' {$$ = $2;} | '[' list_or_empty ']' {$$ = $2;} - | T_MATRIX_BEGIN matrix T_MATRIX_END {$$ = lst_to_matrix($2);} + | T_MATRIX_BEGIN matrix T_MATRIX_END {$$ = lst_to_matrix(ex_to_lst($2));} ; exprseq : exp {$$ = exprseq($1);} @@ -144,7 +145,7 @@ row : exp {$$ = lst($1);} %% // Get last error encountered by parser -string get_parser_error(void) +std::string get_parser_error(void) { return parser_error; } @@ -158,5 +159,6 @@ using GiNaC::parser_error; // Error print routine (store error string in parser_error) int ginac_yyerror(char *s) { - parser_error = string(s) + " at " + string(ginac_yytext); + parser_error = std::string(s) + " at " + std::string(ginac_yytext); + return 0; }