forked from MirrorRepos/RomWBW
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.
122 lines
6.0 KiB
122 lines
6.0 KiB
//////////////////////////////////////////////////////////////
|
|
// //
|
|
// Propeller Spin/PASM Compiler //
|
|
// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. //
|
|
// Adapted from Chip Gracey's x86 asm code by Roy Eltham //
|
|
// See end of file for terms of use. //
|
|
// //
|
|
//////////////////////////////////////////////////////////////
|
|
//
|
|
// Elementizer.h
|
|
//
|
|
|
|
#ifndef _ELEMENTIZER_H_
|
|
#define _ELEMENTIZER_H_
|
|
|
|
struct CompilerDataInternal;
|
|
class SymbolEngine;
|
|
class SymbolTableEntry;
|
|
|
|
const int state_stack_limit = 32;
|
|
|
|
class Elementizer
|
|
{
|
|
CompilerDataInternal* m_pCompilerData;
|
|
SymbolEngine* m_pSymbolEngine;
|
|
|
|
int m_sourceOffset;
|
|
unsigned char m_sourceFlags;
|
|
|
|
SymbolTableEntry* m_pSymbolEntry;
|
|
int m_type;
|
|
int m_value;
|
|
int m_value_2;
|
|
int m_opType;
|
|
int m_asm;
|
|
bool m_dual;
|
|
|
|
unsigned char m_backIndex;
|
|
int m_backOffsets[4];
|
|
unsigned char m_backFlags[4];
|
|
|
|
char m_currentSymbol[symbol_limit+2];
|
|
|
|
void SetFromSymbolEntry();
|
|
|
|
public:
|
|
Elementizer(CompilerDataInternal* pCompilerData, SymbolEngine* pSymbolEngine)
|
|
: m_pCompilerData(pCompilerData)
|
|
, m_pSymbolEngine(pSymbolEngine)
|
|
, m_sourceOffset(0)
|
|
, m_sourceFlags(0)
|
|
, m_backIndex(0)
|
|
{
|
|
for(int i = 0; i < 4; i++)
|
|
{
|
|
m_backOffsets[i] = 0;
|
|
m_backFlags[0] = 0;
|
|
}
|
|
}
|
|
|
|
void Reset(); // reset to start of source
|
|
|
|
bool GetNext(bool& bEof); // get the next element in source, returns true no error, bEof will be set to true if eof is hit
|
|
bool GetElement(int type); // if the next element is type, then return true, else false, retains value
|
|
bool CheckElement(int type); // check if next element is of the given type, if so return true, if not, backup and return false
|
|
bool GetNextBlock(int type, bool& bEof); // scan for the next block element of type, returns true if no error, , bEof will be set to true if eof is hit
|
|
bool FindSymbol(const char* symbol); // lookup a symbol in the symbol table and set it as the current element
|
|
void Backup(); // backup to the previous element
|
|
|
|
void BackupSymbol(); // copy the current symbol into g_pCompilerData->symbolBackup
|
|
|
|
int GetColumn(); // returns column of the element pointed to by g_pCompilerData->source_start
|
|
|
|
int GetSourcePtr() // used to save the current source pointer so it can be put back
|
|
{
|
|
return m_sourceOffset;
|
|
}
|
|
void SetSourcePtr(int value) // used to set the source pointer back to a previously saved value
|
|
{
|
|
m_sourceOffset = value;
|
|
}
|
|
|
|
int GetType() { return m_type; } // symbol's type
|
|
int GetValue() { return m_value; } // only valid if m_type != type_undefined
|
|
int GetValue2() { return m_value_2; } // only valid if m_type != type_undefined
|
|
int GetOpType() { return m_opType; } // only valid for operator symbols
|
|
int GetAsm() { return m_asm; } // only valid for dual symbols + op_log_and & op_log_or
|
|
bool IsDual() { return m_dual; } // true if is a dual symbol
|
|
char* GetCurrentSymbol() // returns the string for the symbol
|
|
{
|
|
return &(m_currentSymbol[0]);
|
|
}
|
|
int GetCurrentLineNumber(int &offsetToStartOfLine, int& offsetToEndOfLine);
|
|
|
|
bool SubToNeg(); // convert a sub to a neg
|
|
void ObjConToCon(); // convert type_objcon_xx to type_con_xx
|
|
void DatResToLong(); // convert type_dat_long_res to type_dat_long
|
|
bool NegConToCon(); // convert -constant to constant
|
|
};
|
|
|
|
#endif // _ELEMENTIZER_H_
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
// TERMS OF USE: MIT License //
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this //
|
|
// software and associated documentation files (the "Software"), to deal in the Software //
|
|
// without restriction, including without limitation the rights to use, copy, modify, //
|
|
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to //
|
|
// permit persons to whom the Software is furnished to do so, subject to the following //
|
|
// conditions: //
|
|
// //
|
|
// The above copyright notice and this permission notice shall be included in all copies //
|
|
// or substantial portions of the Software. //
|
|
// //
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, //
|
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A //
|
|
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT //
|
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION //
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE //
|
|
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. //
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
|