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); } }
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); }
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); }
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)); }