3 #include "TPushLexer.hh"
4 #include "APushParser.hh"
6 TPushLexer::TPushLexer(ALogger& l, APushParser& p) : APushLexer(l, p)
25 TPushLexer::transaction(char ch, State newState)
29 case '{': parser.push(TToken(TToken::BEGIN)); break;
30 case '}': parser.push(TToken(TToken::END)); break;
31 case '$': parser.push(TToken(TToken::SHIFT)); break;
32 case '&': parser.push(TToken(TToken::ALIGN)); break;
34 case '\r': parser.push(TToken(TToken::EOL, ch)); break;
35 case '^': parser.push(TToken(TToken::SUPERSCRIPT)); break;
36 case '_': parser.push(TToken(TToken::SUBSCRIPT)); break;
38 case ' ': parser.push(TToken(TToken::SPACE, ch)); break;
39 case '~': parser.push(TToken(TToken::ACTIVE, ch)); break;
40 case '%': parser.push(TToken(TToken::COMMENT)); break;
42 if (isalpha(ch)) parser.push(TToken(TToken::LETTER, ch));
43 else if (isdigit(ch)) parser.push(TToken(TToken::DIGIT, ch));
44 else parser.push(TToken(TToken::OTHER, ch));
51 TPushLexer::push(char ch)
56 if (ch == '\\') state = ESCAPE;
57 else if (ch == '#') state = PARAMETER;
58 else if (ch == '\b') parser.push(TToken(TToken::GDELETE));
60 else transaction(ch, ACCEPT);
72 else if (ch == -1) error();
75 parser.push(TToken(TToken::CONTROL, ch));
82 parser.push(TToken(TToken::CONTROL, buffer));
88 parser.push(TToken(TToken::CONTROL, buffer));
94 buffer.erase(buffer.length() - 1, 1);
95 if (buffer.length() == 0) state = ESCAPE;
101 parser.push(TToken(TToken::CONTROL, buffer));
107 parser.push(TToken(TToken::CONTROL, buffer));
109 if (isspace(ch)) state = IGNORE_SPACE;
110 else transaction(ch, ACCEPT);
114 if (ch == '\\') state = ESCAPE;
115 else if (ch == '#') state = PARAMETER;
116 else if (isspace(ch)) ;
117 else if (ch == '\b') parser.push(TToken(TToken::GDELETE));
118 else if (ch == -1) state = ACCEPT;
119 else transaction(ch, ACCEPT);
122 if (ch == -1) error();
125 parser.push(TToken(TToken::PARAMETER, ch));
136 case ESCAPE: parser.setCursorHint("\\"); break;
137 case MACRO: parser.setCursorHint("\\" + buffer); break;
138 case PARAMETER: parser.setCursorHint("#"); break;
139 default: parser.setCursorHint(""); break;
144 TPushLexer::error() const