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