void processLine(string line, Program & program, EvalState & state) { TokenScanner scanner; scanner.ignoreWhitespace(); scanner.scanNumbers(); scanner.setInput(line); string str=scanner.nextToken(); if (scanner.getTokenType(str)==NUMBER) { int lineNumber=stringToInteger(str); string token=scanner.nextToken(); scanner.saveToken(token); if (token!="") { program.addSourceLine(lineNumber, line); program.setParsedStatement(lineNumber, parseStatement(scanner)); } else { program.removeSourceLine(lineNumber); } } else if (str=="LIST") { for (int i=program.getFirstLineNumber(); i!=-1; i=program.getNextLineNumber(i)) { cout << program.getSourceLine(i)<<endl; } } else if (str=="CLEAR") { program.clear(); } else if(str=="QUIT") exit(0); else if (str=="HELP") cout<<"This is a minimal BASIC interpreter."<<endl; else if (str=="RUN") { int currentLine=program.getFirstLineNumber(); state.setCurrentLine(currentLine); while (currentLine!=-1) { program.getParsedStatement(currentLine)->execute(state); if(currentLine!=state.getCurrentLine()) { currentLine=state.getCurrentLine(); } else { currentLine=program.getNextLineNumber(currentLine); state.setCurrentLine(currentLine); } } } }
void processLine(string line, Program & program, EvalState & state) { TokenScanner scanner; scanner.ignoreWhitespace(); scanner.scanNumbers(); scanner.setInput(line); // Expression *exp = parseExp(scanner); // int value = exp->eval(state); // cout << value << endl; // delete exp; if (!scanner.hasMoreTokens()) { return; } string firstToken = toUpperCase(scanner.nextToken()); if (firstToken == "RUN") { runProgram(program, state); } else if (firstToken == "QUIT") { exit(0); } else if (firstToken == "HELP") { dspHelp(); } else if (firstToken == "CLEAR") { program.clear(); } else if (firstToken == "LIST") { listCmd(program); } else if (firstToken == "INPUT" || firstToken == "PRINT" || firstToken == "LET") { scanner.saveToken(firstToken); Statement * stmt = parseStatement(scanner); stmt->execute(state); delete stmt; } else { int lineNumber = stringToInteger(firstToken); if (!scanner.hasMoreTokens()) { program.removeSourceLine(lineNumber); } else { int length = firstToken.length(); string source = line.substr(length); program.addSourceLine(lineNumber, source); Statement * stmt = parseStatement(scanner); program.setParsedStatement(lineNumber, stmt); } } }
void processLine(string line, Program & program, EvaluationContext & context) { TokenScanner scanner; scanner.ignoreWhitespace(); scanner.setInput(line); string firstToken = toUpperCase(scanner.nextToken()); if (firstToken == "RUN") { runProgram(program, context); } else if (firstToken == "LIST") { listProgram(program, scanner); } else if (firstToken == "CLEAR") { program.clear(); } else if (firstToken == "HELP") { if (!scanner.hasMoreTokens()) { displayHelp(); } else { specificHelp(scanner); } } else if (firstToken == "QUIT") { exit(0); } else { int lineNumber = stringToInteger(firstToken); if (!scanner.hasMoreTokens()) { program.removeSourceLine(lineNumber); } else { Statement *stmt = parseStatement(scanner); program.addSourceLine(lineNumber, line); program.setParsedStatement(lineNumber, stmt); } } }
/* * Function: processLine * Usage: processLine(line, program, state); * ----------------------------------------- * Processes a single line entered by the user. In this version, * the implementation does exactly what the interpreter program * does in Chapter 19: read a line, parse it as an expression, * and then print the result. In your implementation, you will * need to replace this method with one that can respond correctly * when the user enters a program line (which begins with a number) * or one of the BASIC commands, such as LIST or RUN. */ void processLine(string line, Program & program, EvalState & state) { TokenScanner scanner; scanner.ignoreWhitespace(); scanner.scanNumbers(); scanner.setInput(line); string token=scanner.nextToken(); TokenType type=scanner.getTokenType(token); int lineNumb; int priorLineNumb; if(type==NUMBER){ if(scanner.hasMoreTokens()){ program.addSourceLine(stringToInteger(token),line); Statement *stmt=parseStatement(scanner); program.setParsedStatement(stringToInteger(token),stmt); //link statement to line number } else program.removeSourceLine(stringToInteger(token)); } if(type==WORD){ if(token=="LIST"){ lineNumb=program.getFirstLineNumber(); while(lineNumb!=-1){ cout<<program.getSourceLine(lineNumb)<<endl; lineNumb=program.getNextLineNumber(lineNumb); } } else if(token=="RUN"){ state.setCurrentLine(program.getFirstLineNumber()); lineNumb=state.getCurrentLine(); while(lineNumb!=-1){ if(program.hasLineNumber(lineNumb)==false) error("Invalid line reference at program line "+integerToString(priorLineNumb)); Statement *stmt=program.getParsedStatement(lineNumb); state.setCurrentLine(program.getNextLineNumber(lineNumb)); stmt->execute(state); priorLineNumb=lineNumb; lineNumb=state.getCurrentLine(); } } else if(token=="CLEAR"){ program.clear(); } else if(token=="HELP"){ cout<<"Minimal Basic Statements"<<endl; cout<<"REM This statement used for comments"<<endl; cout<<"LET This statement is BASIC's assigment statement"<<endl; cout<<"PRINT In minimal BASIC, the PRINT statement has the form: "<<endl; cout<<" PRINT exp"<<endl; cout<<" where exp is an expression."<<endl; cout<<"INPUT In the minimal version of the BASIC interpreter, the INPUT statement has the form:"<<endl; cout<<" INPUT var"<<endl; cout<<" where var is a variable read in from the user"<<endl; cout<<"GOTO This statement has the syntax"<<endl; cout<<" GOTO n"<<endl; cout<<" which forces the program to continue from line n instead of continuing with the next statement"<<endl; cout<<"IF This statement provides conditional control. The syntax for this statement is: "<<endl; cout<<" IF exp1 op exp2 THEN n"<<endl; cout<<" where exp1 and exp2 are expressions and op is one of the conditional operators =, <, or >."<<endl; cout<<"END This statment marks the end of the program."<<endl; cout<<"Commands to control the BASIC interpreter"<<endl; cout<<"RUN This command starts program execution beginning at the lowest-numbered line. "<<endl; cout<<"LIST This command lists the steps in the program in numerical sequence."<<endl; cout<<"CLEAR This command deletes the program so the user can start entering a new one."<<endl; cout<<"HELP This command provides a simple help message describing the interpreter."<<endl; cout<<"QUIT Typing QUIT exits from the BASIC interpreter by calling exit(0)."<<endl; } else if(token=="QUIT"){ exit(0); } else cout<<"Invalid command"<<endl; } }
void processLine(string line, Program & program, EvalState & state) { /* TokenScanner scanner; scanner.ignoreWhitespace(); scanner.scanNumbers(); scanner.setInput(line); Expression *exp = parseExp(scanner); int value = exp->eval(state); cout << value << endl; delete exp;*/ TokenScanner scanner; scanner.ignoreWhitespace(); scanner.scanNumbers(); scanner.setInput(line); string token = scanner.nextToken(); TokenType type = scanner.getTokenType(token); if (type == WORD){ if (token == "RUN") { int current_line=program.getFirstLineNumber(); while (current_line>=0) { int next_line = program.getNextLineNumber(current_line); Statement* stat=program.getParsedStatement(current_line); StatementType type = stat->get_type(); if (type == END) break; if (type == GOTO) { ((Gotostmt*)stat)->execute(state,current_line); continue; } if (type == IF) { ((Ifstmt*)stat)->execute(state, current_line); if (current_line != -2) continue; } stat->execute(state); current_line = next_line; } } if (token == "QUIT") { exit(0); } if (token == "CLEAR") { program.clear(); EvalState state1; state = state1; } if (token == "HELP") { } if (token == "LIST") { int current_line = program.getFirstLineNumber(); while (current_line != -1) { cout << program.getSourceLine(current_line) << endl; current_line = program.getNextLineNumber(current_line); } } if (token == "INPUT"){ string st = scanner.nextToken(); if (scanner.hasMoreTokens()) error("SYNTAX ERROR"); Inputstmt inputst(st); inputst.execute(state); } if (token == "PRINT"){ Printstmt printst(scanner); printst.execute(state); } if (token == "LET") { Letstmt lets(scanner); lets.execute(state); } if (token != "RUN"&&token != "CLEAR"&&token != "HELP"&&token != "LIST"&&token != "QUIT"&&token != "PRINT"&&token != "LET"&&token != "INPUT") error("SYNTAX ERROR"); } else if (type == NUMBER){ int line_num = atoi(token.c_str()); string token2 = scanner.nextToken(); if (token2 == "") { program.removeSourceLine(line_num); return; } if (token2 == "REM") { string str, temp; while (scanner.hasMoreTokens()) { temp = scanner.nextToken(); str += temp; } Statement* remst = new Remstmt(str); program.setParsedStatement(line_num, remst); program.addSourceLine(line_num, line); return; } if (token2 == "LET") { Statement *letst = new Letstmt(scanner); program.setParsedStatement(line_num, letst); program.addSourceLine(line_num, line); return; } if (token2 == "PRINT") { Statement *printst = new Printstmt(scanner); program.setParsedStatement(line_num, printst); program.addSourceLine(line_num, line); return; } if (token2 == "INPUT") { string st = scanner.nextToken(); if (scanner.hasMoreTokens()) error("SYNTAX ERROR"); Statement* inputstat = new Inputstmt(st); program.setParsedStatement(line_num, inputstat); program.addSourceLine(line_num, line); return; } if (token2 == "GOTO") { string token_tmp = scanner.nextToken(); TokenType type = scanner.getTokenType(token_tmp); if (type != NUMBER) error("SYNTAX ERROR"); if (scanner.hasMoreTokens()) error("SYNTAX ERROR"); int linenum = atoi(token_tmp.c_str()); Statement* gotostat = new Gotostmt(linenum); program.setParsedStatement(line_num, gotostat); program.addSourceLine(line_num, line); return; } if (token2 == "IF") { TokenScanner Lscanner; TokenScanner Rscanner; string left, right, tmp, cmp; while (scanner.hasMoreTokens()) { tmp = scanner.nextToken(); if (tmp == "=" || tmp == ">" || tmp == "<") { cmp = tmp; break; } else left = left + tmp; } if (cmp != "="&&cmp != "<"&&cmp != ">") error("SYNTAX ERROR"); while (scanner.hasMoreTokens()) { tmp = scanner.nextToken(); if (tmp == "THEN") break; else right = right + tmp; } if (tmp != "THEN") error("SYNTAX ERROR"); string token_tmp = scanner.nextToken(); TokenType type = scanner.getTokenType(token_tmp); if (type != NUMBER) error("SYNTAX ERROR"); if (scanner.hasMoreTokens()) error("SYNTAX ERROR"); int linenum = atoi(token_tmp.c_str()); Lscanner.setInput(left); Rscanner.setInput(right); Expression *lexp = parseExp(Lscanner); Expression *rexp = parseExp(Rscanner); Statement* ifstat = new Ifstmt(lexp, rexp, cmp, linenum); program.setParsedStatement(line_num, ifstat); program.addSourceLine(line_num, line); return; } if (token2 == "END") { Statement* endstat=new Endstmt(); program.setParsedStatement(line_num, endstat); program.addSourceLine(line_num, line); return; } error("SYNTAX ERROR"); } else error("SYNTAX ERROR"); }