X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginsh%2Fginsh_lexer.ll;h=7ba013efa0e017897338070658b3649895987844;hp=ed093299d85067027e759cb360aa7405d99a872a;hb=e0f0681b814fecff5523d21b4368ebbeecc330eb;hpb=956a3ad3779759028bfd742456ed9eafc3e85063 diff --git a/ginsh/ginsh_lexer.ll b/ginsh/ginsh_lexer.ll index ed093299..7ba013ef 100644 --- a/ginsh/ginsh_lexer.ll +++ b/ginsh/ginsh_lexer.ll @@ -4,7 +4,7 @@ * This file must be processed with flex. */ /* - * GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2011 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 @@ -18,7 +18,7 @@ * * 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 */ @@ -26,8 +26,12 @@ * Definitions */ +%pointer + %{ +#ifdef HAVE_CONFIG_H #include "config.h" +#endif #include "ginsh.h" #include "ginsh_parser.h" @@ -37,6 +41,9 @@ // Table of all used symbols sym_tab syms; +// Type of symbols to generate (real or complex) +unsigned symboltype = domain::complex; + // lex input function static int ginsh_input(char *buf, int max_size); %} @@ -55,12 +62,13 @@ AN [0-9a-zA-Z_] %% [ \t\n]+ /* skip whitespace */ \\$ /* skip line continuations */ -"#".* /* skip comments starting with "#" */ +"//".* /* skip comments starting with "//" */ +^"#".* /* skip lines starting with "#" */ ^"!".* system(yytext + 1); /* execute shell command */ /* special values */ Pi yylval = Pi; return T_LITERAL; -gamma yylval = gamma; return T_LITERAL; +Euler yylval = Euler; return T_LITERAL; Catalan yylval = Catalan; return T_LITERAL; FAIL yylval = *new fail(); return T_LITERAL; I yylval = I; return T_NUMBER; @@ -70,13 +78,16 @@ Digits yylval = (long)Digits; return T_DIGITS; quit|exit return T_QUIT; warranty return T_WARRANTY; print return T_PRINT; -read return T_READ; -write return T_WRITE; +iprint return T_IPRINT; +print_latex return T_PRINTLATEX; +print_csrc return T_PRINTCSRC; time return T_TIME; xyzzy return T_XYZZY; inventory return T_INVENTORY; look return T_LOOK; score return T_SCORE; +complex_symbols return T_COMPLEX_SYMBOLS; +real_symbols return T_REAL_SYMBOLS; /* comparison */ "==" return T_EQUAL; @@ -85,28 +96,41 @@ score return T_SCORE; ">=" return T_GREATEREQ; /* last 1..3 expressions */ -\" return T_QUOTE; -\"\" return T_QUOTE2; -\"\"\" return T_QUOTE3; - - /* matrix delimiters */ -\[\[ return T_MATRIX_BEGIN; -\]\] return T_MATRIX_END; +\% return T_QUOTE; +\%\% return T_QUOTE2; +\%\%\% return T_QUOTE3; /* numbers */ {D}+ | +"#"{D}+"R"{AN}+ | +"#b"([01])+ | +"#o"[0-7]+ | +"#x"[0-9a-fA-F]+ | {D}+"."{D}*({E})? | {D}*"."{D}+({E})? | {D}+{E} yylval = numeric(yytext); return T_NUMBER; /* symbols */ {A}{AN}* { - if (syms.find(yytext) == syms.end()) - syms[yytext] = *(new symbol(yytext)); - yylval = syms[yytext]; + sym_tab::const_iterator i = syms.find(yytext); + if (i == syms.end()) { + if (symboltype == domain::complex) { + symbol tmp(yytext); + syms[yytext] = tmp; + yylval = tmp; + } else { + realsymbol tmp(yytext); + syms[yytext] = tmp; + yylval = tmp; + } + } else + yylval = i->second; return T_SYMBOL; } + /* wildcards */ +\${D}+ yylval = wild(atoi(yytext + 1)); return T_LITERAL; + /* everything else */ . return *yytext; @@ -125,7 +149,11 @@ static char *line_ptr; static int ginsh_input(char *buf, int max_size) { int result; +#if defined(YY_CURRENT_BUFFER) + if (YY_CURRENT_BUFFER->yy_is_interactive) { +#else if (yy_current_buffer->yy_is_interactive) { +#endif #ifdef HAVE_LIBREADLINE // Do we need to read a new line? int actual;