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 transaction(ch, ACCEPT);
62 parser.push(TToken(TToken::CONTROL, ch));
69 parser.push(TToken(TToken::CONTROL, buffer));
75 parser.push(TToken(TToken::CONTROL, buffer));
83 parser.push(TToken(TToken::CONTROL, buffer));
85 if (isspace(ch)) state = IGNORE_SPACE;
86 else transaction(ch, ACCEPT);
90 if (ch == '\\') state = ESCAPE;
91 else if (ch == '#') state = PARAMETER;
92 else if (isspace(ch)) ;
93 else transaction(ch, ACCEPT);
96 parser.push(TToken(TToken::PARAMETER, ch));
106 case ESCAPE: parser.setCursor("\\"); break;
107 case MACRO: parser.setCursor("\\" + buffer); break;
108 case PARAMETER: parser.setCursor("#"); break;
109 default: parser.setCursor("?"); break;
114 TPushLexer::error() const