Exemple #1
0
        private SimpleRecResult ProcCommands(string Order, CodeString Line, CodeString MLine)
        {
            CodeString Name;
            var        ReDef = false;

            switch (Order)
            {
            case "error":
                State.Messages.Add(MessageId.PreprocError, MLine);
                return(SimpleRecResult.Failed);

            case "warning":
                State.Messages.Add(MessageId.PreprocWarning, MLine);
                return(SimpleRecResult.Succeeded);

            case "info":
                State.Messages.Add(MessageId.PreprocInfo, MLine);
                return(SimpleRecResult.Succeeded);

            case "redef":
                ReDef = true;
                goto case "define";

            case "define":
                var Macro = ProcMacro(MLine);
                if (Macro != null)
                {
                    if (ReDef)
                    {
                        Redefine(Macro);
                    }
                    else if (!Define(Macro))
                    {
                        return(SimpleRecResult.Failed);
                    }

                    return(SimpleRecResult.Succeeded);
                }
                else
                {
                    return(SimpleRecResult.Failed);
                }

            case "undef":
                Name = MLine.Word();
                if (!Name.IsValidIdentifierName)
                {
                    State.Messages.Add(MessageId.NotValidName, Name);
                    return(SimpleRecResult.Failed);
                }

                if (!RemoveMacro(Name.ToString()))
                {
                    State.Messages.Add(MessageId.NoMacro, Name);
                    return(SimpleRecResult.Failed);
                }

                if (MLine.Length > 0)
                {
                    State.Messages.Add(MessageId.ParamCount, MLine);
                }
                return(SimpleRecResult.Succeeded);

            default:
                State.Messages.Add(MessageId.UnknownCommand, Line);
                return(SimpleRecResult.Failed);
            }
        }
Exemple #2
0
        Macro ProcMacro(CodeString MLine)
        {
            var MacroName = MLine.Word();

            if (!MacroName.IsValidIdentifierName)
            {
                State.Messages.Add(MessageId.NotValidName, MacroName);
                return(null);
            }

            var Params   = new CodeString();
            var Handlers = State.Language.GlobalHandlers;

            if (MLine.Length > 0 && MLine[0] == '(')
            {
                var zp = MLine.GetBracketPos(false, Handlers);
                if (zp > 0)
                {
                    Params = MLine.Substring(1, zp - 1).Trim();
                    MLine  = MLine.Substring(zp + 1).Trim();
                }
            }

            List <string> ParamList = null;

            if (Params.IsValid)
            {
                var PStrList = RecognizerHelper.SplitToParameters(State, Params, ',');
                if (PStrList == null)
                {
                    return(null);
                }

                ParamList = new List <string>();
                for (var i = 0; i < PStrList.Length; i++)
                {
                    var String = PStrList[i].ToString();
                    if (!PStrList[i].IsValidIdentifierName)
                    {
                        State.Messages.Add(MessageId.WrongParamList, PStrList[i]);
                        return(null);
                    }

                    if (ParamList.Contains(String))
                    {
                        State.Messages.Add(MessageId.IdAlreadyDefined, PStrList[i]);
                        return(null);
                    }

                    ParamList.Add(String);
                }
            }

            MLine = MLine.Trim();
            if (MLine.Length > 0)
            {
                var Plugin = new PluginForDefine(Container, ParamList);
                var Node   = Expressions.CreateExpression(MLine, Plugin);

                if (Node != null)
                {
                    return(new Macro(MacroName, Node, ParamList));
                }
                else
                {
                    return(null);
                }
            }

            return(new Macro(MacroName, null, ParamList));
        }