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;
59 else transaction(ch, ACCEPT);
67 else if (ch == -1) error();
70 parser.push(TToken(TToken::CONTROL, ch));
77 parser.push(TToken(TToken::CONTROL, buffer));
83 parser.push(TToken(TToken::CONTROL, buffer));
91 parser.push(TToken(TToken::CONTROL, buffer));
97 parser.push(TToken(TToken::CONTROL, buffer));
99 if (isspace(ch)) state = IGNORE_SPACE;
100 else transaction(ch, ACCEPT);
104 if (ch == '\\') state = ESCAPE;
105 else if (ch == '#') state = PARAMETER;
106 else if (isspace(ch)) ;
107 else if (ch == -1) state = ACCEPT;
108 else transaction(ch, ACCEPT);
111 if (ch == -1) error();
114 parser.push(TToken(TToken::PARAMETER, ch));
125 case ESCAPE: parser.setCursorHint("\\"); break;
126 case MACRO: parser.setCursorHint("\\" + buffer); break;
127 case PARAMETER: parser.setCursorHint("#"); break;
128 default: parser.setCursorHint(""); break;
133 TPushLexer::drop(bool alt)
135 std::string restore = "";
141 restore = parser.drop(alt);
142 if (restore.length() > 0 && restore[0] == '\\')
144 buffer = std::string(restore, 1, restore.length() - 1);
145 state = (buffer.length() > 0) ? MACRO : ESCAPE;
152 if (alt) buffer.erase();
153 else buffer.erase(buffer.length() - 1, 1);
154 if (buffer.length() == 0) state = ESCAPE;
164 case ESCAPE: parser.setCursorHint("\\"); break;
165 case MACRO: parser.setCursorHint("\\" + buffer); break;
166 case PARAMETER: parser.setCursorHint("#"); break;
167 default: parser.setCursorHint(""); break;
172 TPushLexer::error() const