Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
 public void SetUp()
 {
     _fileLoader = new MemoryFileLoader();
     _defines = CompilerDefines.CreateEmpty();
     _defines.DefineSymbol("TRUE");
     _defines.UndefineSymbol("FALSE");
     _defines.DefineDirectiveAsTrue("IF True");
     _defines.DefineDirectiveAsFalse("IF False");
 }
Beispiel #3
0
 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);
 }
Beispiel #4
0
        public CompilerDefines Clone()
        {
            CompilerDefines clone = CompilerDefines.CreateEmpty();

            foreach (KeyValuePair <string, bool> pair in _dictionary)
            {
                clone.DefineDirective(pair.Key, pair.Value);
            }
            return(clone);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 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;
 }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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;
        }
Beispiel #9
0
 public void SetUp()
 {
     _defines = CompilerDefines.CreateEmpty();
 }