]> www.ginac.de Git - ginac.git/blobdiff - ginsh/ginsh_lexer.ll
[build] Move library version info into the version.h file.
[ginac.git] / ginsh / ginsh_lexer.ll
index 20cb329776d26d7dd92033f4a9bcaad12a8305bb..7ba013efa0e017897338070658b3649895987844 100644 (file)
@@ -4,7 +4,7 @@
  *  This file must be processed with flex. */
 
 /*
- *  GiNaC Copyright (C) 1999-2001 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
  */
 
 
  *  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);
 %}
@@ -72,11 +79,15 @@ quit|exit           return T_QUIT;
 warranty               return T_WARRANTY;
 print                  return T_PRINT;
 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,13 +96,9 @@ 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}+                   |
@@ -107,12 +114,23 @@ score                     return T_SCORE;
 {A}{AN}*               {
                                sym_tab::const_iterator i = syms.find(yytext);
                                if (i == syms.end()) {
-                                       yylval = syms[yytext] = *(new symbol(yytext));
+                                       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;
 
@@ -131,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;