File indexing completed on 2024-04-28 03:40:44
0001 /************************************************************************************* 0002 * Copyright (C) 2008 by Aleix Pol <aleixpol@kde.org> * 0003 * * 0004 * This program is free software; you can redistribute it and/or * 0005 * modify it under the terms of the GNU General Public License * 0006 * as published by the Free Software Foundation; either version 2 * 0007 * of the License, or (at your option) any later version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, * 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0012 * GNU General Public License for more details. * 0013 * * 0014 * You should have received a copy of the GNU General Public License * 0015 * along with this program; if not, write to the Free Software * 0016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 0017 *************************************************************************************/ 0018 0019 #include "mathmlpresentationlexer.h" 0020 #include "expressionparser.h" 0021 0022 #include <QDebug> 0023 #include <QStringList> 0024 #include <QCoreApplication> 0025 0026 MathMLPresentationLexer::MathMLPresentationLexer(const QString &source) 0027 : AbstractLexer(source), m_xml(source) 0028 { 0029 m_tokenTags[QStringLiteral("mfrac")]=TOKEN(ExpressionTable::tDiv, 0, QStringLiteral("divide")); 0030 m_tokenTags[QStringLiteral("msup")]=TOKEN(ExpressionTable::tPow, 0, QStringLiteral("power")); 0031 m_tokenTags[QStringLiteral("msqrt")]=TOKEN(ExpressionTable::tPow, 0, QStringLiteral("root")); 0032 } 0033 0034 void MathMLPresentationLexer::getToken() 0035 { 0036 while(!m_xml.atEnd()) { 0037 QXmlStreamReader::TokenType t=m_xml.readNext(); 0038 QString e=m_xml.name().toString(); 0039 switch(t) 0040 { 0041 case QXmlStreamReader::Invalid: 0042 m_err = m_xml.errorString(); 0043 break; 0044 case QXmlStreamReader::StartDocument: 0045 break; 0046 case QXmlStreamReader::EndDocument: 0047 break; 0048 case QXmlStreamReader::StartElement: 0049 m_tags.push(e); 0050 if(m_tokenTags.contains(e)) { 0051 TOKEN t=m_tokenTags[e]; 0052 if(t.type>=0) { 0053 m_tokens.append(TOKEN(ExpressionTable::tId, 0, t.val)); 0054 } 0055 0056 m_tokens.append(TOKEN(ExpressionTable::tLpr, 0)); 0057 } 0058 break; 0059 case QXmlStreamReader::EndElement: 0060 if(m_tokenTags.contains(e)) { 0061 if(m_tokens.last().type==ExpressionTable::tComa) 0062 m_tokens.takeLast(); 0063 0064 if(e==QLatin1String("msqrt")) { 0065 m_tokens.append(TOKEN(ExpressionTable::tComa, 0)); 0066 m_tokens.append(TOKEN(ExpressionTable::tVal, 0, QStringLiteral("<cn>2</cn>"))); 0067 } 0068 m_tokens.append(TOKEN(ExpressionTable::tRpr, 0)); 0069 } 0070 0071 m_tags.pop(); 0072 if(!m_tags.isEmpty() && m_tokenTags.contains(m_tags.top()) && e!=QLatin1String("mo")) { 0073 m_tokens.append(TOKEN(ExpressionTable::tComa, 0)); 0074 } 0075 break; 0076 default: 0077 if(m_tags.top()==QLatin1String("mn")) { 0078 TOKEN ret(ExpressionTable::tVal, 0, QStringLiteral("<cn>%1</cn>").arg(m_xml.text().toString())); 0079 m_tokens.append(ret); 0080 } else if(m_tags.top()==QLatin1String("mi")) { 0081 TOKEN ret(ExpressionTable::tId, 0, m_xml.text().toString()); 0082 m_tokens.append(ret); 0083 } else if(m_tags.top()==QLatin1String("mo")) { 0084 if(!m_tokens.isEmpty() && m_tokens.last().type==ExpressionTable::tComa) 0085 m_tokens.takeLast(); 0086 0087 int t; 0088 QString op=m_xml.text().toString().trimmed(); 0089 if(op.length()==1 && m_operators.contains(op[0])) 0090 t = m_operators[op[0]]; 0091 else if(op.length()==2 && m_longOperators.contains(op)) 0092 t = m_longOperators[op]; 0093 else { 0094 m_err= QCoreApplication::translate("Error message", "Unknown token '%1'").arg(op); 0095 break; 0096 } 0097 m_tokens.append(TOKEN(t, 0)); 0098 } else { 0099 QString text = m_xml.text().toString().trimmed(); 0100 if(text==QLatin1String("if") || text==QLatin1String("otherwise")) { 0101 m_tokens.append(TOKEN(ExpressionTable::tQm, 0, m_xml.text().toString())); 0102 } else 0103 qDebug() << "dunno" << text; 0104 } 0105 break; 0106 } 0107 } 0108 0109 // printQueue(m_tokens); 0110 0111 if (m_xml.error()) 0112 m_err = m_xml.errorString(); 0113 0114 m_tokens.append(TOKEN(ExpressionTable::EOF_SYMBOL, 0)); 0115 }