public SyntaxMachineState MoveNext(Token token) { SyntaxMachineState nextState = GetNext(token); this.CurrentState = nextState; return(CurrentState); }
public SyntaxMachineState GetNext(Token token) { SyntaxMachineState nextState = this.CurrentState; SyntaxStateTransition transition = new SyntaxStateTransition(CurrentState, token.Type); if ((this.CurrentState == SyntaxMachineState.START || this.CurrentState != SyntaxMachineState.START && token.Type == TokenType.END) && !transitions.TryGetValue(transition, out nextState)) { throw new Exception("Syntax: Invalid transition: " + CurrentState + " -> " + nextState + "\nToken Text: " + token.Text + " Token Type: " + token.Type.ToString()); } if (this.CurrentState == SyntaxMachineState.START && token.Type == TokenType.INT) { this.sequenceId.ConsumeToken(token); } else if (this.CurrentState == SyntaxMachineState.START && token.Type == TokenType.FINAL) { this.endCommand.EndInstruction(); } else if (this.CurrentState == SyntaxMachineState.START && token.Type == TokenType.RETURN) { this.returnCommand.ReturnInstructions(); } else { this.engine.ConsumeToken(this.CurrentState, token, nextState); } Console.WriteLine("Syntax: " + this.CurrentState + " -> " + nextState + ": " + token.Text); return(nextState); }
public void ConsumeToken(SyntaxMachineState currentState, Token token, SyntaxMachineState nextState) { if (currentState == SyntaxMachineState.START && nextState != SyntaxMachineState.START) { this.subStateMachines[nextState].MoveToNextState(token); } else if (currentState != SyntaxMachineState.START) { this.subStateMachines[currentState].MoveToNextState(token); } }
public SyntaxStateMachine(FileManager fileManager) { CurrentState = SyntaxMachineState.START; transitions = new Dictionary <SyntaxStateTransition, SyntaxMachineState> { { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.INT), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.RETURN), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.FINAL), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.PRINT), SyntaxMachineState.PRINT }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.LET), SyntaxMachineState.LET }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.FOR), SyntaxMachineState.FOR }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.DIM), SyntaxMachineState.DIM }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.REMARK), SyntaxMachineState.REMARK }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.GO), SyntaxMachineState.GO }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.GOTO), SyntaxMachineState.GO }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.DATA), SyntaxMachineState.DATA }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.READ), SyntaxMachineState.READ }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.GOSUB), SyntaxMachineState.GOSUB }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.IF), SyntaxMachineState.IF }, { new SyntaxStateTransition(SyntaxMachineState.START, TokenType.NEXT), SyntaxMachineState.NEXT }, { new SyntaxStateTransition(SyntaxMachineState.PRINT, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.LET, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.FOR, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.DIM, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.REMARK, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.GO, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.DATA, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.READ, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.GOSUB, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.IF, TokenType.END), SyntaxMachineState.START }, { new SyntaxStateTransition(SyntaxMachineState.NEXT, TokenType.END), SyntaxMachineState.START }, }; this.fileManager = fileManager; this.variables = new VariableTable(); this.endCommand = new EndCommand(fileManager); this.sequenceId = new SequenceIdLabelCommand(this.variables, fileManager); this.returnCommand = new ReturnCommand(this.variables, fileManager); this.engine = new SyntaxEngine(this.variables, fileManager); }
public SyntaxStateTransition(SyntaxMachineState currentState, TokenType token) { this.CurrentState = currentState; this.Token = token; }