]> matita.cs.unibo.it Git - helm.git/blob - helm/DEVEL/mathml_editor/src/TLexerPush.cc
Initial revision
[helm.git] / helm / DEVEL / mathml_editor / src / TLexerPush.cc
1
2 #include "TLexerPush.hh"
3
4 TLexerPush::TLexerPush()
5 {
6   state = ACCEPT;
7 }
8
9 TToken
10 TLexerPush::pop()
11 {
12   if (tokens.empty()) throw EmptyBuffer();
13   else
14     {
15       TToken res = tokens.front();
16       tokens.pop_front();
17       if (tokens.size() == 1 && state == CONTROL) state = ACCEPT;
18       return res;
19     }
20 }
21
22 TToken
23 TLexerPush::front() const
24 {
25   if (tokens.empty()) throw EmptyBuffer();
26   else return tokens.front();
27 }
28
29 bool
30 TLexerPush::empty() const
31 {
32   return tokens.empty();
33 }
34
35 bool
36 TLexerPush::pending() const
37 {
38   return state == ESCAPE;
39 }
40
41 bool
42 TLexerPush::ambiguous() const
43 {
44   return tokens.size() == 1 && state == CONTROL;
45 }
46
47 void
48 TLexerPush::push(TChar ch)
49 {
50   switch (state)
51     {
52     case ACCEPT:
53       if (ch == '\\') state = ESCAPE;
54       else tokens.push_back(TToken(ch));
55       break;
56     case ESCAPE:
57       tokens.push_back(TToken(TToken::CONTROL, std::string(1, ch)));
58       if (isUnicodeAlpha(ch)) state = CONTROL;
59       else state = ACCEPT;
60       break;
61     case CONTROL:
62       if (ch == '\\') state = ESCAPE;
63       else if (isUnicodeAlpha(ch))
64         {
65           assert(!tokens.empty());
66           TToken& tok = tokens.back();
67           tok.value.push_back(ch);
68         }
69       else if (isUnicodeSpace(ch)) state = IGNORE_SPACE;
70       else
71         {
72           tokens.push_back(TToken(ch));
73           state = ACCEPT;
74         }
75       break;
76     case IGNORE_SPACE:
77       if (ch == '\\') state = ESCAPE;
78       else if (isUnicodeSpace(ch)) ;
79       else tokens.push_back(TToken(ch));
80       break;
81     }
82 }