X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FDEVEL%2Fmathml_editor%2Fsrc%2FTPushLexer.cc;h=da15822c39794eeac79e8a37a62866c2e19ffd5f;hb=4167cea65ca58897d1a3dbb81ff95de5074700cc;hp=4b24523da5e494c01ac2202bfbea438063fbf996;hpb=e290ab0a049ec2babedc3cb0ff802c430ed8ee7c;p=helm.git diff --git a/helm/DEVEL/mathml_editor/src/TPushLexer.cc b/helm/DEVEL/mathml_editor/src/TPushLexer.cc index 4b24523da..da15822c3 100644 --- a/helm/DEVEL/mathml_editor/src/TPushLexer.cc +++ b/helm/DEVEL/mathml_editor/src/TPushLexer.cc @@ -1,9 +1,37 @@ +/* This file is part of EdiTeX, an editor of mathematical + * expressions based on TeX syntax. + * + * Copyright (C) 2002-2003 Luca Padovani , + * 2003 Paolo Marinelli . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * For more information, please visit the project's home page + * http://helm.cs.unibo.it/editex/ + * or send an email to + */ + +#include +#include +#include #include "TToken.hh" #include "TPushLexer.hh" #include "APushParser.hh" -TPushLexer::TPushLexer(APushParser& p) : APushLexer(p) +TPushLexer::TPushLexer(ALogger& l, APushParser& p) : APushLexer(l, p) { state = ACCEPT; } @@ -13,6 +41,14 @@ TPushLexer::reset() { buffer.erase(); state = ACCEPT; + + displayCursor(); +} + +void +TPushLexer::flush() +{ + push(-1); } void @@ -29,7 +65,7 @@ TPushLexer::transaction(char ch, State newState) case '^': parser.push(TToken(TToken::SUPERSCRIPT)); break; case '_': parser.push(TToken(TToken::SUBSCRIPT)); break; case '\t': - case ' ': parser.push(TToken(TToken::SPACE, ch)); break; + case ' ': parser.push(TToken(TToken::IGNORABLE_SPACE, ch)); break; case '~': parser.push(TToken(TToken::ACTIVE, ch)); break; case '%': parser.push(TToken(TToken::COMMENT)); break; default: @@ -49,7 +85,7 @@ TPushLexer::push(char ch) case ACCEPT: if (ch == '\\') state = ESCAPE; else if (ch == '#') state = PARAMETER; - else if (ch == '\b') parser.push(TToken(TToken::GDELETE)); + else if (ch == -1) ; else transaction(ch, ACCEPT); break; case ESCAPE: @@ -58,10 +94,7 @@ TPushLexer::push(char ch) buffer.push_back(ch); state = MACRO; } - else if (ch == '\b') - { - state = ACCEPT; - } + else if (ch == -1) error(); else { parser.push(TToken(TToken::CONTROL, ch)); @@ -81,13 +114,14 @@ TPushLexer::push(char ch) buffer.erase(); state = PARAMETER; } - else if (ch == '\b') - { - buffer.erase(buffer.length() - 1, 1); - if (buffer.length() == 0) state = ESCAPE; - } else if (isalpha(ch)) buffer.push_back(ch); + else if (ch == -1) + { + parser.push(TToken(TToken::CONTROL, buffer)); + buffer.erase(); + state = ACCEPT; + } else { parser.push(TToken(TToken::CONTROL, buffer)); @@ -100,24 +134,69 @@ TPushLexer::push(char ch) if (ch == '\\') state = ESCAPE; else if (ch == '#') state = PARAMETER; else if (isspace(ch)) ; - else if (ch == '\b') parser.push(TToken(TToken::GDELETE)); + else if (ch == -1) state = ACCEPT; else transaction(ch, ACCEPT); break; case PARAMETER: - parser.push(TToken(TToken::PARAMETER, ch)); + if (ch == -1) error(); + else + { + parser.push(TToken(TToken::PARAMETER, ch)); + state = ACCEPT; + } + break; + default: + assert(0); + break; + } + + displayCursor(); + +} + +void +TPushLexer::drop(bool alt) +{ + std::string restore = ""; + + switch (state) + { + case ACCEPT: + case IGNORE_SPACE: + restore = parser.drop(alt); + if (restore.length() > 0 && restore[0] == '\\') + { + buffer = std::string(restore, 1, restore.length() - 1); + state = (buffer.length() > 0) ? MACRO : ESCAPE; + } + break; + case ESCAPE: state = ACCEPT; break; + case MACRO: + if (alt) buffer.erase(); + else buffer.erase(buffer.length() - 1, 1); + if (buffer.length() == 0) state = ESCAPE; + break; + case PARAMETER: default: assert(0); break; } + displayCursor(); + +} + +void +TPushLexer::displayCursor() +{ switch (state) { - case ESCAPE: parser.setCursor("\\"); break; - case MACRO: parser.setCursor("\\" + buffer); break; - case PARAMETER: parser.setCursor("#"); break; - default: parser.setCursor("?"); break; + case ESCAPE: parser.setCursorHint("\\"); break; + case MACRO: parser.setCursorHint("\\" + buffer); break; + case PARAMETER: parser.setCursorHint("#"); break; + default: parser.setCursorHint(""); break; } }