X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FDEVEL%2Fmathml_editor%2Fsrc%2FTPushLexer.cc;h=1d25abbe98edff1fa8299e0eb82fc7585b6397d7;hb=7bea7bddf7ca13260f4d3965182dc4fb58d035e7;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..1d25abbe9 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,8 @@ 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: @@ -57,6 +65,11 @@ 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)); @@ -76,8 +89,19 @@ 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)); @@ -90,11 +114,17 @@ 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)); - state = ACCEPT; + if (ch == -1) error(); + else + { + parser.push(TToken(TToken::PARAMETER, ch)); + state = ACCEPT; + } break; default: assert(0); @@ -103,10 +133,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; } }