#include "TPushLexer.hh"
#include "APushParser.hh"
-TPushLexer::TPushLexer(APushParser& p) : APushLexer(p)
+TPushLexer::TPushLexer(ALogger& l, APushParser& p) : APushLexer(l, p)
{
state = ACCEPT;
}
state = ACCEPT;
}
+void
+TPushLexer::flush()
+{
+ push(-1);
+}
+
void
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));
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:
buffer.push_back(ch);
state = MACRO;
}
+ else if (ch == '\b')
+ {
+ state = ACCEPT;
+ }
+ else if (ch == -1) error();
else
{
parser.push(TToken(TToken::CONTROL, 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));
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);
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;
}
}