X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FDEVEL%2Fmathml_editor%2Fsrc%2FTPushLexer.cc;h=c8d04f1bd4354401a4de38b2b83c18c101d231fb;hb=305502d014e6ac7bde45e48de615bd9c77b0e573;hp=b943877870c0400a8c42f94d469feab5fbe8f4f2;hpb=89262281b6e83bd2321150f81f1a0583645eb0c8;p=helm.git diff --git a/helm/DEVEL/mathml_editor/src/TPushLexer.cc b/helm/DEVEL/mathml_editor/src/TPushLexer.cc index b94387787..c8d04f1bd 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) { @@ -31,7 +37,7 @@ TPushLexer::transaction(char ch, State newState) case '\t': case ' ': parser.push(TToken(TToken::SPACE, ch)); break; case '~': parser.push(TToken(TToken::ACTIVE, ch)); break; - case '%': parser.push(TToken(TToken::COMMENT)); break; + case '%': parser.push(TToken(TToken::COMMENT)); break; default: if (isalpha(ch)) parser.push(TToken(TToken::LETTER, ch)); else if (isdigit(ch)) parser.push(TToken(TToken::DIGIT, ch)); @@ -49,6 +55,7 @@ TPushLexer::push(char ch) case ACCEPT: if (ch == '\\') state = ESCAPE; else if (ch == '#') state = PARAMETER; + else if (ch == -1) ; else transaction(ch, ACCEPT); break; case ESCAPE: @@ -57,6 +64,7 @@ TPushLexer::push(char ch) buffer.push_back(ch); state = MACRO; } + else if (ch == -1) error(); else { parser.push(TToken(TToken::CONTROL, ch)); @@ -78,6 +86,12 @@ TPushLexer::push(char ch) } 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)); @@ -90,12 +104,56 @@ TPushLexer::push(char ch) if (ch == '\\') state = ESCAPE; else if (ch == '#') state = PARAMETER; else if (isspace(ch)) ; + 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(); + 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; @@ -103,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; } }