/*---------------------------------*- C++ -*---------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . @file wmkdependParser.atg Description An attributed Coco/R grammar to parse C/C++, Fortran and Java files for include and import statements. SourceFiles generated \*---------------------------------------------------------------------------*/ // This file was generated with Coco/R C++ (10 Mar 2010) // http://www.ssw.uni-linz.ac.at/coco/ // with these defines: // - FORCE_UTF8 #ifndef COCO_wmkdependSCANNER_H__ #define COCO_wmkdependSCANNER_H__ #include #include #include #include #include #include #include namespace wmake { // * * * * * * * * * * * Miscellaneous String Routines * * * * * * * * * * * // //! Simple lower-case string transformation template inline void coco_string_toLower(StringT& str) { for ( typename StringT::iterator iter = str.begin(); iter != str.end(); ++iter ) { if (*iter >= 'A' && *iter <= 'Z') { *iter += ('a' - 'A'); // lower-case } } } //! Simple string hashing function template inline int coco_string_hash(const StringT& str) { int h = 0; for ( typename StringT::const_iterator iter = str.begin(); iter != str.end(); ++iter ) { h = (h * 7) ^ *iter; } return h < 0 ? -h : h; } // // String conversions // ~~~~~~~~~~~~~~~~~~ //! Convert wide string to double inline double coco_string_toDouble(const wchar_t* str) { return str ? wcstod(str, NULL) : 0; } //! Convert wide string to long inline long coco_string_toLong(const wchar_t* str) { return str ? wcstol(str, NULL, 10) : 0; } //! A byte string (restricted to 8bit values) by copying str std::string coco_stdString(const wchar_t* str); //! A byte string (restricted to 8bit values) by copying str, //! up to length characters long std::string coco_stdString(const wchar_t* str, unsigned length); //! A byte substring (restricted to 8bit values) of str, //! starting at index and length characters long std::string coco_stdString(const wchar_t* str, unsigned index, unsigned length); //! A UTF8 byte string by copying str std::string coco_stdStringUTF8(const wchar_t* str); //! A UTF8 byte string by copying str, up to length characters long std::string coco_stdStringUTF8(const wchar_t* str, unsigned length); //! A UTF8 byte substring, starting at index and length characters long std::string coco_stdStringUTF8(const wchar_t* str, unsigned index, unsigned length); // * * * * * * * * * * * * End of String Routines * * * * * * * * * * * * * // /*---------------------------------------------------------------------------*\ Class Token Declaration \*---------------------------------------------------------------------------*/ /*! * @brief Scanner Token * * @note since each Token is allocated by the internal heap mechanism, * the destructor does not clean up the val member. */ class Token { public: int kind; //!< token kind int pos; //!< token position in the source text (starting at 0) int col; //!< token column (starting at 1) int line; //!< token line (starting at 1) wchar_t* val; //!< token value (normally allocated from the internal heap) Token *next; //!< Peek tokens are kept in linked list int length() const; //!< The length of val, or 0 if val is NULL //! Construct null Token, optionally with pointer to a string value Token(wchar_t* value = 0); ~Token(); //!< Destructor - does not cleanup val member //! Token val as byte string (restricted to 8bit values) inline std::string toString() const { return coco_stdString(val); } //! Token val as byte string (restricted to 8bit values), up to length characters long inline std::string toString(unsigned length) const { return coco_stdString(val, length); } //! Token val as byte string (restricted to 8bit values), starting at index and length characters long inline std::string toString(unsigned index, unsigned length) const { return coco_stdString(val, index, length); } //! Token val as UTF8 byte string inline std::string toStringUTF8() const { return coco_stdStringUTF8(val); } //! Token val as UTF8 byte string, up to length characters long inline std::string toStringUTF8(unsigned length) const { return coco_stdStringUTF8(val, length); } //! Token val as UTF8 byte substring, starting at index and length characters long inline std::string toStringUTF8(unsigned index, unsigned length) const { return coco_stdStringUTF8(this->val, index, length); } }; /*---------------------------------------------------------------------------*\ Class Buffer Declaration \*---------------------------------------------------------------------------*/ /*! * @brief Scanner Buffer * * This Buffer supports the following cases: * -# seekable stream (file) * -# whole stream in buffer * -# part of stream in buffer * -# non seekable stream (network, console) */ class Buffer { unsigned char *buf; //!< input buffer int bufCapacity; //!< capacity of buf int bufLen; //!< length of buffer int bufPos; //!< current position in buffer int bufStart; //!< position of first byte in buffer relative to input stream int fileLen; //!< length of input stream (may change if the stream is no file) FILE* cStream; //!< input stdio stream (normally seekable) std::istream* stdStream; //!< STL std stream (seekable) bool isUserStream_; //!< was the stream opened by the user? int ReadNextStreamChunk(); bool CanSeek() const; //!< true if stream can be seeked otherwise false protected: Buffer(Buffer*); //!< for the UTF8Buffer public: //! max unicode characters is 0xFFFF (16bit storage) static const int MaxChar = 65535; static const int EoF = MaxChar + 1; //! Copy buffer contents from constant character string Buffer(const char* chars, int len); //! Copy buffer contents from constant character string Buffer(const unsigned char* chars, int len); //! @brief Attach buffer to a stdio stream. //! User streams are not closed in the destructor Buffer(FILE*, bool isUserStream = true); //! @brief Attach buffer to an STL standard stream //! User streams are not closed in the destructor explicit Buffer(std::istream*, bool isUserStream = true); //! Close stream (but not user streams) and free buf (if any) virtual ~Buffer(); virtual void Close(); //!< Close stream (but not user streams) virtual int Read(); //!< Get character from stream or buffer virtual int Peek(); //!< Peek character from stream or buffer virtual int GetPos() const; virtual void SetPos(int value); virtual bool isUTF8() const; //!< Return false - buffer is not UTF8 }; /*---------------------------------------------------------------------------*\ Class UTF8Buffer Declaration \*---------------------------------------------------------------------------*/ //! A Scanner Buffer variant that decodes UTF-8 characters into 16bit unicode class UTF8Buffer : public Buffer { public: UTF8Buffer(Buffer* b) : Buffer(b) {} virtual int Read(); virtual bool isUTF8() const; //!< Return true - buffer is UTF8 }; /*---------------------------------------------------------------------------*\ Class StartStates Declaration \*---------------------------------------------------------------------------*/ //! maps characters (integers) to start states of tokens as a HashTable class StartStates { //! HashTable entry struct Entry { int key; //next; delete e; e = next; } } delete[] table_; } void set(int key, int val) { const int hashIndex = unsigned(key) % size_; table_[hashIndex] = new Entry(key, val, table_[hashIndex]); } int state(int key) { Entry *e = table_[unsigned(key) % size_]; while (e && e->key != key) e = e->next; return e ? e->val : 0; } }; /*---------------------------------------------------------------------------*\ Class KeywordMap Declaration \*---------------------------------------------------------------------------*/ //! maps strings to integers (identifiers to keyword kinds) as a HashTable class KeywordMap { //! HashTable entry struct Entry { const std::wstring key; //next; delete e; e = next; } } delete[] table_; } void set(const std::wstring& key, int val) { const int hashIndex = coco_string_hash(key) % size_; table_[hashIndex] = new Entry(key, val, table_[hashIndex]); } int get(const std::wstring& key, int defaultVal) { Entry *e = table_[coco_string_hash(key) % size_]; while (e && e->key != key) e = e->next; return e ? e->val : defaultVal; } }; /*---------------------------------------------------------------------------*\ Class Scanner Declaration \*---------------------------------------------------------------------------*/ //! A Coco/R Scanner class Scanner { static const int maxT = 10; static const int noSym = 10; static const int eofSym = 0; //!< end-of-file token id static const char EOL = '\n'; //!< end-of-line character void *firstHeap; //!< the start of the heap management void *heap; //!< the currently active block void *heapTop; //!< the top of the heap void **heapEnd; //!< the end of the last heap block StartStates start; //!< A map of start states for particular characters KeywordMap keywords; //!< A hash of keyword literals to token kind Token *t; //!< current token wchar_t *tval; //!< text of current token int tvalLength; //!< maximum capacity (length) for tval int tlen; //!< length of tval Token *tokens; //!< list of tokens already peeked (first token is a dummy) Token *pt; //!< current peek token int ch; //!< current input character int pos; //!< byte position of current character int line; //!< line number of current character int col; //!< column number of current character int oldEols; //!< the number of EOLs that appeared in a comment void CreateHeapBlock(); //!< add a heap block, freeing unused ones Token* CreateToken(); //!< fit token on the heap void AppendVal(Token* tok); //!< adjust tok->val to point to the heap and copy tval into it void SetScannerBehindT(); void Init(); //!< complete the initialization for the constructors void NextCh(); //!< get the next input character into ch void AddCh(); //!< append the character ch to tval bool Comment0(); bool Comment1(); Token* NextToken(); //!< get the next token public: //! The scanner buffer Buffer *buffer; //! Attach scanner to an existing character buffer Scanner(const char* chars, int len); //! Attach scanner to an existing character buffer Scanner(const unsigned char* chars, int len); //! Attach scanner to an existing open file handle Scanner(FILE*); #ifdef _WIN32 //! Open a file for reading and attach scanner - Windows only explicit Scanner(const std::wstring& fileName); #endif //! Open a file for reading and attach scanner explicit Scanner(const std::string& fileName); //! Attach scanner to an existing open STL standard stream explicit Scanner(std::istream&); ~Scanner(); //!< free heap and allocated memory Token* Scan(); //!< get the next token (possibly a token already seen during peeking) Token* Peek(); //!< peek for the next token, ignore pragmas void ResetPeek(); //!< ensure that peeking starts at the current scan position int Line() const; //!< Return the current line void Line(int lineNo); //!< Define the starting line for reporting errors }; // end Scanner } // End namespace #endif // COCO_wmkdependSCANNER_H__ // ************************************************************************* //