#include <stdio.h>
+#define yylloc _yylloc
+#include "grammar.h"
+#undef yylloc
+
+public enum TokenType
+{
+ identifier = IDENTIFIER,
+ constant = CONSTANT,
+ stringLiteral = STRING_LITERAL,
+ sizeOf = SIZEOF,
+ ptrOp = PTR_OP,
+ incOp = INC_OP,
+ decOp = DEC_OP,
+ leftOp = LEFT_OP,
+ rightOp = RIGHT_OP,
+ leOp = LE_OP,
+ geOp = GE_OP,
+ eqOp = EQ_OP,
+ neOp = NE_OP,
+ andOp = AND_OP,
+ orOp = OR_OP,
+ mulAssign = MUL_ASSIGN,
+ divAssign = DIV_ASSIGN,
+ modAssign = MOD_ASSIGN,
+ addAssign = ADD_ASSIGN,
+ subAssign = SUB_ASSIGN,
+ leftAssign = LEFT_ASSIGN,
+ rightAssign = RIGHT_ASSIGN,
+ andAssign = AND_ASSIGN,
+ xorAssign = XOR_ASSIGN,
+ orAssign = OR_ASSIGN,
+ typeName = TYPE_NAME,
+ _typedef = TYPEDEF,
+ _extern = EXTERN,
+ _static = STATIC,
+ _auto = AUTO,
+ _register = REGISTER,
+ _char = CHAR,
+ _short = SHORT,
+ _int = INT,
+ _uint = UINT,
+ _int64 = INT64,
+ _long = LONG,
+ _signed = SIGNED,
+ _unsigned = UNSIGNED,
+ _float = FLOAT,
+ _double = DOUBLE,
+ _const = CONST,
+ _volatile = VOLATILE,
+ _void = VOID,
+ _valist = VALIST,
+ _struct = STRUCT,
+ _union = UNION,
+ _enum = ENUM,
+ ellipsis = ELLIPSIS,
+ _case = CASE,
+ _default = DEFAULT,
+ _if = IF,
+ _switch = SWITCH,
+ _whilte = WHILE,
+ _do = DO,
+ _for = FOR,
+ _goto = GOTO,
+ _continue = CONTINUE,
+ _break = BREAK,
+ _return = RETURN,
+ ifx = IFX,
+ _else = ELSE,
+ _class = CLASS,
+ thisClass = THISCLASS,
+ className = CLASS_NAME,
+ _property = PROPERTY,
+ setProp = SETPROP,
+ getProp = GETPROP,
+ newOp = NEWOP,
+ _renew = RENEW,
+ _delete = DELETE,
+ _extDecl = EXT_DECL,
+ _extStorage = EXT_STORAGE,
+ _import = IMPORT,
+ _define = DEFINE,
+ _virtual = VIRTUAL,
+ attrib = ATTRIB,
+ _public = PUBLIC,
+ _priate = PRIVATE,
+ typedObject = TYPED_OBJECT,
+ anyObject = ANY_OBJECT,
+ _incref = _INCREF,
+ extension = EXTENSION,
+ ___asm = ASM,
+ _typeof = TYPEOF,
+ _watch = WATCH,
+ stopWatching = STOPWATCHING,
+ fireWatchers = FIREWATCHERS,
+ _watchable = WATCHABLE,
+ classDesigner = CLASS_DESIGNER,
+ classNoExpansion = CLASS_NO_EXPANSION,
+ classFixed = CLASS_FIXED,
+ isPropSet = ISPROPSET,
+ classDefaultProperty = CLASS_DEFAULT_PROPERTY,
+ propertyCategory = PROPERTY_CATEGORY,
+ classData = CLASS_DATA,
+ classProperty = CLASS_PROPERTY,
+ subClass = SUBCLASS,
+ nameSpace = NAMESPACE,
+ new0Op = NEW0OP,
+ renew0Op = RENEW0,
+ vaArg = VAARG,
+ dbTable = DBTABLE,
+ dbField = DBFIELD,
+ dbIndex = DBINDEX,
+ databaseOpen = DATABASE_OPEN,
+ alignOf = ALIGNOF,
+ attribDep = ATTRIB_DEP,
+ _attrib = __ATTRIB,
+ BOOL = BOOL,
+ _BOOL = _BOOL,
+ complex = _COMPLEX,
+ imaginary = _IMAGINARY,
+ _restrict = RESTRICT,
+ _thread = THREAD
+};
+
enum Order { ascending, descending };
public class DBTableDef : struct
public:
char * name;
Symbol symbol;
- OldList * definitions;
+ OldList * definitions;
AccessMode declMode;
}
File fileInput;
public void SetFileInput(File file) { fileInput = file; }
char * symbolsDir = null;
-public void SetSymbolsDir(char * s) {
+public void SetSymbolsDir(const char * s) {
delete symbolsDir;
symbolsDir = CopyString(s);
-} public char * GetSymbolsDir() { return symbolsDir ? symbolsDir : ""; }
-char * outputFile;
-public void SetOutputFile(char * s) { outputFile = s; } public char * GetOutputFile() { return outputFile; }
-char * sourceFile;
-public void SetSourceFile(char * s) { sourceFile = s; } public char * GetSourceFile() { return sourceFile; }
+} public const char * GetSymbolsDir() { return symbolsDir ? symbolsDir : ""; }
+const char * outputFile;
+public void SetOutputFile(const char * s) { outputFile = s; } public const char * GetOutputFile() { return outputFile; }
+const char * sourceFile;
+public void SetSourceFile(const char * s) { sourceFile = s; } public const char * GetSourceFile() { return sourceFile; }
+const char * i18nModuleName;
+public void SetI18nModuleName(const char * s) { i18nModuleName = s; } public const char * GetI18nModuleName() { return i18nModuleName; }
public void SetGlobalContext(Context context) { globalContext = context; } public Context GetGlobalContext() { return globalContext; }
public void SetTopContext(Context context) { topContext = context; } public Context GetTopContext() { return topContext; }
bool outputLineNumbers = true;
public void SetOutputLineNumbers(bool value) { outputLineNumbers = value; }
+public void FixModuleName(char *moduleName)
+{
+ ChangeCh(moduleName, '.', '_');
+ ChangeCh(moduleName, ' ', '_');
+ ChangeCh(moduleName, '-', '_');
+ ChangeCh(moduleName, '&', '_');
+}
+
+// todo support %var% variables for windows and $var for linux?
+public char * PassArg(char * output, const char * input)
+{
+#ifdef __WIN32__
+//define windowsFileNameCharsNeedEscaping = " !%&'()+,;=[]^`{}~"; // "#$-.@_" are ok
+ const char * escChars = " !\"%&'()+,;=[]^`{}~"; // windowsFileNameCharsNeedEscaping;
+ const char * escCharsQuoted = "\"";
+#else
+//define linuxFileNameCharsNeedEscaping = " !\"$&'()*:;<=>?[\\`{|"; // "#%+,-.@]^_}~" are ok
+ const char * escChars = " !\"$&'()*:;<=>?[\\`{|"; // linuxFileNameCharsNeedEscaping;
+ const char * escCharsQuoted = "\"()$";
+#endif
+ bool quoting = false;
+ char *o = output;
+ const char *i = input, *l = input;
+#ifdef __WIN32__
+ while(*l && !strchr(escChars, *l)) l++;
+ if(*l) quoting = true;
+#else
+ if(*i == '-')
+ {
+ l++;
+ while(*l && !strchr(escChars, *l)) l++;
+ if(*l) quoting = true;
+ *o++ = *i++;
+ }
+#endif
+ if(quoting)
+ *o++ = '\"';
+ while(*i)
+ {
+ if(strchr(quoting ? escCharsQuoted : escChars, *i))
+ *o++ = '\\';
+ *o++ = *i++;
+ }
+ if(quoting)
+ *o++ = '\"';
+ *o = '\0';
+ return o;
+}
/*public Module GetPrivateModule()
{
return privateModule;
{
public:
int line, charPos, pos;
- bool included;
+ int included;
void AdjustDelete(BufferLocation start, BufferLocation end)
{
if(line - 1 > end.y)
line -= end.y - start.y;
// Location is the last touched line
- else
+ else
{
if(charPos - 1 >= end.x)
{
if(charPos - 1 > start.x || (charPos - 1 == start.x /*&& (numLines ? true : false)*/))
{
line += numLines;
- //charPos - 1 += numLines ? end.x : (end.x - start.x);
+ //charPos - 1 += numLines ? end.x : (end.x - start.x);
charPos += end.x - start.x;
}
}
bool Inside(int line, int charPos)
{
- return (start.line < line || (start.line == line && start.charPos <= charPos)) &&
+ return (start.line < line || (start.line == line && start.charPos <= charPos)) &&
(end.line > line || (end.line == line && end.charPos >= charPos));
}
};
};
public enum ExpressionType
-{
+{
identifierExp, instanceExp, constantExp, stringExp, opExp,
bracketsExp, indexExp, callExp, memberExp, pointerExp, typeSizeExp,
castExp, conditionExp, newExp, renewExp, classSizeExp,
- dummyExp, dereferenceErrorExp, symbolErrorExp, classMemberSymbolErrorExp,
- structMemberSymbolErrorExp, memoryErrorExp, unknownErrorExp,
- noDebuggerErrorExp, debugStateErrorExp,
+ dummyExp, dereferenceErrorExp, symbolErrorExp,
+ memberSymbolErrorExp, memoryErrorExp, unknownErrorExp,
+ noDebuggerErrorExp,
extensionCompoundExp, classExp, classDataExp, new0Exp, renew0Exp,
dbopenExp, dbfieldExp, dbtableExp, dbindexExp, extensionExpressionExp, extensionInitializerExp,
- vaArgExp, arrayExp, typeAlignExp
+ vaArgExp, arrayExp, typeAlignExp,
+ memberPropertyErrorExp, functionCallErrorExp, divideBy0ErrorExp
};
public enum MemberType
public:
TemplateParameter prev, next;
Location loc;
-
+
TemplateParameterType type;
Identifier identifier;
union
TemplateMemberType memberType; // For identifier
};
TemplateArgument defaultArgument;
-
+
// For type parameters
- char * dataTypeString;
+ const char * dataTypeString;
Type baseType;
}
public:
TemplateArgument prev, next;
Location loc;
-
+
Identifier name;
TemplateParameterType type;
union
Identifier id;
OldList * list;
OldList * baseSpecs;
- OldList * definitions;
+ OldList/*<ClassDef>*/ * definitions;
bool addNameSpace;
Context ctx;
ExtDecl extDeclStruct;
};
Statement compound;
Instantiation instance;
- char * string;
+ struct
+ {
+ char * string;
+ bool intlString;
+ };
OldList * list;
struct
{
bool addedThis;
bool needCast;
bool thisPtr;
+ bool opDestType;
void Clear()
{
addedThis = false;
needCast = false;
thisPtr = false;
+ opDestType = false;
}
};
public enum DeclaratorType
{
- structDeclarator, identifierDeclarator, bracketsDeclarator, arrayDeclarator,
+ structDeclarator, identifierDeclarator, bracketsDeclarator, arrayDeclarator,
functionDeclarator, pointerDeclarator, extendedDeclarator, extendedDeclaratorEnd
};
OldList * list;
};
bool isConstant;
+ Identifier id;
};
public class InitDeclarator : struct
Location loc;
char * command;
Expression expression;
+ Identifier symbolic;
};
public enum StmtType { labeledStmt, caseStmt, compoundStmt,
- expressionStmt, ifStmt, switchStmt, whileStmt, doWhileStmt,
+ expressionStmt, ifStmt, switchStmt, whileStmt, doWhileStmt,
forStmt, gotoStmt, continueStmt, breakStmt, returnStmt, asmStmt, badDeclarationStmt,
fireWatchersStmt, stopWatchingStmt, watchStmt, forEachStmt
};
{
OldList * exp;
Statement stmt;
- Statement elseStmt;
+ Statement elseStmt;
} ifStmt;
struct
{
Class _class;
OldList attached; // For IDE
AccessMode declMode;
-
+
// COMPILING DATA
Type type;
Symbol propSet;
};
public enum ClassDefType
-{
+{
functionClassDef, defaultPropertiesClassDef, declarationClassDef, propertyClassDef,
propertyWatchClassDef, classDesignerClassDef, classNoExpansionClassDef, classFixedClassDef,
designerDefaultPropertyClassDef, classDataClassDef, classPropertyClassDef, classPropertyValueClassDef,
Statement setStmt;
Statement issetStmt;
Symbol symbol;
- bool conversion;
- bool isWatchable;
Expression category;
+ struct
+ {
+ bool conversion:1;
+ bool isWatchable:1;
+ bool isDBProp:1;
+ };
};
public class ClassDef : struct
char * constructorName, * structName, * className, * destructorName;
ModuleImport module;
- ClassImport _import;
+ ClassImport _import;
Location nameLoc;
bool isParam;
bool isRemote;
OldList methods;
OldList properties;
bool itself;
- bool isRemote;
+ int isRemote;
};
public class FunctionImport : struct
// For the .sym file:
public enum TypeKind
-{
+{
voidType, charType, shortType, intType, int64Type, longType, floatType,
doubleType, classType, structType, unionType, functionType, arrayType, pointerType,
ellipsisType, enumType, methodType, vaListType, /*typedObjectType, anyObjectType, classPointerType, */ dummyType,
- subClassType, templateType, thisClassType, intPtrType
+ subClassType, templateType, thisClassType, intPtrType, intSizeType, _BoolType
};
public class Type : struct
struct
{
Method method;
- Class methodClass;
+ Class methodClass; // Clarify what this is!
Class usedClass;
};
Type type;
TemplateParameter templateParameter;
};
- bool isSigned;
TypeKind kind;
- bool constant;
uint size;
char * name;
char * typeName;
- bool count;
- bool truth;
ClassObjectType classObjectType;
- bool byReference;
-
- bool extraParam;
int alignment;
- bool directClassAccess;
- bool computing;
- bool dllExport;
uint offset;
- bool keepCast;
- bool passAsTemplate;
int bitFieldCount;
-
- char * OnGetString(char * tempString, void * fieldData, bool * needClass)
+ int count;
+
+ bool isSigned:1;
+ bool constant:1;
+ bool truth:1;
+ bool byReference:1;
+ bool extraParam:1; // Clarify this... One thing it is used for is adaptive method with their own type explicitly specified
+ bool directClassAccess:1; // Need to clarify this if this had the same intended purpose as declaredWithStruct
+ bool computing:1;
+ bool keepCast:1;
+ bool passAsTemplate:1;
+ bool dllExport:1;
+ bool attrStdcall:1;
+ bool declaredWithStruct:1;
+ bool typedByReference:1; // Originally typed by reference, regardless of class type
+ bool casted:1;
+ // TODO: Add _Complex & _Imaginary support
+ // bool complex:1, imaginary:1;
+
+ const char * OnGetString(char * tempString, void * fieldData, bool * needClass)
{
Type type = (Type)this;
tempString[0] = '\0';
void OnFree()
{
-
+
}
-};
+};
public struct Operand
{
bool (* Mul)(Expression, Operand, Operand);
bool (* Div)(Expression, Operand, Operand);
bool (* Mod)(Expression, Operand, Operand);
-
+
// unary arithmetic
bool (* Neg)(Expression, Operand);
-
+
// unary arithmetic increment and decrement
bool (* Inc)(Expression, Operand);
bool (* Dec)(Expression, Operand);
-
+
// binary arithmetic assignment
bool (* Asign)(Expression, Operand, Operand);
bool (* AddAsign)(Expression, Operand, Operand);
bool (* MulAsign)(Expression, Operand, Operand);
bool (* DivAsign)(Expression, Operand, Operand);
bool (* ModAsign)(Expression, Operand, Operand);
-
+
// binary bitwise
bool (* BitAnd)(Expression, Operand, Operand);
bool (* BitOr)(Expression, Operand, Operand);
bool (* LShift)(Expression, Operand, Operand);
bool (* RShift)(Expression, Operand, Operand);
bool (* BitNot)(Expression, Operand);
-
+
// binary bitwise assignment
bool (* AndAsign)(Expression, Operand, Operand);
bool (* OrAsign)(Expression, Operand, Operand);
bool (* XorAsign)(Expression, Operand, Operand);
bool (* LShiftAsign)(Expression, Operand, Operand);
bool (* RShiftAsign)(Expression, Operand, Operand);
-
+
// unary logical negation
bool (* Not)(Expression, Operand);
-
+
// binary logical equality
bool (* Equ)(Expression, Operand, Operand);
bool (* Nqu)(Expression, Operand, Operand);
-
+
// binary logical
bool (* And)(Expression, Operand, Operand);
bool (* Or)(Expression, Operand, Operand);
-
+
// binary logical relational
bool (* Grt)(Expression, Operand, Operand);
bool (* Sma)(Expression, Operand, Operand);
bool (* GrtEqu)(Expression, Operand, Operand);
bool (* SmaEqu)(Expression, Operand, Operand);
-
+
bool (* Cond)(Expression, Operand, Operand, Operand);
};
#include <stdarg.h>
-void Compiler_Error(char * format, ...)
+void Compiler_Error(const char * format, ...)
{
if(inCompiler)
{
*/
#ifdef _DEBUG
if(!yylloc.start.line)
- printf("");
+ printf("no line");
#endif
//printf("(%d, %d) : error: ", yylloc.start.line, yylloc.start.charPos);
int numWarnings;
public int GetNumWarnings() { return numWarnings; }
-void Compiler_Warning(char * format, ...)
+void Compiler_Warning(const char * format, ...)
{
if(inCompiler)
{
va_list args;
char string[10000];
+ char fileName[MAX_FILENAME];
if(yylloc.start.included)
{
+ String include = GetIncludeFileFromID(yylloc.start.included);
GetWorkingDir(string, sizeof(string));
- PathCat(string, GetIncludeFileFromID(yylloc.start.included));
+ PathCat(string, include);
}
else
{
GetWorkingDir(string, sizeof(string));
PathCat(string, sourceFile);
}
-
+
+ // Skip these warnings from MinGW-w64 GCC 4.8 in intrin-impl.h
+ GetLastDirectory(string, fileName);
+ if(!strcmp(fileName, "intrin-impl.h")) return;
+
printf(string);
//printf("(%d, %d) : warning: ", yylloc.start.line, yylloc.start.charPos);
bool parseError;
bool skipErrors;
-int yyerror(char * s)
+int yyerror()
{
if(!skipErrors)
{
public int GetHostBits()
{
// Default to runtime platform in case we fail to determine host
-#if defined(__WIN32__)
- int hostBits = 64; // For now 32 bit compiler has 'forced bit depth'
-#else
int hostBits = (sizeof(uintptr) == 8) ? 64 : 32;
-#endif
String hostType = getenv("HOSTTYPE");
char host[256];
if(!hostType)