#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)
{
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:
{
state = ACCEPT;
}
+ else if (ch == -1) error();
else
{
parser.push(TToken(TToken::CONTROL, 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));
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;
}
}