3 #include "TPushLexer.hh"
4 #include "APushParser.hh"
6 TPushLexer::TPushLexer(APushParser& p) : APushLexer(p)
19 TPushLexer::transaction(char ch, State newState)
23 case '{': parser.push(TToken(TToken::BEGIN)); break;
24 case '}': parser.push(TToken(TToken::END)); break;
25 case '$': parser.push(TToken(TToken::SHIFT)); break;
26 case '&': parser.push(TToken(TToken::ALIGN)); break;
28 case '\r': parser.push(TToken(TToken::EOL, ch)); break;
29 case '^': parser.push(TToken(TToken::SUPERSCRIPT)); break;
30 case '_': parser.push(TToken(TToken::SUBSCRIPT)); break;
32 case ' ': parser.push(TToken(TToken::SPACE, ch)); break;
33 case '~': parser.push(TToken(TToken::ACTIVE, ch)); break;
34 case '%': parser.push(TToken(TToken::COMMENT)); break;
36 if (isalpha(ch)) parser.push(TToken(TToken::LETTER, ch));
37 else if (isdigit(ch)) parser.push(TToken(TToken::DIGIT, ch));
38 else parser.push(TToken(TToken::OTHER, ch));
45 TPushLexer::push(char ch)
50 if (ch == '\\') state = ESCAPE;
51 else if (ch == '#') state = PARAMETER;
52 else if (ch == '\b') parser.push(TToken(TToken::GDELETE));
53 else transaction(ch, ACCEPT);
67 parser.push(TToken(TToken::CONTROL, ch));
74 parser.push(TToken(TToken::CONTROL, buffer));
80 parser.push(TToken(TToken::CONTROL, buffer));
86 buffer.erase(buffer.length() - 1, 1);
87 if (buffer.length() == 0) state = ESCAPE;
93 parser.push(TToken(TToken::CONTROL, buffer));
95 if (isspace(ch)) state = IGNORE_SPACE;
96 else transaction(ch, ACCEPT);
100 if (ch == '\\') state = ESCAPE;
101 else if (ch == '#') state = PARAMETER;
102 else if (isspace(ch)) ;
103 else if (ch == '\b') parser.push(TToken(TToken::GDELETE));
104 else transaction(ch, ACCEPT);
107 parser.push(TToken(TToken::PARAMETER, ch));
117 case ESCAPE: parser.setCursor("\\"); break;
118 case MACRO: parser.setCursor("\\" + buffer); break;
119 case PARAMETER: parser.setCursor("#"); break;
120 default: parser.setCursor("?"); break;
125 TPushLexer::error() const