public bool IsTrue(string compilerDirective, Location location) { if (_dictionary.ContainsKey(compilerDirective)) { return(_dictionary[compilerDirective]); } if (compilerDirective.StartsWith("IFDEF ", StringComparison.InvariantCultureIgnoreCase)) { return(false); } if (compilerDirective.StartsWith("IFNDEF ", StringComparison.InvariantCultureIgnoreCase)) { return(true); } Parser parser = Parser.FromText(compilerDirective, "input", CompilerDefines.CreateStandard(), new MemoryFileLoader()); AstNode definedRule = parser.ParseRule(RuleType.IfDefinedStatement); try { var result = Evaluate(definedRule, _symbols); _dictionary.Add(compilerDirective, result); return(result); } catch { throw new PreprocessorException("Compiler directive '" + compilerDirective + "' has not been defined as either true or false", location); } }
public void SetUp() { _fileLoader = new MemoryFileLoader(); _defines = CompilerDefines.CreateEmpty(); _defines.DefineSymbol("TRUE"); _defines.UndefineSymbol("FALSE"); _defines.DefineDirectiveAsTrue("IF True"); _defines.DefineDirectiveAsFalse("IF False"); }
public CodeBase(CompilerDefines compilerDefines, IFileLoader fileLoader) { _compilerDefines = compilerDefines; _fileLoader = fileLoader; _errors = new Dictionary <string, NamedContent <Exception> >(StringComparer.InvariantCultureIgnoreCase); _parsedFiles = new Dictionary <string, NamedContent <AstNode> >(StringComparer.InvariantCultureIgnoreCase); _projects = new Dictionary <string, NamedContent <AstNode> >(StringComparer.InvariantCultureIgnoreCase); _units = new Dictionary <string, NamedContent <UnitNode> >(StringComparer.InvariantCultureIgnoreCase); }
public CompilerDefines Clone() { CompilerDefines clone = CompilerDefines.CreateEmpty(); foreach (KeyValuePair <string, bool> pair in _dictionary) { clone.DefineDirective(pair.Key, pair.Value); } 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 TokenFilter(IEnumerable<Token> tokens, CompilerDefines compilerDefines, IFileLoader fileLoader) { _tokens = tokens; _compilerDefines = compilerDefines.Clone(); _fileLoader = fileLoader; _directiveTypes = new Dictionary<string, DirectiveType>(StringComparer.InvariantCultureIgnoreCase); // Conditional-compilation directives _directiveTypes["IF"] = DirectiveType.If; _directiveTypes["IFDEF"] = DirectiveType.If; _directiveTypes["IFNDEF"] = DirectiveType.If; _directiveTypes["IFOPT"] = DirectiveType.If; _directiveTypes["IFNOPT"] = DirectiveType.If; _directiveTypes["ELSE"] = DirectiveType.Else; _directiveTypes["ELSEIF"] = DirectiveType.ElseIf; _directiveTypes["ENDIF"] = DirectiveType.EndIf; _directiveTypes["IFEND"] = DirectiveType.EndIf; // Delphi compiler directives _directiveTypes["ALIGN"] = DirectiveType.Ignored; _directiveTypes["APPTYPE"] = DirectiveType.Ignored; _directiveTypes["ASSERTIONS"] = DirectiveType.Ignored; _directiveTypes["AUTOBOX"] = DirectiveType.Ignored; _directiveTypes["BOOLEVAL"] = DirectiveType.Ignored; _directiveTypes["DEBUGINFO"] = DirectiveType.Ignored; _directiveTypes["DEFINE"] = DirectiveType.Define; _directiveTypes["DEFINITIONINFO"] = DirectiveType.Ignored; _directiveTypes["DENYPACKAGEUNIT"] = DirectiveType.Ignored; _directiveTypes["DESCRIPTION"] = DirectiveType.Ignored; _directiveTypes["DESIGNONLY"] = DirectiveType.Ignored; _directiveTypes["ENDREGION"] = DirectiveType.Ignored; _directiveTypes["EXTENDEDSYNTAX"] = DirectiveType.Ignored; _directiveTypes["EXTENSION"] = DirectiveType.Ignored; _directiveTypes["FINITEFLOAT"] = DirectiveType.Ignored; _directiveTypes["HINTS"] = DirectiveType.Ignored; _directiveTypes["I"] = DirectiveType.PossibleInclude; _directiveTypes["IMAGEBASE"] = DirectiveType.Ignored; _directiveTypes["IMPLICITBUILD"] = DirectiveType.Ignored; _directiveTypes["IMPORTEDDATA"] = DirectiveType.Ignored; _directiveTypes["INCLUDE"] = DirectiveType.Include; _directiveTypes["INLINE"] = DirectiveType.Ignored; // undocumented _directiveTypes["IOCHECKS"] = DirectiveType.Ignored; _directiveTypes["LIBPREFIX"] = DirectiveType.Ignored; _directiveTypes["LIBSUFFIX"] = DirectiveType.Ignored; _directiveTypes["LIBVERSION"] = DirectiveType.Ignored; _directiveTypes["LINK"] = DirectiveType.Ignored; _directiveTypes["LOCALSYMBOLS"] = DirectiveType.Ignored; _directiveTypes["LONGSTRINGS"] = DirectiveType.Ignored; _directiveTypes["MAXSTACKSIZE"] = DirectiveType.Ignored; _directiveTypes["MESSAGE"] = DirectiveType.Ignored; _directiveTypes["METHODINFO"] = DirectiveType.Ignored; _directiveTypes["MINENUMSIZE"] = DirectiveType.Ignored; _directiveTypes["MINSTACKSIZE"] = DirectiveType.Ignored; _directiveTypes["OBJEXPORTALL"] = DirectiveType.Ignored; _directiveTypes["OPENSTRINGS"] = DirectiveType.Ignored; _directiveTypes["OPTIMIZATION"] = DirectiveType.Ignored; _directiveTypes["OVERFLOWCHECKS"] = DirectiveType.Ignored; _directiveTypes["RANGECHECKS"] = DirectiveType.Ignored; _directiveTypes["REALCOMPATIBILITY"] = DirectiveType.Ignored; _directiveTypes["REFERENCEINFO"] = DirectiveType.Ignored; _directiveTypes["REGION"] = DirectiveType.Ignored; _directiveTypes["RESOURCE"] = DirectiveType.Ignored; _directiveTypes["RESOURCERESERVE"] = DirectiveType.Ignored; _directiveTypes["RUNONLY"] = DirectiveType.Ignored; _directiveTypes["SAFEDIVIDE"] = DirectiveType.Ignored; _directiveTypes["SETPEFLAGS"] = DirectiveType.Ignored; _directiveTypes["SOPREFIX"] = DirectiveType.Ignored; // undocumented _directiveTypes["SOSUFFIX"] = DirectiveType.Ignored; // undocumented _directiveTypes["SOVERSION"] = DirectiveType.Ignored; // undocumented _directiveTypes["STACKCHECKS"] = DirectiveType.Ignored; // undocumented _directiveTypes["STACKFRAMES"] = DirectiveType.Ignored; _directiveTypes["TYPEDADDRESS"] = DirectiveType.Ignored; _directiveTypes["TYPEINFO"] = DirectiveType.Ignored; _directiveTypes["UNDEF"] = DirectiveType.Undefine; _directiveTypes["UNSAFECODE"] = DirectiveType.Ignored; _directiveTypes["VARPROPSETTER"] = DirectiveType.Ignored; // undocumented _directiveTypes["VARSTRINGCHECKS"] = DirectiveType.Ignored; _directiveTypes["WARN"] = DirectiveType.Ignored; _directiveTypes["WARNINGS"] = DirectiveType.Ignored; _directiveTypes["WEAKPACKAGEUNIT"] = DirectiveType.Ignored; _directiveTypes["WRITEABLECONST"] = DirectiveType.Ignored; // Directives for generation of C++Builder .hpp files _directiveTypes["EXTERNALSYM"] = DirectiveType.Ignored; _directiveTypes["HPPEMIT"] = DirectiveType.Ignored; _directiveTypes["NODEFINE"] = DirectiveType.Ignored; _directiveTypes["NOINCLUDE"] = DirectiveType.Ignored; }
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); }
public TokenFilter(IEnumerable <Token> tokens, CompilerDefines compilerDefines, IFileLoader fileLoader) { _tokens = tokens; _compilerDefines = compilerDefines.Clone(); _fileLoader = fileLoader; _directiveTypes = new Dictionary <string, DirectiveType>(StringComparer.InvariantCultureIgnoreCase); // Conditional-compilation directives _directiveTypes["IF"] = DirectiveType.If; _directiveTypes["IFDEF"] = DirectiveType.If; _directiveTypes["IFNDEF"] = DirectiveType.If; _directiveTypes["IFOPT"] = DirectiveType.If; _directiveTypes["IFNOPT"] = DirectiveType.If; _directiveTypes["ELSE"] = DirectiveType.Else; _directiveTypes["ELSEIF"] = DirectiveType.ElseIf; _directiveTypes["ENDIF"] = DirectiveType.EndIf; _directiveTypes["IFEND"] = DirectiveType.EndIf; // Delphi compiler directives _directiveTypes["ALIGN"] = DirectiveType.Ignored; _directiveTypes["APPTYPE"] = DirectiveType.Ignored; _directiveTypes["ASSERTIONS"] = DirectiveType.Ignored; _directiveTypes["AUTOBOX"] = DirectiveType.Ignored; _directiveTypes["BOOLEVAL"] = DirectiveType.Ignored; _directiveTypes["DEBUGINFO"] = DirectiveType.Ignored; _directiveTypes["DEFINE"] = DirectiveType.Define; _directiveTypes["DEFINITIONINFO"] = DirectiveType.Ignored; _directiveTypes["DENYPACKAGEUNIT"] = DirectiveType.Ignored; _directiveTypes["DESCRIPTION"] = DirectiveType.Ignored; _directiveTypes["DESIGNONLY"] = DirectiveType.Ignored; _directiveTypes["ENDREGION"] = DirectiveType.Ignored; _directiveTypes["EXTENDEDSYNTAX"] = DirectiveType.Ignored; _directiveTypes["EXTENSION"] = DirectiveType.Ignored; _directiveTypes["FINITEFLOAT"] = DirectiveType.Ignored; _directiveTypes["HINTS"] = DirectiveType.Ignored; _directiveTypes["I"] = DirectiveType.PossibleInclude; _directiveTypes["IMAGEBASE"] = DirectiveType.Ignored; _directiveTypes["IMPLICITBUILD"] = DirectiveType.Ignored; _directiveTypes["IMPORTEDDATA"] = DirectiveType.Ignored; _directiveTypes["INCLUDE"] = DirectiveType.Include; _directiveTypes["INLINE"] = DirectiveType.Ignored; // undocumented _directiveTypes["IOCHECKS"] = DirectiveType.Ignored; _directiveTypes["LIBPREFIX"] = DirectiveType.Ignored; _directiveTypes["LIBSUFFIX"] = DirectiveType.Ignored; _directiveTypes["LIBVERSION"] = DirectiveType.Ignored; _directiveTypes["LINK"] = DirectiveType.Ignored; _directiveTypes["LOCALSYMBOLS"] = DirectiveType.Ignored; _directiveTypes["LONGSTRINGS"] = DirectiveType.Ignored; _directiveTypes["MAXSTACKSIZE"] = DirectiveType.Ignored; _directiveTypes["MESSAGE"] = DirectiveType.Ignored; _directiveTypes["METHODINFO"] = DirectiveType.Ignored; _directiveTypes["MINENUMSIZE"] = DirectiveType.Ignored; _directiveTypes["MINSTACKSIZE"] = DirectiveType.Ignored; _directiveTypes["OBJEXPORTALL"] = DirectiveType.Ignored; _directiveTypes["OPENSTRINGS"] = DirectiveType.Ignored; _directiveTypes["OPTIMIZATION"] = DirectiveType.Ignored; _directiveTypes["OVERFLOWCHECKS"] = DirectiveType.Ignored; _directiveTypes["RANGECHECKS"] = DirectiveType.Ignored; _directiveTypes["REALCOMPATIBILITY"] = DirectiveType.Ignored; _directiveTypes["REFERENCEINFO"] = DirectiveType.Ignored; _directiveTypes["REGION"] = DirectiveType.Ignored; _directiveTypes["RESOURCE"] = DirectiveType.Ignored; _directiveTypes["RESOURCERESERVE"] = DirectiveType.Ignored; _directiveTypes["RUNONLY"] = DirectiveType.Ignored; _directiveTypes["SAFEDIVIDE"] = DirectiveType.Ignored; _directiveTypes["SETPEFLAGS"] = DirectiveType.Ignored; _directiveTypes["SOPREFIX"] = DirectiveType.Ignored; // undocumented _directiveTypes["SOSUFFIX"] = DirectiveType.Ignored; // undocumented _directiveTypes["SOVERSION"] = DirectiveType.Ignored; // undocumented _directiveTypes["STACKCHECKS"] = DirectiveType.Ignored; // undocumented _directiveTypes["STACKFRAMES"] = DirectiveType.Ignored; _directiveTypes["TYPEDADDRESS"] = DirectiveType.Ignored; _directiveTypes["TYPEINFO"] = DirectiveType.Ignored; _directiveTypes["UNDEF"] = DirectiveType.Undefine; _directiveTypes["UNSAFECODE"] = DirectiveType.Ignored; _directiveTypes["VARPROPSETTER"] = DirectiveType.Ignored; // undocumented _directiveTypes["VARSTRINGCHECKS"] = DirectiveType.Ignored; _directiveTypes["WARN"] = DirectiveType.Ignored; _directiveTypes["WARNINGS"] = DirectiveType.Ignored; _directiveTypes["WEAKPACKAGEUNIT"] = DirectiveType.Ignored; _directiveTypes["WRITEABLECONST"] = DirectiveType.Ignored; // Directives for generation of C++Builder .hpp files _directiveTypes["EXTERNALSYM"] = DirectiveType.Ignored; _directiveTypes["HPPEMIT"] = DirectiveType.Ignored; _directiveTypes["NODEFINE"] = DirectiveType.Ignored; _directiveTypes["NOINCLUDE"] = DirectiveType.Ignored; _directiveTypes["ZEROBASEDSTRINGS"] = DirectiveType.Ignored; //Unsorted _directiveTypes["SCOPEDENUMS"] = DirectiveType.Ignored; }
public void SetUp() { _defines = CompilerDefines.CreateEmpty(); }