Exemplo n.º 1
0
        private IMatchData ConvertToBinaryTree(FragmentMatchData matchData, IMatchData rootPart)
        {
            foreach (ExpressionPartInfo partInfo in ExtractExpressionParts(matchData).OrderBy(part => part.ExpressionOrder ?? int.MaxValue))
            {
                if (partInfo.ExpressionOrder != null)
                {
                    FragmentMatchData fragment = (FragmentMatchData)partInfo.Part;
                    fragment.Parts.Insert(0, partInfo.Previous.Part);
                    fragment.Parts.Add(partInfo.Next.Part);
                    if (partInfo.Previous.Previous is ExpressionPartInfo newPreviousPartInfo)
                    {
                        newPreviousPartInfo.Next = partInfo;
                        partInfo.Previous        = newPreviousPartInfo;
                    }
                    if (partInfo.Next.Next is ExpressionPartInfo newNextPartInfo)
                    {
                        newNextPartInfo.Previous = partInfo;
                        partInfo.Next            = newNextPartInfo;
                    }
                    rootPart = fragment;
                }
            }

            return(rootPart);
        }
Exemplo n.º 2
0
 private IMatchData ConvertToLikeNameTree(FragmentMatchData matchData, IMatchData rootPart)
 {
     foreach (ExpressionPartInfo partInfo in ExtractExpressionParts(matchData).OrderBy(part => part.ExpressionOrder ?? int.MaxValue))
     {
         if (partInfo.ExpressionOrder != null)
         {
             FragmentMatchData fragment = (FragmentMatchData)partInfo.Part;
             if (partInfo.Previous.Part is FragmentMatchData previousFragment && previousFragment.Name == fragment.Name)
             {
                 fragment.Parts.InsertRange(0, previousFragment.Parts);
             }
             else
             {
                 fragment.Parts.Insert(0, partInfo.Previous.Part);
             }
             fragment.Parts.Add(partInfo.Next.Part);
             if (partInfo.Previous.Previous is ExpressionPartInfo newPreviousPartInfo)
             {
                 newPreviousPartInfo.Next = partInfo;
                 partInfo.Previous        = newPreviousPartInfo;
             }
             if (partInfo.Next.Next is ExpressionPartInfo newNextPartInfo)
             {
                 newNextPartInfo.Previous = partInfo;
                 partInfo.Next            = newNextPartInfo;
             }
             rootPart = fragment;
         }
     }
Exemplo n.º 3
0
        public static JsonItem GetJsonItem(IMatchData matchData)
        {
            switch (matchData.Name)
            {
            case "Object":
                return(new JsonObject((FragmentMatchData)matchData));

            case "Array":
                return(new JsonArray((FragmentMatchData)matchData));

            case "Boolean":
                return(new JsonValue((StringMatchData)matchData, JsonDataType.Boolean));

            case "Number":
                return(new JsonValue((StringMatchData)matchData, JsonDataType.Number));

            case "Null":
                return(new JsonValue((StringMatchData)matchData, JsonDataType.Null));

            case "String":
                return(new JsonValue((StringMatchData)matchData, JsonDataType.String));

            default:
                return(null);
            }
        }
Exemplo n.º 4
0
        private void AddItem(IMatchData matchData)
        {
            switch (matchData.Name)
            {
            case "MathParensValuable":
            case "BooleanParensValuable":
                AddParensValuable((FragmentMatchData)matchData);
                break;

            case "Boolean":
                AddBoolean((StringMatchData)matchData);
                break;

            case "Number":
                AddNumber((FragmentMatchData)matchData);
                break;

            case "OperatedMathValuable":
            case "MathExpression":
            case "RelationalExpression":
            case "EqualityExpression":
            case "BooleanOrExpression":
            case "BooleanAndExpression":
            case "MathOrExpression":
            case "MathAndExpression":
                AddPartItem((FragmentMatchData)matchData);
                break;

            case "FactorialMathValuable":
                AddFactorialMathValuable((FragmentMatchData)matchData);
                break;

            case "SquareRootMathValuable":
                AddSquareRootMathValuable((FragmentMatchData)matchData);
                break;

            case "OperatedBooleanValuable":
                AddOperatedBooleanValuable((FragmentMatchData)matchData);
                break;

            case "MultiplicativeSuffix":
            case "AdditiveSuffix":
            case "SubtractiveSuffix":
            case "ExponentSuffix":
            case "EqualitySuffix":
            case "RelationalSuffix":
            case "BooleanAndSuffix":
            case "BooleanOrSuffix":
            case "MathAndSuffix":
            case "MathOrSuffix":
            case "SimpleMathAndSuffix":
            case "SimpleMathOrSuffix":
                AddTreedExpression((FragmentMatchData)matchData);
                break;

            default:
                throw new NotImplementedException($"Matcher '{matchData.Name}' is unhandled");
            }
        }
Exemplo n.º 5
0
 public MatcherResult(IMatchData matchData = default, bool success = default, int endIndex = default, int?failureIndex = default, string matchLog = default)
 {
     MatchData    = matchData;
     Success      = success;
     EndIndex     = endIndex;
     FailureIndex = failureIndex;
     MatchLog     = matchLog;
 }
Exemplo n.º 6
0
 public void Deconstruct(out IMatchData matchData, out bool success, out int endIndex, out int?failureIndex, out string matchLog)
 {
     matchData    = MatchData;
     success      = Success;
     endIndex     = EndIndex;
     failureIndex = FailureIndex;
     matchLog     = MatchLog;
 }
Exemplo n.º 7
0
        public IList <Instruction <GroupState> > Generate(IMatchData matchData)
        {
            _action                   = new ActionInfo();
            _instructions             = new List <Instruction <GroupState> >();
            _reprocessRequiredIndexes = new Dictionary <InstructionCode, List <int> >();

            foreach (IMatchData partMatchData in ((FragmentMatchData)matchData).Parts)
            {
                AddItem(partMatchData);
            }
            if (_reprocessRequiredIndexes.Count > 0)
            {
                throw new LanguageConstraintException("Invalid operation", _reprocessRequiredIndexes.Values.FirstOrDefault()?.FirstOrDefault());
            }
            return(_instructions);
        }
Exemplo n.º 8
0
        public override MatcherResult Match(string code, string fragmentMatcher, bool matchFullText = true)
        {
            FragmentMatchData matchData = new FragmentMatchData {
                StartIndex = 0
            };
            Span <int> checkFlags = stackalloc int[7];
            State      state      = new State()
            {
                Code = code, DistinctStringMatches = new List <StringMatchData>(2000), CheckFlags = checkFlags
            };
            bool success = false;

            switch (fragmentMatcher)
            {
            case "NotCharacterClassBody":
                success = MatchFragmentNotCharacterClassBody(ref state, matchData);
                break;

            case "CharacterClassBody":
                success = MatchFragmentCharacterClassBody(ref state, matchData);
                break;

            case "CharacterRange":
                success = MatchFragmentCharacterRange(ref state, matchData);
                break;

            case "HexRange":
                success = MatchFragmentHexRange(ref state, matchData);
                break;
            }

            IMatchData resultMatchData = matchData.Parts.FirstOrDefault();
            int?       failureIndex    = success ? null : state.FailureIndex;

            if (success && matchFullText && state.CurrentIndex != state.Code.Length)
            {
                success      = false;
                failureIndex = state.CurrentIndex;
            }

            return(new MatcherResult(resultMatchData, success, state.CurrentIndex, failureIndex, state.MatchLogBuilder?.ToString()));
        }
Exemplo n.º 9
0
        protected void ConvertToExpressionTree(FragmentMatchData matchData, ExpressionMode expressionMode)
        {
            IMatchData rootPart = matchData.Parts.ElementAtOrDefault(0);

            switch (expressionMode)
            {
            case ExpressionMode.BinaryTree:
                rootPart = ConvertToBinaryTree(matchData, rootPart);
                break;

            case ExpressionMode.LikeNameTree:
                rootPart = ConvertToLikeNameTree(matchData, rootPart);
                break;
            }
            matchData.Parts.Clear();
            if (rootPart != null)
            {
                matchData.Parts.Add(rootPart);
            }
        }
Exemplo n.º 10
0
        private void AddTreedExpression(FragmentMatchData matchData)
        {
            IMatchData operatorData = matchData.Parts[1];

            AddItem(matchData.Parts[0]);
            _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.PHR, sourcePosition: matchData.StartIndex));
            AddItem(matchData.Parts[2]);
            switch (operatorData.ToString())
            {
            case "*":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RMultiply, sourcePosition: operatorData.StartIndex));
                break;

            case "/":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RDivide, sourcePosition: operatorData.StartIndex));
                break;

            case "+":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RPlus, sourcePosition: operatorData.StartIndex));
                break;

            case "-":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RSubtract, sourcePosition: operatorData.StartIndex));
                break;

            case "^":
                _instructions.Add(_instructionProvider.GetSpecialInstruction(new string[] { "RPOW" }, sourcePosition: operatorData.StartIndex));
                break;

            case ">":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RGreaterThan, sourcePosition: operatorData.StartIndex));
                break;

            case ">=":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RGreaterThanOrEquals, sourcePosition: operatorData.StartIndex));
                break;

            case "<":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RLessThan, sourcePosition: operatorData.StartIndex));
                break;

            case "<=":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RLessThanOrEquals, sourcePosition: operatorData.StartIndex));
                break;

            case "==":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.REquals, sourcePosition: operatorData.StartIndex));
                break;

            case "!=":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RNotEquals, sourcePosition: operatorData.StartIndex));
                break;

            case "&":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RAnd, sourcePosition: operatorData.StartIndex));
                break;

            case "|":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.ROr, sourcePosition: operatorData.StartIndex));
                break;
            }
        }
