]> matita.cs.unibo.it Git - helm.git/blob - helm/DEVEL/mathml_editor/src/TPushLexer.cc
A first partial implementation of deleting is introduced. The user might
[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(APushParser& p) : APushLexer(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::transaction(char ch, State newState)
20 {
21   switch (ch)
22     {
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;
27     case '\n':
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;
31     case '\t':
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;     
35     default:
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));
39       break;
40     }
41   state = newState;
42 }
43
44 void
45 TPushLexer::push(char ch)
46 {
47   switch (state)
48     {
49     case ACCEPT:
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);
54       break;
55     case ESCAPE:
56       if (isalpha(ch))
57         {
58           buffer.push_back(ch);
59           state = MACRO;
60         }
61       else if (ch == '\b')
62         {
63           state = ACCEPT;
64         }
65       else
66         {
67           parser.push(TToken(TToken::CONTROL, ch));
68           state = ACCEPT;
69         }
70       break;
71     case MACRO:
72       if (ch == '\\')
73         {
74           parser.push(TToken(TToken::CONTROL, buffer));
75           buffer.erase();
76           state = ESCAPE;
77         }
78       else if (ch == '#')
79         {
80           parser.push(TToken(TToken::CONTROL, buffer));
81           buffer.erase();
82           state = PARAMETER;
83         }
84       else if (ch == '\b')
85         {
86           buffer.erase(buffer.length() - 1, 1);
87           if (buffer.length() == 0) state = ESCAPE;
88         }
89       else if (isalpha(ch))
90         buffer.push_back(ch);
91       else
92         {
93           parser.push(TToken(TToken::CONTROL, buffer));
94           buffer.erase();
95           if (isspace(ch)) state = IGNORE_SPACE;
96           else transaction(ch, ACCEPT);
97         }
98       break;
99     case IGNORE_SPACE:
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);
105       break;
106     case PARAMETER:
107       parser.push(TToken(TToken::PARAMETER, ch));
108       state = ACCEPT;
109       break;
110     default:
111       assert(0);
112       break;
113     }
114
115   switch (state)
116     {
117     case ESCAPE: parser.setCursor("\\"); break;
118     case MACRO: parser.setCursor("\\" + buffer); break;
119     case PARAMETER: parser.setCursor("#"); break;
120     default: parser.setCursor("?"); break;
121     }
122 }
123
124 bool
125 TPushLexer::error() const
126 {
127   return false;
128 }