]> www.ginac.de Git - ginac.git/blobdiff - ginac/input_lexer.ll
* zeta(n,x) is now zetaderiv(n,s)
[ginac.git] / ginac / input_lexer.ll
index 9795803e5ac31e02e77ca22a36fe016a25b7c4e6..d8bfd36282c8e4d011d95d87e4fab7e256d73af1 100644 (file)
@@ -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-2003 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 "fail.h"
 #include "numeric.h"
 #include "symbol.h"
+#include "lst.h"
+#include "idx.h"
 
-#ifndef NO_NAMESPACE_GINAC
 using namespace GiNaC;
 namespace GiNaC {
-#endif // ndef NO_NAMESPACE_GINAC
 
 #include "input_parser.h"
 
-#ifndef NO_NAMESPACE_GINAC
 } // namespace GiNaC
-#endif // ndef NO_NAMESPACE_GINAC
 
-// Table of all used symbols
+// Table of all used symbols/indices
 struct sym_def {
        sym_def() : predefined(false) {}
        sym_def(const ex &s, bool predef) : sym(s), predefined(predef) {}
@@ -89,7 +87,7 @@ AN    [0-9a-zA-Z_]
  */
 
 %%
-[ \t]+                 /* skip whitespace */
+[ \t\n]+               /* skip whitespace */
 
                        /* special values */
 Pi                     ginac_yylval = Pi; return T_LITERAL;
@@ -105,10 +103,6 @@ Digits                     ginac_yylval = (long)Digits; return T_DIGITS;
 "<="                   return T_LESSEQ;
 ">="                   return T_GREATEREQ;
 
-                       /* matrix delimiters */
-\[\[                   return T_MATRIX_BEGIN;
-\]\]                   return T_MATRIX_END;
-
                        /* numbers */
 {D}+                   |
 "#"{D}+"R"{AN}+                |
@@ -125,10 +119,13 @@ Digits                    ginac_yylval = (long)Digits; return T_DIGITS;
                                if (i == syms.end()) {
                                        syms[yytext] = sym_def(ginac_yylval = *(new symbol(yytext)), false);
                                } else
-                                       ginac_yylval = i->second.sym;
+                                       ginac_yylval = (*i).second.sym;
                                return T_SYMBOL;
                        }
 
+                       /* end of input */
+<<EOF>>                        return T_EOF;
+
                        /* everything else */
 .                      return *yytext;
 
@@ -164,9 +161,7 @@ int ginac_yywrap()
        return 1;
 }
 
-#ifndef NO_NAMESPACE_GINAC
 namespace GiNaC {
-#endif // ndef NO_NAMESPACE_GINAC
 
 // Set the input string
 void set_lexer_string(const std::string &s)
@@ -175,28 +170,38 @@ void set_lexer_string(const std::string &s)
        curr_pos = 0;
 }
 
-// Set the list of predefined symbols
+// Get name of symbol/index
+std::string get_symbol_name(const ex & s)
+{
+       if (is_a<symbol>(s))
+               return ex_to<symbol>(s).get_name();
+       else if (is_a<idx>(s) && is_a<symbol>(s.op(0)))
+               return ex_to<symbol>(s.op(0)).get_name();
+       else
+               throw (std::runtime_error("get_symbol_name(): unexpected expression type"));
+}
+
+// Set the list of predefined symbols/indices
 void set_lexer_symbols(ex l)
 {
        syms.clear();
-       if (!is_ex_exactly_of_type(l, lst))
+       if (!is_exactly_a<lst>(l))
                return;
-       for (int i=0; i<l.nops(); i++) {
-               if (is_ex_exactly_of_type(l.op(i), symbol))
-                       syms[ex_to_symbol(l.op(i)).getname()] = sym_def(l.op(i), true);
+       for (unsigned i=0; i<l.nops(); i++) {
+               const ex &o = l.op(i);
+               if (is_a<symbol>(o) || (is_a<idx>(o) && is_a<symbol>(o.op(0))))
+                       syms[get_symbol_name(o)] = sym_def(o, true);
        }
 }
 
-// Check whether symbol was predefined
+// Check whether symbol/index was predefined
 bool is_lexer_symbol_predefined(const ex &s)
 {
-       sym_tab::const_iterator i = syms.find(ex_to_symbol(s).getname());
+       sym_tab::const_iterator i = syms.find(get_symbol_name(s));
        if (i == syms.end())
                return false;
        else
-               return i->second.predefined;
+               return (*i).second.predefined;
 }
 
-#ifndef NO_NAMESPACE_GINAC
 } // namespace GiNaC
-#endif // ndef NO_NAMESPACE_GINAC