Exemplo n.º 11
0
 public IList <Instruction <GroupState> > Generate(IMatchData matchData)
 {
     _instructions = new List <Instruction <GroupState> >();
     AddItem(matchData);
     return(_instructions);
 }
Exemplo n.º 12
0
        private void AddExpressionSuffix(FragmentMatchData matchData)
        {
            IMatchData operatorData = matchData.Parts[1];

            AddItem((FragmentMatchData)matchData.Parts[0]);
            int?shortcutInstruction = null;

            switch (operatorData.ToString())
            {
            case "&&":
            {
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.CPHR, sourcePosition: operatorData.StartIndex));
                shortcutInstruction = _instructions.Count;
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.NC, sourcePosition: operatorData.StartIndex));
            }
            break;

            case "||":
            {
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.CPHR, sourcePosition: operatorData.StartIndex));
                shortcutInstruction = _instructions.Count;
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.C, sourcePosition: operatorData.StartIndex));
            }
            break;
            }
            _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.PHR, sourcePosition: matchData.StartIndex));
            AddItem((FragmentMatchData)matchData.Parts[2]);
            switch (operatorData.ToString())
            {
            case ">":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RGreaterThan, sourcePosition: operatorData.StartIndex));
                break;

            case ">=":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RGreaterThanOrEquals, sourcePosition: operatorData.StartIndex));
                break;

            case "<":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RLessThan, sourcePosition: operatorData.StartIndex));
                break;

            case "<=":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RLessThanOrEquals, sourcePosition: operatorData.StartIndex));
                break;

            case "==":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.REquals, sourcePosition: operatorData.StartIndex));
                break;

            case "!=":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RNotEquals, sourcePosition: operatorData.StartIndex));
                break;

            case "&&":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RAnd, sourcePosition: operatorData.StartIndex));
                break;

            case "&":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RAnd, sourcePosition: operatorData.StartIndex));
                break;

            case "||":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.ROr, sourcePosition: operatorData.StartIndex));
                break;

            case "|":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.ROr, sourcePosition: operatorData.StartIndex));
                break;

            case "*":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RMultiply, sourcePosition: operatorData.StartIndex));
                break;

            case "/":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RDivide, sourcePosition: operatorData.StartIndex));
                break;

            case "+":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RPlus, sourcePosition: operatorData.StartIndex));
                break;

            case "-":
                _instructions.Add(InstructionProvider <GroupState> .GetInstruction(InstructionCode.RSubtract, sourcePosition: operatorData.StartIndex));
                break;
            }
            if (shortcutInstruction != null)
            {
                _instructions[shortcutInstruction.Value] = InstructionProvider <GroupState> .GetInstruction(_instructions[shortcutInstruction.Value].Code, payload : new object[] { _instructions.Count }, sourcePosition : operatorData.StartIndex);
            }
        }
