* This file must be processed with flex. */
/*
- * GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2004 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) {}
ex sym;
bool predefined; // true = user supplied symbol, false = lexer generated symbol
};
-typedef map<string, sym_def> sym_tab;
+typedef std::map<std::string, sym_def> sym_tab;
static sym_tab syms;
// lex input function
*/
%%
-[ \t]+ /* skip whitespace */
+[ \t\n]+ /* skip whitespace */
/* special values */
Pi ginac_yylval = Pi; return T_LITERAL;
"<=" return T_LESSEQ;
">=" return T_GREATEREQ;
- /* matrix delimiters */
-\[\[ return T_MATRIX_BEGIN;
-\]\] return T_MATRIX_END;
-
/* numbers */
{D}+ |
+"#"{D}+"R"{AN}+ |
+"#b"([01])+ |
+"#o"[0-7]+ |
+"#x"[0-9a-fA-F]+ |
{D}+"."{D}*({E})? |
{D}*"."{D}+({E})? |
{D}+{E} ginac_yylval = numeric(yytext); return T_NUMBER;
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;
*/
// The string from which we will read
-static string lexer_string;
+static std::string lexer_string;
// The current position within the string
static int curr_pos = 0;
return 1;
}
-#ifndef NO_NAMESPACE_GINAC
namespace GiNaC {
-#endif // ndef NO_NAMESPACE_GINAC
// Set the input string
-void set_lexer_string(const string &s)
+void set_lexer_string(const std::string &s)
{
lexer_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