- int t = yylex();
- int tprev = 0;
- bool panic = false;
- static int plevel = -1;
- static int size = LM_ST_TEXT;
- MathedTextCodes varcode = LM_TC_VAR;
- MathedInset * binset = 0;
- static MathMacroTemplate * macro = 0;
-
- int brace = 0;
- int acc_brace = 0;
- int acc_braces[8];
- MathParInset * mt = (mtx) ? *mtx : 0;//(MathParInset*)0;
- MathedRowSt * crow = (mt) ? mt->getRowSt() : 0;
-
- ++plevel;
- MathedIter data(&array);
- while (t) {
- if ((flags & FLAG_BRACE) && t != LM_TK_OPEN) {
- if ((flags & FLAG_BRACK_ARG) && t == '[') {
- }
- else {
- mathPrintError("Expected {. Maybe you forgot to enclose an argument in {}");
- panic = true;
- break;
- }
- }
- MathedInsetTypes fractype = LM_OT_FRAC;
- switch (t) {
- case LM_TK_ALPHA:
- {
- if (accent) {
- data.insertInset(doAccent(yylval.i, varcode), LM_TC_INSET);
- } else
- data.insert(yylval.i, varcode); //LM_TC_VAR);
- break;
- }
- case LM_TK_ARGUMENT:
- {
- if (macro) {
- data.insertInset(macro->getMacroPar(yylval.i-1), LM_TC_INSET);
- }
- break;
- }
- case LM_TK_NEWCOMMAND:
- {
- int na = 0;
-
- LexGetArg('{');
- string const name(&yytext[1]);
-
- // ugly trick to be removed soon (lyx3)
- char const c = yyis->peek();
- if (c == '[') {
- LexGetArg('[');
- na = lyx::atoi(yytext.data());
- }
- macro = new MathMacroTemplate(name, na);
- flags = FLAG_BRACE|FLAG_BRACE_LAST;
- *mtx = macro;
- macro->setData(array);
- break;
- }
- case LM_TK_SPECIAL:
- {
- data.insert(yylval.i, LM_TC_SPECIAL);
- break;
- }
- case LM_TK_STR:
- {
- if (accent) {
- data.insertInset(doAccent(yylval.i, LM_TC_CONST), LM_TC_INSET);
- } else
- data.insert(yylval.i, LM_TC_CONST);
- break;
- }
- case LM_TK_OPEN:
- {
- ++brace;
- if (accent && tprev == LM_TK_ACCENT) {
- acc_braces[acc_brace++] = brace;
- break;
- }
- if (flags & FLAG_BRACE_OPT) {
- flags &= ~FLAG_BRACE_OPT;
- flags |= FLAG_BRACE;
- }
-
- if (flags & FLAG_BRACE)
- flags &= ~FLAG_BRACE;
- else {
- data.insert('{', LM_TC_TEX);
- }
- break;
- }
- case LM_TK_CLOSE:
- {
- --brace;
- if (brace < 0) {
- mathPrintError("Unmatching braces");
- panic = true;
- break;
- }
- if (acc_brace && brace == acc_braces[acc_brace-1]-1) {
- --acc_brace;
- break;
- }
- if (flags & FLAG_BRACE_FONT) {
- varcode = LM_TC_VAR;
- yy_mtextmode = false;
- flags &= ~FLAG_BRACE_FONT;
- break;
- }
- if (brace == 0 && (flags & FLAG_BRACE_LAST)) {
- --plevel;
- return;
- } else {
- data.insert('}', LM_TC_TEX);
- }
- break;
- }
-
- case '[':
- {
- if (flags & FLAG_BRACK_ARG) {
- flags &= ~FLAG_BRACK_ARG;
- char const rg = LexGetArg('[');
- if (rg != ']') {
- mathPrintError("Expected ']'");
- panic = true;
- break;
- }
-// if (arg) strcpy(arg, yytext);
- } else
- data.insert('[', LM_TC_CONST);
- break;
- }
- case ']':
- {
- if (flags & FLAG_BRACK_END) {
- --plevel;
- return;
- } else
- data.insert(']', LM_TC_CONST);
- break;
- }
-
- case '^':
- {
- MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
- MathedArray ar;
- mathed_parse(ar, FLAG_BRACE_OPT|FLAG_BRACE_LAST);
- p->setData(ar);
-// lyxerr << "UP[" << p->GetStyle() << "]" << endl;
- data.insertInset(p, LM_TC_UP);
- break;
- }
- case '_':
- {
- MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
- MathedArray ar;
- mathed_parse(ar, FLAG_BRACE_OPT|FLAG_BRACE_LAST);
- p->setData(ar);
- data.insertInset(p, LM_TC_DOWN);
- break;
- }
-
- case LM_TK_LIMIT:
- {
- if (binset) {
- binset->SetLimits(bool(yylval.l->id));
- binset = 0;
- }
- break;
- }
-
- case '&': // Tab
- {
- if ((flags & FLAG_END) && mt && data.getCol()<mt->GetColumns() - 1) {
- data.setNumCols(mt->GetColumns());
- data.insert('T', LM_TC_TAB);
- } else
- mathPrintError("Unexpected tab");
- // debug info. [made that conditional -JMarc]
- if (lyxerr.debugging(Debug::MATHED))
- lyxerr << data.getCol() << " " << mt->GetColumns() << endl;
- break;
- }
- case LM_TK_NEWLINE:
- {
- if (mt && (flags & FLAG_END)) {
- if (mt->Permit(LMPF_ALLOW_CR)) {
- if (crow) {
- crow->setNext(new MathedRowSt(mt->GetColumns() + 1)); // this leaks
- crow = crow->getNext();
- }
- data.insert('K', LM_TC_CR);
- } else
- mathPrintError("Unexpected newline");
- }
- break;
- }
- case LM_TK_BIGSYM:
- {
- binset = new MathBigopInset(yylval.l->name, yylval.l->id);
- data.insertInset(binset, LM_TC_INSET);
- break;
- }
- case LM_TK_SYM:
- {
- if (yylval.l->id < 256) {
- MathedTextCodes tc = MathIsBOPS(yylval.l->id) ? LM_TC_BOPS: LM_TC_SYMB;
- if (accent) {
- data.insertInset(doAccent(yylval.l->id, tc), LM_TC_INSET);
- } else
- data.insert(yylval.l->id, tc);
- } else {
- MathFuncInset * bg = new MathFuncInset(yylval.l->name);
- if (accent) {
- data.insertInset(doAccent(bg), LM_TC_INSET);
- } else {
-#warning This is suspisious! (Lgb)
- // it should not take a bool as second arg (Lgb)
- data.insertInset(bg, true);
- }
-
- }
- break;
- }
- case LM_TK_BOP:
- {
- if (accent) {
- data.insertInset(doAccent(yylval.i, LM_TC_BOP), LM_TC_INSET);
- } else
- data.insert(yylval.i, LM_TC_BOP);
- break;
- }
- case LM_TK_STY:
- {
- if (mt) {
- mt->UserSetSize(yylval.l->id);
- }
- break;
- }
- case LM_TK_SPACE:
- {
- if (yylval.i >= 0) {
- MathSpaceInset * sp = new MathSpaceInset(yylval.i);
- data.insertInset(sp, LM_TC_INSET);
- }
- break;
- }
- case LM_TK_DOTS:
- {
- MathDotsInset * p = new MathDotsInset(yylval.l->name, yylval.l->id);
- data.insertInset(p, LM_TC_INSET);
- break;
- }
- case LM_TK_STACK:
- fractype = LM_OT_STACKREL;
- case LM_TK_FRAC:
- {
- MathFracInset * fc = new MathFracInset(fractype);
- MathedArray num;
- mathed_parse(num, FLAG_BRACE|FLAG_BRACE_LAST);
- MathedArray den;
- mathed_parse(den, FLAG_BRACE|FLAG_BRACE_LAST);
- fc->SetData(num, den);
- data.insertInset(fc, LM_TC_ACTIVE_INSET);
- break;
- }
- case LM_TK_SQRT:
- {
- MathParInset * rt;
-
- char c; yyis->get(c);
-
- if (c == '[') {
- rt = new MathRootInset(size);
- rt->setArgumentIdx(0);
- MathedArray ar;
- mathed_parse(ar, FLAG_BRACK_END, &rt);
- rt->setData(ar);
- rt->setArgumentIdx(1);
- } else {
- yyis->putback(c);
- rt = new MathSqrtInset(size);
- }
- MathedArray ar;
- mathed_parse(ar, FLAG_BRACE|FLAG_BRACE_LAST, &rt);
- rt->setData(ar);
- data.insertInset(rt, LM_TC_ACTIVE_INSET);
- break;
- }
-
- case LM_TK_LEFT:
- {
- int lfd = yylex();
- if (lfd == LM_TK_SYM || lfd == LM_TK_STR || lfd == LM_TK_BOP|| lfd == LM_TK_SPECIAL)
- lfd = (lfd == LM_TK_SYM) ? yylval.l->id: yylval.i;
-// lyxerr << "L[" << lfd << " " << lfd << "]";
- MathedArray ar;
- mathed_parse(ar, FLAG_RIGHT);
- int rgd = yylex();
-// lyxerr << "R[" << rgd << "]";
- if (rgd == LM_TK_SYM || rgd == LM_TK_STR || rgd == LM_TK_BOP || rgd == LM_TK_SPECIAL)
- rgd = (rgd == LM_TK_SYM) ? yylval.l->id: yylval.i;
- MathDelimInset * dl = new MathDelimInset(lfd, rgd);
- dl->setData(ar);
- data.insertInset(dl, LM_TC_ACTIVE_INSET);
-// lyxerr << "RL[" << lfd << " " << rgd << "]";
- break;
- }
- case LM_TK_RIGHT:
- {
- if (flags & FLAG_RIGHT) {
- --plevel;
- return;
- } else {
- mathPrintError("Unmatched right delimiter");
-// panic = true;
- }
- break;
- }
-
- case LM_TK_FONT:
- {
- varcode = static_cast<MathedTextCodes>(yylval.l->id);
- yy_mtextmode = bool(varcode == LM_TC_TEXTRM);
- flags |= (FLAG_BRACE|FLAG_BRACE_FONT);
- break;
- }
- case LM_TK_WIDE:
- {
- MathDecorationInset * sq = new MathDecorationInset(yylval.l->id,
- size);
- MathedArray ar;
- mathed_parse(ar, FLAG_BRACE|FLAG_BRACE_LAST);
- sq->setData(ar);
- data.insertInset(sq, LM_TC_ACTIVE_INSET);
- break;
- }
-
- case LM_TK_ACCENT:
- setAccent(yylval.l->id);
- break;
-
- case LM_TK_NONUM:
- {
- if (crow)
- crow->setNumbered(false);
- break;
- }
-
- case LM_TK_PMOD:
- case LM_TK_FUNC:
- {
-#warning This must leak. (Lgb)
- // if (accent) this must leak... (Lgb)
- MathedInset * bg = new MathFuncInset(yylval.l->name);
- if (accent) {
- data.insert(t, LM_TC_CONST);
- } else
- data.insertInset(bg, LM_TC_INSET);
- break;
- }
- case LM_TK_FUNCLIM:
- {
- data.insertInset(new MathFuncInset(yylval.l->name, LM_OT_FUNCLIM),
- LM_TC_INSET);
- break;
- }
- case LM_TK_UNDEF:
- {
-
- MathMacro * p =
- MathMacroTable::mathMTable.getMacro(yylval.s);
- if (p) {
- if (accent)
- data.insertInset(doAccent(p), p->getTCode());
- else
- data.insertInset(p, p->getTCode());
- for (int i = 0; p->setArgumentIdx(i); ++i) {
- MathedArray ar;
- mathed_parse(ar, FLAG_BRACE|FLAG_BRACE_LAST);
- p->setData(ar);