コード例 #1
0
        public IParseNode Parse(TokenWalker walker)
        {
            Debug.Assert(TermParser != null);

            IParseNode result;

            if (walker.NextIs <MinusToken>())
            {
                var lexem = walker.Pop();
                result = new UnaryMinusOperator(TermParser.Parse(walker), lexem.Position);
            }
            else
            {
                result = TermParser.Parse(walker);
            }
            while (walker.NextIsLineOperator())
            {
                var lexem = walker.Pop();
                result = lexem.Token switch
                {
                    MinusToken _ => new MinusOperator(result, TermParser.Parse(walker), lexem.Position),
                    PlusToken _ => new PlusOperator(result, TermParser.Parse(walker), lexem.Position),
                    _ => result
                };
            }

            return(result);
        }
    }
コード例 #2
0
        public IEnumerable <BrainfuckToken> Parse(TextReader streamReader)
        {
            var ret = new List <BrainfuckToken>();
            var leftBracketStack = new Stack <LeftBracketToken>();

            BrainfuckToken prev  = null;
            var            index = -1;

            while (0 <= streamReader.Peek())
            {
                ++index;

                var c = (char)streamReader.Read();

                BrainfuckToken current = null;
                switch (c)
                {
                case '>':
                    current = new RightShiftToken();
                    break;

                case '<':
                    current = new LeftShiftToken();
                    break;

                case '+':
                    current = new PlusToken();
                    break;

                case '-':
                    current = new MinusToken();
                    break;

                case '.':
                    current = new DotToken();
                    break;

                case ',':
                    current = new SemicolonToken();
                    break;

                case '[':
                {
                    var leftBracket = new LeftBracketToken();
                    leftBracketStack.Push(leftBracket);

                    current = leftBracket;
                }
                break;

                case ']':
                {
                    if (leftBracketStack.Count == 0)
                    {
                        throw new InvalidOperationException();
                    }

                    var leftBracket  = leftBracketStack.Pop();
                    var rightBracket = new RightBracketToken();

                    leftBracket.RightBracketToken = rightBracket;
                    rightBracket.LeftBracketToken = leftBracket;

                    current = rightBracket;
                }
                break;
                }

                if (current == null)
                {
                    continue;
                }

                current.Index = index;

                prev?.SetNextIndexToken(current);

                prev = current;

                ret.Add(current);
            }

            if (leftBracketStack.Count != 0)
            {
                throw new InvalidOperationException();
            }

            return(ret);
        }
コード例 #3
0
        public Token GetToken()
        {
            State = LexicAnalyserState.Initial;
            Value = HasNext ? Character.ToString() : "";
            Token token = null;

            while (HasNext && token == null)
            {
                switch (State)
                {
                case LexicAnalyserState.Initial:
                    HandleInitial();
                    break;

                case LexicAnalyserState.NonTerminal:
                    token = new NonTerminalToken(Value);
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Space:
                    token = new SpaceToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Terminal:
                    token = new TerminalToken(Value);
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Empty:
                    token = new EmptyToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.NewLine:
                    token = new NewLineToken(Value);
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Identifier:
                    token = new IdentifierToken(Value);
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Number:
                    token = new NumberToken(Value);
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Var:
                    token = new VarToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Write:
                    token = new WriteToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Read:
                    token = new ReadToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.If:
                    token = new IfToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.End:
                    token = new EndToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Then:
                    token = new ThenToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Begin:
                    token = new BeginToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.While:
                    token = new WhileToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Do:
                    token = new DoToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.SemiColon:
                    token = new SemiColonToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.OpenParentheses:
                    token = new OpenParenthesesToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.CloseParentheses:
                    token = new CloseParenthesesToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Plus:
                    token = new PlusToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Sub:
                    token = new SubToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Great:
                    token = new GreatToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Less:
                    token = new LessToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Equal:
                    token = new EqualToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Repeat:
                    token = new RepeatToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Until:
                    token = new UntilToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.Attribution:
                    token = new AttributionToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.NotEqual:
                    token = new NotEqualToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.GreatOrEqual:
                    token = new GreatOrEqualToken();
                    CurrentIndex++;
                    break;

                case LexicAnalyserState.LessOrEqual:
                    token = new LessOrEqualToken();
                    CurrentIndex++;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            return(token);
        }
コード例 #4
0
        public BrainfuckTokenSequence Parse(TextReader streamReader, BrainfuckMemoryTape memoryTape = null)
        {
            memoryTape = memoryTape ?? new BrainfuckMemoryTape();

            var leftBracketStack = new Stack <LeftBracketToken>();

            BrainfuckToken first = null;
            BrainfuckToken prev  = null;
            var            index = -1;

            while (0 <= streamReader.Peek())
            {
                ++index;

                var c = (char)streamReader.Read();

                BrainfuckToken current = null;
                switch (c)
                {
                case '>':
                    current = new RightShiftToken();
                    break;

                case '<':
                    current = new LeftShiftToken();
                    break;

                case '+':
                    current = new PlusToken();
                    break;

                case '-':
                    current = new MinusToken();
                    break;

                case '.':
                    current = new DotToken();
                    break;

                case ',':
                    current = new SemicolonToken();
                    break;

                case '[':
                {
                    var leftBracket = new LeftBracketToken();
                    leftBracketStack.Push(leftBracket);

                    current = leftBracket;
                }
                break;

                case ']':
                {
                    if (leftBracketStack.Count == 0)
                    {
                        throw new InvalidOperationException();
                    }

                    var leftBracket  = leftBracketStack.Pop();
                    var rightBracket = new RightBracketToken();

                    leftBracket.RightBracketToken = rightBracket;
                    rightBracket.LeftBracketToken = leftBracket;

                    current = rightBracket;
                }
                break;

                default:
                    break;
                }

                if (current == null)
                {
                    continue;
                }

                current.MemoryTape = memoryTape;
                current.Index      = index;

                if (prev != null && prev.Next == null)
                {
                    prev.SetNextIndexToken(current);
                }

                prev = current;

                if (first != null)
                {
                    continue;
                }
                first = current;
            }

            if (leftBracketStack.Count != 0)
            {
                throw new InvalidOperationException();
            }

            return(new BrainfuckTokenSequence(first));
        }