Exemplo n.º 13
0
        private void AddItem(IMatchData matchData, bool interruptable = false)
        {
            switch (matchData.Name)
            {
            case "WhileBlock":
                AddWhileBlock((FragmentMatchData)matchData);
                break;

            case "IfElseBlock":
                AddIfElseBlock((FragmentMatchData)matchData);
                break;

            case "Block":
                AddBlock((FragmentMatchData)matchData);
                break;

            case "ItemReturn":
                AddItemReturn((FragmentMatchData)matchData);
                break;

            case "Break":
                AddBreak((StringMatchData)matchData);
                break;

            case "Continue":
                AddContinue((StringMatchData)matchData);
                break;

            case "DeclarationAssignment":
                AddDeclarationAssignment((FragmentMatchData)matchData);
                break;

            case "Declaration":
                AddDeclaration((FragmentMatchData)matchData);
                break;

            case "Assignment":
                AddAssignment((FragmentMatchData)matchData);
                break;

            case "DirectedValuableChain":
                AddDirectedValuableChain((FragmentMatchData)matchData);
                break;

            case "NewArray":
                AddNewArray((FragmentMatchData)matchData);
                break;

            case "ParensValuable":
                AddParensValuable((FragmentMatchData)matchData);
                break;

            case "Identifier":
                AddGetVariable((FragmentMatchData)matchData, interruptable);
                break;

            case "ValuedIndex":
                AddValuedIndex((FragmentMatchData)matchData);
                break;

            case "ArgumentValues":
                AddArgumentValues((FragmentMatchData)matchData);
                break;

            case "AnonymousFunction":
                AddAnonymousFunction((FragmentMatchData)matchData);
                break;

            case "Boolean":
                AddBoolean((StringMatchData)matchData);
                break;

            case "Null":
                AddNull((StringMatchData)matchData);
                break;

            case "StringLiteral":
                AddStringLiteral((StringMatchData)matchData);
                break;

            case "Number":
                AddNumber((FragmentMatchData)matchData);
                break;

            case "Valuable":
            case "Value":
            case "OpenEndedStatements":
                AddInnerItem((FragmentMatchData)matchData);
                break;

            case "MultiplicativeSuffix":
            case "AdditiveSuffix":
            case "SubtractiveSuffix":
            case "EqualitySuffix":
            case "RelationalSuffix":
            case "AndSuffix":
            case "OrSuffix":
            case "BitwiseAndSuffix":
            case "BitwiseOrSuffix":
                AddExpressionSuffix((FragmentMatchData)matchData);
                break;

            default:
                throw new NotImplementedException($"Matcher '{matchData.Name}' is unhandled");
            }
        }