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