102 lines
2.9 KiB
C++
102 lines
2.9 KiB
C++
/*
|
|
* File: ElftosbLexer.h
|
|
*
|
|
* Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
|
|
* See included license file for license details.
|
|
*/
|
|
|
|
// This header just wraps the standard flex C++ header to make it easier to include
|
|
// without having to worry about redefinitions of the class name every time.
|
|
|
|
#if !defined(_ElftosbLexer_h_)
|
|
#define _ElftosbLexer_h_
|
|
|
|
#include "ElftosbAST.h"
|
|
#include "FlexLexer.h"
|
|
#include "elftosb_parser.tab.hpp"
|
|
#include <vector>
|
|
#include <string>
|
|
#include <stdexcept>
|
|
#include "Blob.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace elftosb
|
|
{
|
|
/*!
|
|
* \brief Exception class for syntax errors.
|
|
*/
|
|
class syntax_error : public std::runtime_error
|
|
{
|
|
public:
|
|
explicit syntax_error(const std::string &__arg)
|
|
: std::runtime_error(__arg)
|
|
{
|
|
}
|
|
};
|
|
|
|
/*!
|
|
* \brief Exception class for lexical errors.
|
|
*/
|
|
class lexical_error : public std::runtime_error
|
|
{
|
|
public:
|
|
explicit lexical_error(const std::string &__arg)
|
|
: std::runtime_error(__arg)
|
|
{
|
|
}
|
|
};
|
|
|
|
/*!
|
|
* \brief Lexical scanner class for elftosb command files.
|
|
*
|
|
* This class is a subclass of the standard C++ lexer class produced by
|
|
* Flex. It's primary purpose is to provide a clean way to report values
|
|
* for symbols, without using the yylval global. This is necessary because
|
|
* the parser produced by Bison is a "pure" parser.
|
|
*
|
|
* In addition, this class manages a list of source names generated by
|
|
* parsing. The lexer uses this list to determine if an identifier is
|
|
* a source name or a constant identifier.
|
|
*/
|
|
class ElftosbLexer : public yyFlexLexer
|
|
{
|
|
public:
|
|
//! \brief Constructor.
|
|
ElftosbLexer(istream &inputStream);
|
|
|
|
//! \brief Lexer interface. Returns one token.
|
|
virtual int yylex();
|
|
|
|
//! \brief Returns the value for the most recently produced token in \a value.
|
|
virtual void getSymbolValue(YYSTYPE *value);
|
|
|
|
//! \brief Returns the current token's location in \a loc.
|
|
inline token_loc_t &getLocation() { return m_location; }
|
|
//! \name Source names
|
|
//@{
|
|
void addSourceName(std::string *ident);
|
|
bool isSourceName(std::string *ident);
|
|
//@}
|
|
|
|
protected:
|
|
YYSTYPE m_symbolValue; //!< Value for the current token.
|
|
int m_line; //!< Current line number.
|
|
token_loc_t m_location; //!< Location for the current token.
|
|
Blob *m_blob; //!< The binary object value as its being constructed.
|
|
int m_blobFirstLine; //!< Line number for the first character of a blob.
|
|
|
|
typedef std::vector<std::string> string_vector_t;
|
|
string_vector_t m_sources; //!< Vector of source identifiers;
|
|
|
|
//! \brief Throw an elftosb::lexical_error exception.
|
|
virtual void LexerError(const char *msg);
|
|
|
|
//! \brief Process a string containing escape sequences.
|
|
int processStringEscapes(const char *in, char *out);
|
|
};
|
|
|
|
}; // namespace elftosb
|
|
|
|
#endif // _ElftosbLexer_h_
|