]> matita.cs.unibo.it Git - helm.git/blob - helm/DEVEL/mathml_editor/src/TPushLexer.cc
Initial revision
[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 transaction(ch, ACCEPT);
53       break;
54     case ESCAPE:
55       if (isalpha(ch))
56         {
57           buffer.push_back(ch);
58           state = MACRO;
59         }
60       else
61         {
62           parser.push(TToken(TToken::CONTROL, ch));
63           state = ACCEPT;
64         }
65       break;
66     case MACRO:
67       if (ch == '\\')
68         {
69           parser.push(TToken(TToken::CONTROL, buffer));
70           buffer.erase();
71           state = ESCAPE;
72         }
73       else if (ch == '#')
74         {
75           parser.push(TToken(TToken::CONTROL, buffer));
76           buffer.erase();
77           state = PARAMETER;
78         }
79       else if (isalpha(ch))
80         buffer.push_back(ch);
81       else
82         {
83           parser.push(TToken(TToken::CONTROL, buffer));
84           buffer.erase();
85           if (isspace(ch)) state = IGNORE_SPACE;
86           else transaction(ch, ACCEPT);
87         }
88       break;
89     case IGNORE_SPACE:
90       if (ch == '\\') state = ESCAPE;
91       else if (ch == '#') state = PARAMETER;
92       else if (isspace(ch)) ;
93       else transaction(ch, ACCEPT);
94       break;
95     case PARAMETER:
96       parser.push(TToken(TToken::PARAMETER, ch));
97       state = ACCEPT;
98       break;
99     default:
100       assert(0);
101       break;
102     }
103
104   switch (state)
105     {
106     case ESCAPE: parser.setCursor("\\"); break;
107     case MACRO: parser.setCursor("\\" + buffer); break;
108     case PARAMETER: parser.setCursor("#"); break;
109     default: parser.setCursor("?"); break;
110     }
111 }
112
113 bool
114 TPushLexer::error() const
115 {
116   return false;
117 }