]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_parser.C
further code uglification to make Jean-Marc's compiler happy
[lyx.git] / src / mathed / math_parser.C
index 97f247bba43d8970d75bbf61aa9e58cf79eaa912..18766700e37c3bd16dd972b404597f445f137837 100644 (file)
@@ -40,6 +40,7 @@
 #include "math_sqrtinset.h"
 #include "math_scriptinset.h"
 #include "math_specialcharinset.h"
+#include "math_splitinset.h"
 #include "math_sqrtinset.h"
 #include "debug.h"
 #include "support.h"
@@ -60,34 +61,6 @@ bool stared(string const & s)
        return n && s[n - 1] == '*';
 }
 
-MathScriptInset * prevScriptInset(MathArray const & array)
-{
-       MathInset * p = array.back();
-       return (p && p->isScriptInset()) ? static_cast<MathScriptInset *>(p) : 0;
-}
-
-
-MathInset * lastScriptInset(MathArray & array, bool up, int limits)
-{
-       MathScriptInset * p = prevScriptInset(array);
-       if (!p) {
-               MathInset * b = array.back();
-               if (b && b->isScriptable()) {
-                       p = new MathScriptInset(up, !up, b->clone());
-                       array.pop_back();       
-               } else {
-                       p = new MathScriptInset(up, !up);
-               }
-               array.push_back(p);
-       }
-       if (up)
-               p->up(true);
-       else
-               p->down(true);
-       if (limits)
-               p->limits(limits);
-       return p;
-}
 
 
 // These are TeX's catcodes
@@ -245,8 +218,6 @@ private:
        void error(string const & msg);
        ///
        void parse_lines(MathGridInset * p, bool numbered, bool outmost);
-       ///
-       latexkeys const * read_delim();
 
 private:
        ///
@@ -394,7 +365,7 @@ void Parser::tokenize(string const & buffer)
                init_done = true;
        }
 
-       istringstream is(buffer, ios::in | ios::binary);
+       istringstream is(buffer.c_str(), ios::in | ios::binary);
 
        char c;
        while (is.get(c)) {
@@ -451,6 +422,7 @@ void Parser::tokenize(string const & buffer)
 void Parser::error(string const & msg) 
 {
        lyxerr << "Line ~" << lineno_ << ": Math parse error: " << msg << endl;
+       //exit(1);
 }
 
 
@@ -616,16 +588,20 @@ MathMatrixInset * Parser::parse_normal()
                return p;
        }
 
-       lyxerr[Debug::MATHED] << "1: unknown math environment: " << name << "\n";
-       return 0;
-}
+       if (name == "multline" || name == "multline*") {
+               MathMatrixInset * p = new MathMatrixInset(LM_OT_MULTLINE);
+               parse_lines(p, !stared(name), true);
+               return p;
+       }
 
+       if (name == "gather" || name == "gather*") {
+               MathMatrixInset * p = new MathMatrixInset(LM_OT_GATHER);
+               parse_lines(p, !stared(name), true);
+               return p;
+       }
 
-latexkeys const * Parser::read_delim()
-{
-       Token const & t = getToken();
-       latexkeys const * l = in_word_set(t.asString());
-       return l ? l : in_word_set(".");
+       lyxerr[Debug::MATHED] << "1: unknown math environment: " << name << "\n";
+       return 0;
 }
 
 
@@ -634,7 +610,6 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
        MathTextCodes yyvarcode = LM_TC_MIN;
 
        bool panic  = false;
-       int  limits = 0;
 
        while (good()) {
                Token const & t = getToken();
@@ -710,12 +685,13 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                        array.push_back(new MathCharInset('&', LM_TC_TEX));
                }
                
-               else if (t.cat() == catSuper)
-                       parse_into(lastScriptInset(array, true, limits)->cell(0), FLAG_ITEM);
-               
-               else if (t.cat() == catSub)
-                       parse_into(lastScriptInset(array, false, limits)->cell(1), FLAG_ITEM);
-               
+               else if (t.cat() == catSuper || t.cat() == catSub) {
+                       bool up = (t.cat() == catSuper);
+                       if (array.empty())
+                               array.push_back(new MathCharInset(' '));
+                       parse_into(array.back().ensure(up)->cell(0), FLAG_ITEM);
+               }
+
                else if (t.character() == ']' && (flags & FLAG_BRACK_END))
                        return;
 
@@ -746,11 +722,11 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                        array.push_back(createMathInset("\\"));
                }
        
