You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
4.4 KiB

#ifndef _RSGTOKEN_HPP
#define _RSGTOKEN_HPP
/*-------------------------------------------------------------------------
* drawElements Quality Program Random Shader Generator
* ----------------------------------------------------
*
* Copyright 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief Token class.
*//*--------------------------------------------------------------------*/
#include "rsgDefs.hpp"
#include <vector>
namespace rsg
{
class Token
{
public:
enum Type
{
IDENTIFIER,
STRUCT,
INVARIANT,
PRECISION,
VOID,
BREAK,
CONTINUE,
DO,
WHILE,
ELSE,
FOR,
IF,
DISCARD,
RETURN,
INC_OP,
DEC_OP,
LEFT_PAREN,
RIGHT_PAREN,
LEFT_BRACKET, // [
RIGHT_BRACKET, // ]
LEFT_BRACE, // {
RIGHT_BRACE, // }
DOT,
COMMA,
COLON,
SEMICOLON,
MINUS,
PLUS,
MUL,
DIV,
MOD,
QUESTION,
BOOL,
BVEC2,
BVEC3,
BVEC4,
INT,
IVEC2,
IVEC3,
IVEC4,
FLOAT,
VEC2,
VEC3,
VEC4,
MAT2,
MAT3,
MAT4,
SAMPLER2D,
SAMPLERCUBE,
FLOAT_LITERAL,
INT_LITERAL,
BOOL_LITERAL,
EQUAL,
MUL_ASSIGN,
DIV_ASSIGN,
ADD_ASSIGN,
SUB_ASSIGN,
CMP_LT,
CMP_GT,
CMP_LE,
CMP_GE,
CMP_EQ,
CMP_NE,
LOGICAL_AND,
LOGICAL_OR,
LOGICAL_NOT,
LOGICAL_XOR,
ATTRIBUTE,
UNIFORM,
VARYING,
CONST,
FLAT,
HIGH_PRECISION,
MEDIUM_PRECISION,
LOW_PRECISION,
IN,
OUT,
INOUT,
LAYOUT,
LOCATION,
// Formatting only
INDENT_INC,
INDENT_DEC,
NEWLINE,
TYPE_LAST
};
Token (void);
Token (Type type);
Token (const char* identifier);
Token (float value);
Token (int value);
Token (bool value);
Token (const Token& other);
~Token (void);
inline bool operator== (Type type) const { return m_type == type; }
inline bool operator!= (Type type) const { return m_type != type; }
bool operator== (const Token& other) const;
bool operator!= (const Token& other) const;
Token& operator= (const Token& other);
inline Type getType (void) const { return m_type; }
const char* getIdentifier (void) const;
float getFloat (void) const;
int getInt (void) const;
bool getBool (void) const;
private:
Type m_type;
union
{
char* identifier;
float floatValue;
int intValue;
bool boolValue;
} m_arg;
};
inline Token::Token (void)
: m_type(TYPE_LAST)
{
m_arg.identifier = DE_NULL;
}
inline Token::Token (Type type)
: m_type(type)
{
DE_ASSERT(type != IDENTIFIER);
}
inline Token::Token (float value)
: m_type(FLOAT_LITERAL)
{
m_arg.floatValue = value;
}
inline Token::Token (int value)
: m_type(INT_LITERAL)
{
m_arg.intValue = value;
}
inline Token::Token (bool value)
: m_type(BOOL_LITERAL)
{
m_arg.boolValue = value;
}
inline bool Token::operator== (const Token& other) const
{
return !(*this != other);
}
inline const char* Token::getIdentifier (void) const
{
DE_ASSERT(m_type == IDENTIFIER);
return m_arg.identifier;
}
inline float Token::getFloat (void) const
{
DE_ASSERT(m_type == FLOAT_LITERAL);
return m_arg.floatValue;
}
inline int Token::getInt (void) const
{
DE_ASSERT(m_type == INT_LITERAL);
return m_arg.intValue;
}
inline bool Token::getBool (void) const
{
DE_ASSERT(m_type == BOOL_LITERAL);
return m_arg.boolValue;
}
class TokenStream
{
public:
TokenStream (void);
~TokenStream (void);
int getSize (void) const { return (int)m_numTokens; }
const Token& operator[] (int ndx) const { return m_tokens[ndx]; }
TokenStream& operator<< (const Token& token);
private:
enum
{
ALLOC_SIZE = 64
};
std::vector<Token> m_tokens;
size_t m_numTokens;
};
inline TokenStream& TokenStream::operator<< (const Token& token)
{
if (m_tokens.size() == m_numTokens)
m_tokens.resize(m_numTokens+ALLOC_SIZE);
m_tokens[m_numTokens] = token;
m_numTokens += 1;
return *this;
}
} // rsg
#endif // _RSGTOKEN_HPP