forked from teamnwah/openmw-tes3coop
added storage class for local variable declarations; added checks for variable re-declaration
parent
21e0182ae2
commit
0cfeab622d
@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
#include "locals.hpp"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace Compiler
|
||||||
|
{
|
||||||
|
const std::vector<std::string>& Locals::get (char type) const
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case 's': return mShorts;
|
||||||
|
case 'l': return mLongs;
|
||||||
|
case 'f': return mFloats;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw std::logic_error ("unknown variable type");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Locals::search (char type, const std::string& name) const
|
||||||
|
{
|
||||||
|
const std::vector<std::string>& collection = get (type);
|
||||||
|
|
||||||
|
return std::find (collection.begin(), collection.end(), name)!=collection.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>& Locals::get (char type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case 's': return mShorts;
|
||||||
|
case 'l': return mLongs;
|
||||||
|
case 'f': return mFloats;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw std::logic_error ("unknown variable type");
|
||||||
|
}
|
||||||
|
|
||||||
|
char Locals::getType (const std::string& name) const
|
||||||
|
{
|
||||||
|
if (search ('s', name))
|
||||||
|
return 's';
|
||||||
|
|
||||||
|
if (search ('l', name))
|
||||||
|
return 'l';
|
||||||
|
|
||||||
|
if (search ('f', name))
|
||||||
|
return 'f';
|
||||||
|
|
||||||
|
return ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
void Locals::declare (char type, const std::string& name)
|
||||||
|
{
|
||||||
|
get (type).push_back (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Locals::clear()
|
||||||
|
{
|
||||||
|
get ('s').clear();
|
||||||
|
get ('l').clear();
|
||||||
|
get ('f').clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef COMPILER_LOCALS_H_INCLUDED
|
||||||
|
#define COMPILER_LOCALS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Compiler
|
||||||
|
{
|
||||||
|
/// \brief Local variable declarations
|
||||||
|
|
||||||
|
class Locals
|
||||||
|
{
|
||||||
|
std::vector<std::string> mShorts;
|
||||||
|
std::vector<std::string> mLongs;
|
||||||
|
std::vector<std::string> mFloats;
|
||||||
|
|
||||||
|
const std::vector<std::string>& get (char type) const;
|
||||||
|
|
||||||
|
bool search (char type, const std::string& name) const;
|
||||||
|
|
||||||
|
std::vector<std::string>& get (char type);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
char getType (const std::string& name) const;
|
||||||
|
///< 's': short, 'l': long, 'f': float, ' ': does not exist.
|
||||||
|
|
||||||
|
void declare (char type, const std::string& name);
|
||||||
|
///< declares a variable.
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
///< remove all declarations.
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue