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
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
|