X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=helm%2FDEVEL%2Fmathml_editor%2Fsrc%2FTPushLexer.cc;h=73ff25c613005785daf9d2284cf7094c9ce8b99b;hb=caab26f85122e0040555139c48a9111a0b2b9fff;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..73ff25c61 100644 --- a/helm/DEVEL/mathml_editor/src/TPushLexer.cc +++ b/helm/DEVEL/mathml_editor/src/TPushLexer.cc @@ -3,7 +3,7 @@ #include "TPushLexer.hh" #include "APushParser.hh" -TPushLexer::TPushLexer(APushParser& p) : APushLexer(p) +TPushLexer::TPushLexer(ALogger& l, APushParser& p) : APushLexer(l, p) { state = ACCEPT; } @@ -15,6 +15,12 @@ TPushLexer::reset() state = ACCEPT; } +void +TPushLexer::flush() +{ + push(-1); +} + void TPushLexer::transaction(char ch, State newState) { @@ -49,7 +55,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 +64,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 +84,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,13 +104,56 @@ 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; + } + + switch (state) + { + case ESCAPE: parser.setCursorHint("\\"); break; + case MACRO: parser.setCursorHint("\\" + buffer); break; + case PARAMETER: parser.setCursorHint("#"); break; + default: parser.setCursorHint(""); break; + } +} + +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; @@ -114,10 +161,10 @@ TPushLexer::push(char ch) 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; } }