]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_parser.C
remove cruft
[lyx.git] / src / mathed / math_parser.C
index c57e2becfe937ecffed6d9c5252780165bd3cd0f..ec10cc7ad0ee298f887a9a1c83ca69815fa0aff1 100644 (file)
 #include <cctype>
 
 #ifdef __GNUG__
-#pragma implementation "math_parser.h"
+#pragma implementation
 #endif
 
 #include "math_parser.h"
+#include "array.h"
+#include "math_rowst.h"
 #include "math_iter.h"
 #include "math_inset.h"
 #include "math_macro.h"
+#include "math_macrotable.h"
+#include "math_macrotemplate.h"
 #include "math_root.h"
+#include "math_matrixinset.h"
+#include "math_accentinset.h"
+#include "math_bigopinset.h"
+#include "math_funcinset.h"
+#include "math_spaceinset.h"
+#include "math_dotsinset.h"
+#include "math_fracinset.h"
+#include "math_deliminset.h"
+#include "math_decorationinset.h"
 #include "debug.h"
 #include "support/lyxlib.h"
+#include "mathed/support.h"
 
 using std::istream;
 using std::endl;
 
-#if 0
-using std::isalpha;
-using std::isdigit;
-using std::isspace;
-#endif
+
+extern MathMatrixInset * create_multiline(short int type, int cols);
+
 
 enum {
        FLAG_BRACE      = 1,    //  A { needed
@@ -57,26 +69,29 @@ YYSTYPE yylval;
 
 
 static
-short mathed_env = LM_EN_INTEXT;
+MathedInsetTypes mathed_env = LM_OT_MIN;
 
 string mathed_label;
 
 
-char const * latex_mathenv[] = { 
+int const latex_mathenv_num = 12;
+char const * latex_mathenv[latex_mathenv_num] = { 
    "math", 
    "displaymath", 
    "equation", 
    "eqnarray*",
    "eqnarray",
+   "align*",
+   "align",
+   "alignat*",
+   "alignat",
+   "multline*",
+   "multline",
    "array"
 };
 
 
 
-char const * latex_mathspace[] = {
-   "!", ",", ":", ";", "quad", "qquad"
-};
-
 
 char const * latex_special_chars = "#$%&_{}";
            
@@ -252,19 +267,19 @@ int yylex(void)
                 return LM_TK_NEWLINE;
         }
         if (c == '(') {
-                yylval.i = LM_EN_INTEXT;
+                yylval.i = LM_OT_MIN;
                 return LM_TK_BEGIN;
         }
         if (c == ')') {
-                yylval.i = LM_EN_INTEXT;
+                yylval.i = LM_OT_MIN;
                 return LM_TK_END;
         }
         if (c == '[') {
-                yylval.i = LM_EN_DISPLAY;
+                yylval.i = LM_OT_PAR;
                 return LM_TK_BEGIN;
         }
         if (c == ']') {
-                yylval.i = LM_EN_DISPLAY;
+                yylval.i = LM_OT_PAR;
                 return LM_TK_END;
         }
         if (strchr(latex_special_chars, c)) {
@@ -296,7 +311,8 @@ int yylex(void)
 //               for (i = 0; i < 5 && strncmp(yytext, latex_mathenv[i],
 //                             strlen(latex_mathenv[i])); ++i);
                  
-                 for (i = 0; i < 6 && strcmp(yytext, latex_mathenv[i]); ++i);
+                 for (i = 0; i < latex_mathenv_num
+                              && strcmp(yytext, latex_mathenv[i]); ++i);
                  yylval.i = i;
               } else
               if (l->token == LM_TK_SPACE) 
@@ -374,7 +390,7 @@ MathedInset * doAccent(MathedInset * p)
 }
 
 
-LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
+MathedArray * mathed_parse(unsigned flags, MathedArray * array,
                            MathParInset ** mtx)
 {
    int t = yylex();
@@ -393,7 +409,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     MathedRowSt * crow = (mt) ? mt->getRowSt() : 0;
 
    ++plevel;
-   if (!array) array = new LyxArrayBase;
+   if (!array) array = new MathedArray;
    MathedIter data(array);
    while (t) {
       if ((flags & FLAG_BRACE) && t != LM_TK_OPEN) {
@@ -528,7 +544,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case '^':
       {  
         MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
-        LyxArrayBase * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
+        MathedArray * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
         p->SetData(ar);
 //      lyxerr << "UP[" << p->GetStyle() << "]" << endl;
         data.Insert (p, LM_TC_UP);
@@ -537,7 +553,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case '_':
       {
         MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
-        LyxArrayBase * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
+        MathedArray * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
         p->SetData(ar);
         data.Insert (p, LM_TC_DOWN);
         break;
@@ -635,8 +651,8 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case LM_TK_FRAC:
       {
         MathFracInset * fc = new MathFracInset(fractype);
-        LyxArrayBase * num = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
-        LyxArrayBase * den = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
+        MathedArray * num = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
+        MathedArray * den = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
         fc->SetData(num, den);
         data.Insert(fc, LM_TC_ACTIVE_INSET);
         break;
@@ -667,7 +683,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
         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 << "]";
-        LyxArrayBase * a = mathed_parse(FLAG_RIGHT);
+        MathedArray * a = mathed_parse(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)
@@ -757,7 +773,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       }
     case LM_TK_END:
       {
-         if (mathed_env != yylval.i && yylval.i!= LM_EN_ARRAY)
+         if (mathed_env != yylval.i && yylval.i != LM_OT_MATRIX)
           mathPrintError("Unmatched environment");
         // debug info [made that conditional -JMarc]
         if (lyxerr.debugging(Debug::MATHED))
@@ -771,7 +787,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       }
     case LM_TK_BEGIN:
       {
-        if (yylval.i == LM_EN_ARRAY) {
+        if (yylval.i == LM_OT_MATRIX) {
            char ar[120], ar2[8];
            ar[0] = ar2[0] = '\0'; 
             char rg = LexGetArg(0);
@@ -785,7 +801,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
            mm->SetAlign(ar2[0], ar);
                    data.Insert(mm, LM_TC_ACTIVE_INSET);
             mathed_parse(FLAG_END, mm->GetData(), &mm);
-        } else if (yylval.i >= LM_EN_INTEXT && yylval.i<= LM_EN_EQNARRAY) {
+        } else if (is_eqn_type(yylval.i)) {
             if (plevel!= 0) {
                 mathPrintError("Misplaced environment");
                 break;
@@ -795,12 +811,25 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
                 panic = true;
             }
             
-            mathed_env = yylval.i;
-            if (mathed_env>= LM_EN_DISPLAY) {
+            mathed_env = static_cast<MathedInsetTypes>(yylval.i);
+            if (mathed_env != LM_OT_MIN) {
                 size = LM_ST_DISPLAY;
-                if (mathed_env>LM_EN_EQUATION) {
-                    mt = new MathMatrixInset(3, -1);
-                    mt->SetAlign(' ', "rcl");
+                if (is_multiline(mathed_env)) {
+                    int cols = 1;
+                    if (is_multicolumn(mathed_env)) {
+                        if (mathed_env != LM_OT_ALIGNAT &&
+                            mathed_env != LM_OT_ALIGNATN &&
+                            yyis->good()) {
+                            char c;
+                            yyis->get(c);
+                            if (c != '%')
+                                    lyxerr << "Math parse error: unexpected '"
+                                           << c << "'" << endl;
+                        }
+                        LexGetArg('{');
+                        cols = strToInt(string(yytext));
+                    }
+                    mt = create_multiline(mathed_env, cols);
                     if (mtx) *mtx = mt;
                     flags |= FLAG_END;
 //                  data.Insert(' ', LM_TC_TAB);
@@ -811,7 +840,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
                 mt->SetType(mathed_env);
                 crow = mt->getRowSt();
             }
-                              
+
 #ifdef DEBUG
             lyxerr << "MATH BEGIN[" << mathed_env << "]" << endl;
 #endif