]> matita.cs.unibo.it Git - helm.git/blob - helm/DEVEL/mathml_editor/src/TPushLexer.cc
Added the special deletion. Pressing backspace, the user has a normal deletion
[helm.git] / helm / DEVEL / mathml_editor / src / TPushLexer.cc
1
2 #include "TToken.hh"
3 #include "TPushLexer.hh"
4 #include "APushParser.hh"
5
6 TPushLexer::TPushLexer(ALogger& l, APushParser& p) : APushLexer(l, p)
7 {
8   state = ACCEPT;
9 }
10
11 void
12 TPushLexer::reset()
13 {
14   buffer.erase();
15   state = ACCEPT;
16 }
17
18 void
19 TPushLexer::flush()
20 {
21   push(-1);
22 }
23
24 void
25 TPushLexer::transaction(char ch, State newState)
26 {
27   switch (ch)
28     {
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;
33     case '\n':
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;
37     case '\t':
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:
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));
45       break;
46     }
47   state = newState;
48 }
49
50 void
51 TPushLexer::push(char ch)
52 {
53   switch (state)
54     {
55     case ACCEPT:
56       if (ch == '\\') state = ESCAPE;
57       else if (ch == '#') state = PARAMETER;
58       else if (ch == -1) ;
59       else transaction(ch, ACCEPT);
60       break;
61     case ESCAPE:
62       if (isalpha(ch))
63         {
64           buffer.push_back(ch);
65           state = MACRO;
66         }
67       else if (ch == -1) error();
68       else
69         {
70           parser.push(TToken(TToken::CONTROL, ch));
71           state = ACCEPT;
72         }
73       break;
74     case MACRO:
75       if (ch == '\\')
76         {
77           parser.push(TToken(TToken::CONTROL, buffer));
78           buffer.erase();
79           state = ESCAPE;
80         }
81       else if (ch == '#')
82         {
83           parser.push(TToken(TToken::CONTROL, buffer));
84           buffer.erase();
85           state = PARAMETER;
86         }
87       else if (isalpha(ch))
88         buffer.push_back(ch);
89       else if (ch == -1)
90         {
91           parser.push(TToken(TToken::CONTROL, buffer));
92           buffer.erase();
93           state = ACCEPT;
94         }
95       else
96         {
97           parser.push(TToken(TToken::CONTROL, buffer));
98           buffer.erase();
99           if (isspace(ch)) state = IGNORE_SPACE;
100           else transaction(ch, ACCEPT);
101         }
102       break;
103     case IGNORE_SPACE:
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);
109       break;
110     case PARAMETER:
111       if (ch == -1) error();
112       else
113         {
114           parser.push(TToken(TToken::PARAMETER, ch));
115           state = ACCEPT;
116         }
117       break;
118     default:
119       assert(0);
120       break;
121     }
122
123   switch (state)
124     {
125     case ESCAPE: parser.setCursorHint("\\"); break;
126     case MACRO: parser.setCursorHint("\\" + buffer); break;
127     case PARAMETER: parser.setCursorHint("#"); break;
128     default: parser.setCursorHint(""); break;
129     }
130 }
131
132 void
133 TPushLexer::drop(bool alt)
134 {
135   std::string restore = "";
136
137   switch (state)
138     {
139     case ACCEPT:
140     case IGNORE_SPACE:
141       restore = parser.drop(alt);
142       if (restore.length() > 0 && restore[0] == '\\')
143         {
144           buffer = std::string(restore, 1, restore.length() - 1);
145           state = (buffer.length() > 0) ? MACRO : ESCAPE;
146         }
147       break;
148     case ESCAPE:
149       state = ACCEPT;
150       break;
151     case MACRO:
152       if (alt) buffer.erase();
153       else buffer.erase(buffer.length() - 1, 1);
154       if (buffer.length() == 0) state = ESCAPE;
155       break;
156     case PARAMETER:
157     default:
158       assert(0);
159       break;
160     }
161
162   switch (state)
163     {
164     case ESCAPE: parser.setCursorHint("\\"); break;
165     case MACRO: parser.setCursorHint("\\" + buffer); break;
166     case PARAMETER: parser.setCursorHint("#"); break;
167     default: parser.setCursorHint(""); break;
168     }
169 }
170
171 bool
172 TPushLexer::error() const
173 {
174   return false;
175 }