示例#1
0
文件: Basic.cpp 项目: sjmjulia/basic
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);
            }
        }
    }
	
	
}
示例#2
0
文件: Basic.cpp 项目: jwhurt/Projects
/*
 * 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;     
   }
}
示例#3
0
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");
}