public void SetUp() { _fileLoader = new MemoryFileLoader(); _defines = CompilerDefines.CreateEmpty(); _defines.DefineSymbol("TRUE"); _defines.UndefineSymbol("FALSE"); _defines.DefineDirectiveAsTrue("IF True"); _defines.DefineDirectiveAsFalse("IF False"); }
public CompilerDefines Clone() { CompilerDefines clone = CompilerDefines.CreateEmpty(); foreach (KeyValuePair <string, bool> pair in _dictionary) { clone.DefineDirective(pair.Key, pair.Value); } foreach (string symbol in _symbols) { clone.DefineSymbol(symbol); } return(clone); }
public CompilerDefines CreateCompilerDefines() { CompilerDefines result = CompilerDefines.CreateStandard(); for (char option = 'A'; option <= 'Z'; ++option) { result.DefineDirective("IFOPT " + option + "-", _compilerOptions.IsOptionOff(option)); result.DefineDirective("IFOPT " + option + "+", _compilerOptions.IsOptionOn(option)); } foreach (string define in CustomDefines.Split(';')) { result.DefineSymbol(define); } result.DefineSymbol(DelphiVersionDefine); foreach (string condition in FalseIfConditions.Split(';')) { result.DefineDirectiveAsFalse(condition); } foreach (string condition in TrueIfConditions.Split(';')) { result.DefineDirectiveAsTrue(condition); } return(result); }
public static CompilerDefines CreateStandard() { CompilerDefines defines = CreateEmpty(); // These lists come from the following sources: // - Actual IFDEFs in the Delphi RTL source // - http://www.blong.com/Tips/KylixTips.htm#Conditionals defines.DefineSymbol("CONDITIONALEXPRESSIONS"); defines.DefineSymbol("ZEROBASEDSTRINGS"); defines.DefineSymbol("CPU386"); defines.DefineSymbol("MSWINDOWS"); defines.DefineSymbol("WIN32"); defines.DefineDirectiveAsTrue("IF not GenericSafeArrays"); defines.DefineDirectiveAsTrue("IF not GenericVariants"); // Delphi 1 for Win16 defines.UndefineSymbol("WINDOWS"); // C++Builder defines.UndefineSymbol("BCB"); // Kylix defines.UndefineSymbol("DECLARE_GPL"); defines.UndefineSymbol("ELF"); defines.UndefineSymbol("LINUX"); defines.UndefineSymbol("LINUX32"); defines.UndefineSymbol("PC_MAPPED_EXCEPTIONS"); defines.UndefineSymbol(" PC_MAPPED_EXCEPTIONS"); defines.UndefineSymbol("PIC"); defines.UndefineSymbol("POSIX"); defines.UndefineSymbol("POSIX32"); // Delphi for .NET defines.UndefineSymbol("CIL"); defines.UndefineSymbol("CLR"); defines.UndefineSymbol("MANAGEDCODE"); // Miscellaneous defines.UndefineSymbol("DEBUG"); defines.UndefineSymbol("DEBUG_FUNCTIONS"); defines.UndefineSymbol("DEBUG_MREWS"); defines.UndefineSymbol("GLOBALALLOC"); defines.UndefineSymbol("MEMORY_DIAG"); defines.UndefineSymbol("PUREPASCAL"); defines.UndefineSymbol("TRIAL_EDITION"); defines.UndefineSymbol("USEPASCALCODE"); defines.DefineDirectiveAsFalse("IF Defined(PIC) Or Defined(PUREPASCAL)"); defines.DefineDirectiveAsFalse("IF GenericOperations"); defines.DefineDirectiveAsFalse("IF GenericVariants"); defines.DefineDirectiveAsFalse("IFOPT R-"); // Version tags. Not surprisingly, you should DefineSymbol() only one. defines.UndefineSymbol("VER80"); // Delphi 1 defines.UndefineSymbol("VER90"); // Delphi 2 defines.UndefineSymbol("VER93"); // C++Builder 1 defines.UndefineSymbol("VER100"); // Delphi 3 defines.UndefineSymbol("VER110"); // C++Builder 3 defines.UndefineSymbol("VER120"); // Delphi 4 defines.UndefineSymbol("VER125"); // C++Builder 4 defines.UndefineSymbol("VER130"); // Delphi/C++Builder 5 defines.UndefineSymbol("VER140"); // Delphi/C++Builder 6, Kylix 1, 2, & 3 defines.UndefineSymbol("VER150"); // Delphi 7 defines.UndefineSymbol("VER160"); // Delphi 8 for .NET defines.UndefineSymbol("VER170"); // Delphi 2005 defines.UndefineSymbol("VER180"); // Delphi 2006 // Need: VERxxx value for Delphi 2007 for Win32 // Need: VERxxx value for CodeGear RAD Studio 2007 return(defines); }
private IEnumerable <Token> HandleCompilerDirective(Stack <IfDefTruth> ifDefStack, Token token) { string directive = token.ParsedText; string firstWord = FirstWordOf(directive); string parameter = directive.Substring(firstWord.Length).Trim(); switch (GetDirectiveType(firstWord)) { case DirectiveType.Unrecognized: if (ifDefStack.Peek() == IfDefTruth.True) { throw new LexException("Unrecognized compiler directive '" + firstWord + "'", token.Location); } break; case DirectiveType.Ignored: break; case DirectiveType.PossibleInclude: if (parameter.StartsWith("-") || parameter.StartsWith("+")) { // $I = $IOCHECKS. Ignore it. break; } else { // $I = $INCLUDE. Handle it. goto case DirectiveType.Include; } case DirectiveType.Include: IEnumerable <Token> sourceTokens = GetSourceTokensForInclude(token, parameter); IEnumerable <Token> filteredTokens = Filter(ifDefStack, sourceTokens); foreach (Token newToken in filteredTokens) { yield return(newToken); } break; case DirectiveType.Define: if (ifDefStack.Peek() == IfDefTruth.True) { _compilerDefines.DefineSymbol(parameter); } break; case DirectiveType.Undefine: if (ifDefStack.Peek() == IfDefTruth.True) { _compilerDefines.UndefineSymbol(parameter); } break; case DirectiveType.If: HandleIf(ifDefStack, directive, token.Location); break; case DirectiveType.Else: HandleElse(ifDefStack); break; case DirectiveType.ElseIf: HandleElseIf(ifDefStack, directive, token.Location); break; case DirectiveType.EndIf: ifDefStack.Pop(); break; } }