#include "TokenStream.h" #include #include TokenPoint::TokenPoint(TokenStream& S) : Stream(S), Pos(S.Index) { } TokenPoint::~TokenPoint() { Stream.Index = Pos; } bool TokenPoint::accept() { Pos = Stream.Index; return true; } bool TokenPoint::reject() { Stream.Index = Pos; return false; } TokenStream::TokenStream() : Index(0), Errors(0) { } TokenStream::TokenStream(const std::string& Name) : Index(0), Errors(0) { char buffer[1024]; std::ifstream ifs(Name.c_str()); // better while (ifs) { ifs.get(buffer,1024,0); Content += std::string(buffer,ifs.gcount()); } Index = 0; for (unsigned int i=0, Line=0; i= Content.length()) || (Content[Index+i] != S[i]) ) return false; Index += S.length(); return true; } bool TokenStream::literal(char c) { if (Content[Index] == c) { ++Index; return true; } return false; } bool TokenStream::alpha() { char c = Content[Index]; if ( ( (c>='a') && (c<='z') ) || ( (c>='A') && (c<='Z') ) || (c=='_') ) { ++Index; return true; } return false; } bool TokenStream::numeric() { char c = Content[Index]; if ( (c>='0') && (c<='9') ) { ++Index; return true; } return false; } std::string TokenStream::cIdentifier() { whiteSpace(); unsigned int Start = Index; if (!alpha()) return ""; while (!eos()) { if (!alpha() && !numeric()) break; } return std::string(Content,Start,Index-Start); } std::string TokenStream::cToken() { whiteSpace(); if (eos()) return ""; if ( (Content[Index] == '(') || (Content[Index] == ')') || (Content[Index] == ',') || (Content[Index] == '.') ) { ++Index; return std::string(Content,Index-1,1); } if (Content[Index] == ':') { ++Index; if (!eos() && (Content[Index] == ':')) { ++Index; return std::string(Content,Index-2,2); } return std::string(Content,Index-1,1); } if (Content[Index] == '=') { ++Index; if (!eos() && (Content[Index] == '=')) { ++Index; return std::string(Content,Index-2,2); } return std::string(Content,Index-1,1); } std::string id = cIdentifier(); if (id != "") return id; ++Index; return std::string(Content,Index-1,1); } std::string TokenStream::cString() { whiteSpace(); if (eos()) return ""; if (Content[Index] != '"') return ""; std::string Result("\""); for (++Index; !eos(); ++Index) { if (Content[Index] == '"') { ++Index; if (eos() || (Content[Index] != '"') ) { --Index; break; } } Result += Content[Index]; } if (eos()) { error("Unended string"); return Result; } else ++Index; return Result; } std::string TokenStream::makeFileName() { whiteSpace(); if (eos()) return ""; std::string Result; if (Content[Index] == '"') { ++Index; while (!eos()) { ++Index; if (Content[Index-1] == '"') return Result; Result += Content[Index-1]; } return Result; } unsigned int Start = Index; while (!eos()) { if (alpha() || numeric() || literal('.') || literal('/') || /* literal(':') || */ literal('\\')) Result += Content[Index-1]; /* else if (literal('\\')) { if (eos() || (Content[Index] == 10) || (Content[Index] == 13)) { --Index; break; } Result += Content[Index]; ++Index; } */ else break; } return Result; }