-               else if (t.cs() == "limits"
-                       limits = 1;
+               else if (t.cs() == "limits" && array.size())
+                       array.back().limits(1);
                
-               else if (t.cs() == "nolimits"
-                       limits = -1;
+               else if (t.cs() == "nolimits" && array.size())
+                       array.back().limits(-1);
                
                else if (t.cs() == "nonumber")
                        curr_num_ = false;
@@ -762,28 +738,30 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                        char c = getChar();
                        if (c == '[') {
                                array.push_back(new MathRootInset);
-                               parse_into(array.back()->cell(0), FLAG_BRACK_END);
-                               parse_into(array.back()->cell(1), FLAG_ITEM);
+                               parse_into(array.back().nucleus()->cell(0), FLAG_BRACK_END);
+                               parse_into(array.back().nucleus()->cell(1), FLAG_ITEM);
                        } else {
                                putback();
                                array.push_back(new MathSqrtInset);
-                               parse_into(array.back()->cell(0), FLAG_ITEM);
+                               parse_into(array.back().nucleus()->cell(0), FLAG_ITEM);
                        }
                }
                
                else if (t.cs() == "left") {
-                       latexkeys const * l = read_delim();
+                       string l = getToken().asString();
                        MathArray ar;
                        parse_into(ar, FLAG_RIGHT);
-                       latexkeys const * r = read_delim();
+                       string r = getToken().asString();
                        MathDelimInset * dl = new MathDelimInset(l, r);
                        dl->cell(0) = ar;
                        array.push_back(dl);
                }
                
                else if (t.cs() == "right") {
-                       if (!(flags & FLAG_RIGHT))
+                       if (!(flags & FLAG_RIGHT)) {
+                               lyxerr << "got so far: '" << array << "'\n";
                                error("Unmatched right delimiter");
+                       }
                        return;
                }
 
@@ -798,9 +776,6 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                        break; 
                }
 
-               else  LM_TK_SPECIAL:
-                       array.push_back(new MathCharInset(ival_, LM_TC_TEX));
-                       break;
 */
                
                else if (t.cs() == "begin") {
@@ -813,6 +788,10 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                                m->halign(halign);
                                parse_lines(m, false, false);
                                array.push_back(m);
+                       } else if (name == "split") {
+                               MathSplitInset * m = new MathSplitInset(1);
+                               parse_lines(m, false, false);
+                               array.push_back(m);
                        } else 
                                lyxerr[Debug::MATHED] << "unknow math inset begin '" << name << "'\n";  
                }
@@ -846,29 +825,34 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                }
 
                else if (t.cs() == "choose" || t.cs() == "over" || t.cs() == "atop") {
-                       limits = 0;
                        MathInset * p = createMathInset(t.cs());
                        // search backward for position of last '{' if any
                        int pos;
-                       for (pos = array.size() - 1; pos >= 0; --pos) {
-                               MathInset * q = array.nextInset(pos);
-                               if (q->getChar() == '{')
+                       for (pos = array.size() - 1; pos >= 0; --pos)
+                               if (array.at(pos)->nucleus()->getChar() == '{')
                                        break;
-                       }
                        if (pos >= 0) {
-                               // found it -> use the part after '{' as "numerator", erase the '{'
+                               // found it -> use the part after '{' as "numerator"
                                p->cell(0) = MathArray(array, pos + 1, array.size());
+                               parse_into(p->cell(1), FLAG_BRACE_LAST);
+                               // delete denominator and the '{'
                                array.erase(pos, array.size());
+                       } else if (flags & FLAG_RIGHT) {
+                               // we are inside a \left ... \right block
+                               //lyxerr << "found '" << t.cs() << "' enclosed by \\left .. \\right\n";
+                               p->cell(0).swap(array);
+                               parse_into(p->cell(1), FLAG_RIGHT);
+                               // handle the right delimiter properly
+                               putback();
                        } else {
                                // not found -> use everything as "numerator"
                                p->cell(0).swap(array);
+                               parse_into(p->cell(1), FLAG_BLOCK);
                        }
                        array.push_back(p);
-                       parse_into(p->cell(1), FLAG_BLOCK);
                }
        
                else if (t.cs().size()) {
-                       limits = 0;
                        latexkeys const * l = in_word_set(t.cs());
                        if (l) {
                                if (l->token == LM_TK_FONT) {
@@ -883,7 +867,7 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                                        MathArray ar;
                                        parse_into(ar, FLAG_ITEM, t);
                                        for (MathArray::iterator it = ar.begin(); it != ar.end(); ++it)
-                                               (*it)->handleFont(t);
+                                               it->nucleus()->handleFont(t);
                                        array.push_back(ar);
 
                                        // undo catcode changes
@@ -896,7 +880,7 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
 
                                else {
                                        MathInset * p = createMathInset(t.cs());
-                                       for (int i = 0; i < p->nargs(); ++i) 
+                                       for (unsigned int i = 0; i < p->nargs(); ++i) 
                                                parse_into(p->cell(i), FLAG_ITEM);
                                        array.push_back(p);
                                }
@@ -905,7 +889,7 @@ void Parser::parse_into(MathArray & array, unsigned flags, MathTextCodes code)
                        else {
                                MathInset * p = createMathInset(t.cs());
                                if (p) {
-                                       for (int i = 0; i < p->nargs(); ++i)
+                                       for (unsigned int i = 0; i < p->nargs(); ++i)
                                                parse_into(p->cell(i), FLAG_ITEM);
                                        array.push_back(p);
                                } else {