}
-string Parser::getArg(char lf, char rg)
+string Parser::getArg(char left, char right)
{
skipSpaces();
string result;
char c = getChar();
- if (c != lf)
+ if (c != left)
putback();
else
- while ((c = getChar()) != rg && good())
+ while ((c = getChar()) != right && good())
result += c;
return result;
void Parser::dump() const
{
lyxerr << "\nTokens: ";
- for (unsigned i = 0; i < tokens_.size(); ++i)
+ for (unsigned i = 0; i < tokens_.size(); ++i) {
+ if (i == pos_)
+ lyxerr << " <#> ";
lyxerr << tokens_[i];
+ }
lyxerr << "\n";
}
+
bool Parser::parse_macro(string & name)
{
+ int nargs = 0;
name = "{error}";
skipSpaces();
- if (getToken().cs() != "newcommand") {
- lyxerr << "\\newcommand expected\n";
- return false;
- }
+ if (nextToken().cs() == "def") {
- if (getToken().cat() != catBegin) {
- lyxerr << "'{' in \\newcommand expected (1)\n";
- return false;
- }
+ getToken();
+ name = getToken().cs();
+
+ string pars;
+ while (good() && nextToken().cat() != catBegin)
+ pars += getToken().cs();
+
+ if (!good()) {
+ lyxerr << "bad stream in parse_macro\n";
+ dump();
+ return false;
+ }
+
+ //lyxerr << "read \\def parameter list '" << pars << "'\n";
+ if (!pars.empty()) {
+ lyxerr << "can't handle non-empty parameter lists\n";
+ dump();
+ return false;
+ }
- name = getToken().cs();
+ } else if (nextToken().cs() == "newcommand") {
- if (getToken().cat() != catEnd) {
- lyxerr << "'}' expected\n";
+ getToken();
+
+ if (getToken().cat() != catBegin) {
+ lyxerr << "'{' in \\newcommand expected (1) \n";
+ dump();
+ return false;
+ }
+
+ name = getToken().cs();
+
+ if (getToken().cat() != catEnd) {
+ lyxerr << "'}' expected\n";
+ return false;
+ }
+
+ string arg = getArg('[', ']');
+ if (!arg.empty())
+ nargs = atoi(arg.c_str());
+
+ } else {
+ lyxerr << "\\newcommand or \\def expected\n";
return false;
}
- string arg = getArg('[', ']');
- int narg = arg.empty() ? 0 : atoi(arg.c_str());
if (getToken().cat() != catBegin) {
- lyxerr << "'{' in \\newcommand expected (2)\n";
+ lyxerr << "'{' in macro definition expected (2)\n";
return false;
}
- MathArray ar;
- parse_into(ar, FLAG_BRACE_LAST);
+ MathArray ar1;
+ parse_into(ar1, FLAG_BRACE_LAST);
// we cannot handle recursive stuff at all
MathArray test;
test.push_back(createMathInset(name));
- if (ar.contains(test)) {
+ if (ar1.contains(test)) {
lyxerr << "we cannot handle recursive macros at all.\n";
return false;
}
- MathMacroTable::create(name, narg, ar);
+ MathArray ar2;
+ parse_into(ar2, FLAG_ITEM);
+
+ MathMacroTable::create(name, nargs, ar1, ar2);
return true;
}
else if (t.cat() == catEnd) {
if (flags & FLAG_BRACE_LAST)
return;
+ dump();
lyxerr << "found '}' unexpectedly, array: '" << array << "'\n";
//lyxerr << "found '}' unexpectedly\n";
lyx::Assert(0);
array.push_back(MathAtom(new MathKernInset(s)));
}
+/*
+ else if (t.cs() == "lyxkern") {
+ MathAtom p = createMathInset(t.cs());
+ parse_into(p->cell(0), flags, code);
+ array.push_back(p);
+ }
+*/
+
else if (t.cs() == "label") {
curr_label_ = getArg('{', '}');
}