145 lines
6.3 KiB
C++
145 lines
6.3 KiB
C++
#ifndef EXPRESSION_H
|
|
#define EXPRESSION_H
|
|
|
|
#include <vector>
|
|
#include <functional>
|
|
|
|
|
|
#define MATH_PI 3.1415926535897932384626433832795028
|
|
|
|
|
|
namespace Expression
|
|
{
|
|
enum ExpressionType {IsInvalid=0x8000, HasNumbers=0x0000, HasStrings=0x0001, HasStrConsts=0x0002, HasStrVars=0x0004, HasStringKeywords=0x0008, IsStringExpression=0x000F,
|
|
HasOperators=0x0010, HasIntConsts=0x0020, HasIntVars=0x0040, HasPragmas=0x0080, HasKeywords=0x0100, HasFunctions=0x0200, HasOptimisedPrint=0x0400};
|
|
enum NumericType {BadBase=-1, Decimal, HexaDecimal, Octal, Binary};
|
|
enum CCType {BooleanCC, NormalCC, FastCC};
|
|
enum OPType {EqOP, NeOP, LeOP, GeOP, LtOP, GtOP};
|
|
enum Int16Byte {Int16Both, Int16Low, Int16High};
|
|
enum VarType {Number, String, Constant, TmpVar, IntVar16, Arr1Var8, Arr2Var8, Arr3Var8, Arr1Var16, Arr2Var16, Arr3Var16, StrVar, Str2Var, StrAddr, TmpStrVar, TmpStrAddr};
|
|
enum TokType {Invalid, Literal, Variable, Array};
|
|
|
|
|
|
struct Numeric
|
|
{
|
|
Numeric()
|
|
{
|
|
_value = 0.0; _index = -1; _isValid = false; _staticInit = false; _relocatable = false; _varType = Number; _ccType = BooleanCC; _int16Byte = Int16Both; _name = ""; _text = "";
|
|
}
|
|
|
|
Numeric(bool staticInit) : Numeric()
|
|
{
|
|
_staticInit = staticInit;
|
|
}
|
|
|
|
Numeric(double value, int16_t index, bool isValid, bool staticInit, bool relocatable, VarType varType, CCType ccType, Int16Byte int16Byte, const std::string& name, const std::string& text)
|
|
{
|
|
_value = value; _index = index; _isValid = isValid; _staticInit = staticInit; _relocatable = relocatable; _varType = varType; _ccType = ccType; _int16Byte = int16Byte; _name = name; _text = text;
|
|
}
|
|
|
|
double _value = 0.0;
|
|
int16_t _index = -1;
|
|
bool _isValid = false;
|
|
bool _staticInit = false;
|
|
bool _relocatable = false;
|
|
VarType _varType = Number;
|
|
CCType _ccType = BooleanCC;
|
|
Int16Byte _int16Byte = Int16Both;
|
|
std::string _name;
|
|
std::string _text;
|
|
std::vector<Numeric> _params;
|
|
int _nestedCount = 0;
|
|
bool _returnAddress = false;
|
|
};
|
|
|
|
using exprFuncPtr = std::function<Numeric (bool)>;
|
|
|
|
template <typename T> int sgn(T val)
|
|
{
|
|
return (T(0) < val) - (val < T(0));
|
|
}
|
|
|
|
|
|
Numeric& getOutputNumeric(void);
|
|
bool getEnableOptimisedPrint(void);
|
|
|
|
void setExprFunc(exprFuncPtr exprFunc);
|
|
void setEnableOptimisedPrint(bool enableOptimisedPrint);
|
|
|
|
|
|
void initialise(void);
|
|
|
|
bool isNumber(const std::string& input);
|
|
ExpressionType isExpression(const std::string& input);
|
|
TokType isVarNameValid(const std::string& varName);
|
|
TokType isStrNameValid(const std::string& strName);
|
|
bool isLabNameValid(const std::string& labName);
|
|
bool isStringValid(const std::string& input);
|
|
bool hasOnlyWhiteSpace(const std::string& input);
|
|
void isInComment(const std::string& input, int index, bool& output);
|
|
|
|
std::string::const_iterator findNonStringEquals(const std::string& input);
|
|
std::string::const_iterator findNonStringColon(const std::string& input);
|
|
std::string::const_iterator findNonStringBracket(const std::string& input, int bra);
|
|
void stripNonStringWhitespace(std::string& input);
|
|
void stripWhitespace(std::string& input);
|
|
bool stripChars(std::string& input, const std::string& chars);
|
|
std::string stripStrings(const std::string& input);
|
|
std::string stripStrings(const std::string& input, std::vector<std::string>& strings, bool saveExtraFields=false);
|
|
void trimWhitespace(std::string& input);
|
|
std::string collapseWhitespace(const std::string& input);
|
|
std::string collapseWhitespaceNotStrings(const std::string& input);
|
|
std::string removeCommentsNotInStrings(const std::string& input);
|
|
void padString(std::string &str, int num, char pad=' ');
|
|
void addString(std::string &str, int num, char add=' ');
|
|
int tabbedStringLength(const std::string& input, int tabSize);
|
|
void operatorReduction(std::string& input);
|
|
bool findMatchingBrackets(const std::string& input, size_t start, size_t& lbra, size_t& rbra, char obra='(');
|
|
bool findMatchingBrackets(const std::string& input, size_t start, size_t& lbra, size_t& rbra, char obra, std::string& name, int& paramNum);
|
|
|
|
std::string byteToHexString(uint8_t n);
|
|
std::string wordToHexString(uint16_t n);
|
|
std::string strLower(const std::string& s);
|
|
std::string strUpper(const std::string& s);
|
|
std::string& strToLower(std::string& s);
|
|
std::string& strToUpper(std::string& s);
|
|
std::string getSubAlpha(const std::string& s);
|
|
|
|
NumericType getBase(const std::string& input, long& result);
|
|
bool stringToI8(const std::string& token, int8_t& result);
|
|
bool stringToU8(const std::string& token, uint8_t& result);
|
|
bool stringToI16(const std::string& token, int16_t& result);
|
|
bool stringToU16(const std::string& token, uint16_t& result);
|
|
void stringToDouble(const std::string& token, double& result);
|
|
|
|
std::vector<std::string> tokeniseMulti(const std::string& text, const std::string& delimiterStr, bool toUpper=false);
|
|
std::vector<std::string> tokenise(const std::string& text, char c, bool skipSpaces=true, bool toUpper=false);
|
|
std::vector<std::string> tokeniseOffsets(const std::string& text, char c, std::vector<size_t>& offsets, bool skipSpaces=true, bool toUpper=false);
|
|
std::vector<std::string> tokeniseLine(const std::string& line, const std::string& delimiterStr=" \n\r\f\t\v");
|
|
std::vector<std::string> tokeniseLineOffsets(const std::string& line, const std::string& delimiterStr, std::vector<size_t>& offsets);
|
|
|
|
void replaceText(std::string& expression, const std::string& text, const std::string& replace, size_t offset=0);
|
|
|
|
char* getExpression(void);
|
|
const char* getExpressionToParse(void);
|
|
std::string& getExpressionToParseString(void);
|
|
int getLineNumber(void);
|
|
|
|
void setExpression(const std::string& expression, intptr_t n=0);
|
|
|
|
char peek(void);
|
|
char get(void);
|
|
void save(void);
|
|
void restore(void);
|
|
bool advance(intptr_t n);
|
|
|
|
bool find(const std::string& text);
|
|
bool findFunc(const std::string& text);
|
|
|
|
bool number(int16_t& value);
|
|
Numeric expression(bool returnAddress=false);
|
|
bool parse(const std::string& expression, int lineNumber, Numeric& numeric);
|
|
}
|
|
|
|
#endif
|