File indexing completed on 2024-04-21 04:36:08

0001 #ifndef OP2_TOKENSTREAM
0002 #define OP2_TOKENSTREAM
0003 
0004 #include "Op2parser.h"
0005 #include <kdebug.h>
0006 #include <QString>
0007 #include <kdev-pg-token-stream.h>
0008 
0009 namespace Op2
0010 {
0011 
0012 class TokenStream : public KDevPG::TokenStream
0013 {
0014     QString m_content;
0015 public:
0016     TokenStream(const QString& content) : m_content(content)
0017     {
0018         for(int i = 0; i != content.size(); ++i)
0019         {
0020             if(content[i] == ' ')
0021             {
0022                 continue;
0023             }
0024             
0025             Parser::Token &t = next();
0026             t.begin = i;if(content[i] == '\n')
0027             {
0028                 t.kind = Parser::Token_BR;
0029                 t.end = i;
0030             }
0031             else if(content.mid(i, 3) == "bin")
0032             {
0033                 t.kind = Parser::Token_BIN;
0034                 t.end = i + 2;
0035             }
0036             else if(content.mid(i, 4) == "tern")
0037             {
0038                 t.kind = Parser::Token_TERN;
0039                 t.end = i + 3;
0040             }
0041             else if(content.mid(i, 3) == "pre")
0042             {
0043                 t.kind = Parser::Token_PRE;
0044                 t.end = i + 2;
0045             }
0046             else if(content.mid(i, 4) == "post")
0047             {
0048                 t.kind = Parser::Token_POST;
0049                 t.end = i + 3;
0050             }
0051             else if(content.mid(i, 5) == "paren")
0052             {
0053                 t.kind = Parser::Token_PAREN;
0054                 t.end = i + 4;
0055             }
0056             else if(content.mid(i, 4) == "left")
0057             {
0058                 t.kind = Parser::Token_LEFT;
0059                 t.end = i + 3;
0060             }
0061             else if(content.mid(i, 5) == "right")
0062             {
0063                 t.kind = Parser::Token_RIGHT;
0064                 t.end = i + 4;
0065             }
0066             else if(content[i] >= '0' && content[i] <= '9')
0067             {
0068                 t.end = i + 1;
0069                 while(t.end != content.size() && content[(uint)t.end] >= '0' && content[(uint)t.end] <= '9')
0070                     ++t.end;
0071                 --t.end;
0072                 t.kind = Parser::Token_NUMBER;
0073             }
0074             else
0075             {
0076                 t.end = i;
0077                 t.kind = Parser::Token_OPERATOR;
0078             }
0079             i = t.end;
0080             kDebug() << t.kind << " " << t.begin << " " << t.end;
0081         }
0082         Parser::Token &t = next();
0083         t.begin = content.size();
0084         t.end = content.size() - 1;
0085         t.kind = Parser::Token_EOF;
0086         rewind(0);
0087     }
0088     inline QString tokenString(uint pos)
0089     {
0090         return m_content.mid(token(pos).begin, token(pos).end - token(pos).begin + 1);
0091     }
0092 };
0093 
0094 }
0095 
0096 #endif