コード例 #1
0
ファイル: DPDA.cs プロジェクト: mohmehdi/Automata
    public bool CheckInput(string input)
    {
        input += "$";
        if (!DeterministicCheck())
        {
            return(false);
        }

        Stack <char> _stack = new Stack <char>();

        _stack.Push('λ');
        _stack.Push('z');

        DState current = _start;

        for (int i = 0; i < input.Length; i++)
        {
            if (current == null)
            {
                return(false);
            }

            char             inputChar  = input[i];
            List <TagFormat> tagFormats = null;

            tagFormats = current.GetTags(inputChar);
            if (tagFormats == null)
            {
                var list = current.GetTags('λ');
                if (list != null)
                {
                    i--;
                    tagFormats = list;
                }
            }
            if (tagFormats == null)
            {
                return(false);
            }
            foreach (var currentTagFormat in tagFormats.Where(t => t.machine == _stack.Peek()))
            {
                if (_stack.Peek() != 'λ')
                {
                    _stack.Pop();
                }

                PushToStack(_stack, currentTagFormat);

                current = current.GetNextState(currentTagFormat.GetAllTogether());
                break;
            }
        }
        return(current.IsFinal());
    }
コード例 #2
0
ファイル: Turing.cs プロジェクト: mohmehdi/Automata
    public DState GetNextState(DState current, char underhead)
    {
        var tags = current.GetTags(underhead);

        if (tags == null)
        {
            return(null);
        }

        return(current.GetNextState(tags[0].GetAllTogether()));
    }
コード例 #3
0
ファイル: TuringHelper.cs プロジェクト: mohmehdi/Automata
    private IEnumerator DoCheck(string input, Turing turing)
    {
        bool result = false;
        bool isHalt = false;

        if (!turing.DeterministicCheck())
        {
            isHalt = true;
        }

        DState        current = turing.GetStartState();
        StringBuilder tape    = new StringBuilder(input);
        int           head    = 0;

        while (!isHalt)
        {
            if (head >= tape.Length || head < 0)
            {
                if (head < 0)
                {
                    head = 0;
                }
                tape.Insert(head, '□');
            }

            var next = turing.GetNextState(current, tape[head]);

            if (next == null)
            {
                isHalt = true;
                result = current.IsFinal();
            }
            else
            {
                var tagFormat = current.GetTags(tape[head])[0];
                tape[head] = tagFormat.machine;
                head      += tagFormat.machineCommand.ToLower().Contains("r") ? +1 : -1;
                current    = next;
            }
            yield return(null);
        }

        turing.IsAnswerReady = true;
        turing.Result        = result;
        _checking            = null;
    }