3 #include "LPushLexer.hh"
4 #include "APushParser.hh"
6 LPushLexer::LPushLexer(ALogger& l, APushParser& p) : APushLexer(l, p)
25 LPushLexer::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;
41 default: parser.push(TToken(TToken::OTHER, ch)); break;
47 LPushLexer::push(char ch)
52 if (ch == '\\') state = ESCAPE;
53 else if (ch == '#') state = PARAMETER;
62 // we translate this space in a macro.
63 parser.push(TToken(TToken::CONTROL, "space"));
70 else transaction(ch, ACCEPT);
78 else if (ch == -1) error();
81 // in this case, the previous '\' is ignored
87 parser.push(TToken(TToken::CONTROL, ch));
94 parser.push(TToken(TToken::CONTROL, buffer));
100 parser.push(TToken(TToken::CONTROL, buffer));
104 else if (isalpha(ch))
105 buffer.push_back(ch);
108 parser.push(TToken(TToken::CONTROL, buffer));
112 else if (isspace(ch))
114 parser.push(TToken(TToken::CONTROL, buffer));
117 * we comment this line, because a space after a macro
118 * is useful to exit from a macro
119 //parser.push(TToken(TToken::CONTROL, ";"));
123 else if (isdigit(ch))
125 parser.push(TToken(TToken::CONTROL, buffer));
127 buffer.push_back(ch);
132 parser.push(TToken(TToken::CONTROL, buffer));
134 transaction(ch, ACCEPT);
138 if (ch == -1) error();
141 parser.push(TToken(TToken::PARAMETER, ch));
148 parser.push(TToken(TToken::LETTER, buffer));
152 else if (isalpha(ch) || isdigit(ch))
154 buffer.push_back(ch);
156 else if (isspace(ch))
158 parser.push(TToken(TToken::LETTER, buffer));
160 parser.push(TToken(TToken::CONTROL, "space"));
165 parser.push(TToken(TToken::LETTER, buffer));
171 parser.push(TToken(TToken::LETTER, buffer));
177 parser.push(TToken(TToken::LETTER, buffer));
179 transaction(ch, ACCEPT);
183 if (isdigit(ch)) buffer.push_back(ch);
184 else if (isspace(ch))
186 parser.push(TToken(TToken::DIGIT, buffer));
188 parser.push(TToken(TToken::CONTROL, "space"));
191 else if (isalpha(ch))
193 parser.push(TToken(TToken::DIGIT, buffer));
195 buffer.push_back(ch);
200 parser.push(TToken(TToken::DIGIT, buffer));
206 parser.push(TToken(TToken::DIGIT, buffer));
212 parser.push(TToken(TToken::DIGIT, buffer));
218 parser.push(TToken(TToken::DIGIT, buffer));
220 transaction(ch, ACCEPT);
230 case ESCAPE: parser.setCursorHint("\\"); break;
231 case MACRO: parser.setCursorHint("\\" + buffer); break;
232 case PARAMETER: parser.setCursorHint("#"); break;
233 case IDENTIFIER: parser.setCursorHint(buffer); break;
234 case NUMBER: parser.setCursorHint(buffer); break;
235 default: parser.setCursorHint(""); break;
240 LPushLexer::drop(bool alt)
242 std::string restore = "";
247 restore = parser.drop(alt);
248 if (restore.length() > 0 && restore[0] == '\\')
250 cout << restore << endl;
251 buffer = std::string(restore, 1, restore.length() - 1);
252 state = (buffer.length() > 0) ? MACRO : ESCAPE;
254 else if (restore.length() > 0 && isdigit(restore[0]))
259 else if (restore.length() > 0 && isalpha(restore[0]))
269 if (alt) buffer.erase();
270 else buffer.erase(buffer.length() - 1, 1);
271 if (buffer.length() == 0) state = ESCAPE;
274 if (alt) buffer.erase();
275 else buffer.erase(buffer.length() - 1, 1);
276 if (buffer.length() == 0) state = ACCEPT;
279 if (alt) buffer.erase();
280 else buffer.erase(buffer.length() - 1, 1);
281 if (buffer.length() == 0) state = ACCEPT;
292 case ESCAPE: parser.setCursorHint("\\"); break;
293 case MACRO: parser.setCursorHint("\\" + buffer); break;
294 case PARAMETER: parser.setCursorHint("#"); break;
295 case IDENTIFIER: parser.setCursorHint(buffer); break;
296 case NUMBER: parser.setCursorHint(buffer); break;
297 default: parser.setCursorHint(""); break;
302 LPushLexer::error() const