Demo entry 6781884

TPL

   

Submitted by anonymous on Jan 06, 2019 at 04:53
Language: Java. Code size: 7.1 kB.

package com.coearse;

import java.util.Hashtable;
import java.util.Scanner;
import java.io.*;
public class TPLPromgram {
	static String str[] = { "INTEGER","STRING","LET","CALCULATE","PRINT","PRINTLN","END"};
	static Hashtable<String, Integer> Int = new Hashtable();
	static Hashtable<String, String> Str = new Hashtable();
	static int  num = 1;   //统计第num条指令
	
	static String getStrForLET (int tag , String str) { 
		//为LET指令服务的函数:tag为0和1时分别返回等号左右两边的字符串(变量名和值)
		int index = str.indexOf('=') ;
		String substr = " " ;
		if (tag == 0)
			substr = str.substring(0, index);
		else 
			substr = str.substring(index+1, str.length()) ;

		return substr;
	}
	static String getStrForCAL (int tag , String str, int sign ) {
		//为CALCULATE指令服务的函数:传入符号的下标,当tag=0,1,2时分别返回变量名和第一、第二个运算参数
		int index = str.indexOf('=') ;
		String substr = " " ;
		if (tag == 0)
			substr = str.substring(0, index);
		else if (tag == 1)
			substr = str.substring(index+1, sign);
		else 
			substr = str.substring(sign+1, str.length());
		
		return substr;
	}
	public static void main(String[] args) {
		String input = new String();
		Scanner sc = new Scanner(System.in);
		
		try {         // 防止文件建立或读取失败,用catch捕捉错误并打印
            /* 准备工作:读入文件 */  
            String pathname = "Input.tpl";
            File filename = new File(pathname); 
            InputStreamReader reader = new InputStreamReader( new FileInputStream(filename)); // 建立一个输入流对象reader  
            BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言  
            String line = "";  
            line = br.readLine(); 
            System.out.println("java TPLPromgram " + pathname );
            System.out.println("TPL Interpreter by Fanyi Lu\r\n");
            while (line != null) {  //开始正式处理每行数据
                input = br.readLine().trim(); // 一次读入一行数据并去除头尾空格,这一行数据叫做input
    			if(input.length() == 0 ) //遇到空行时跳过(只要是空行 经过trim处理就是空串,长度为0)
    				continue;
    			
                num++;
                /* 先处理绝对没有参数的两种情况 : 整行注释 和  END */
    			if (input.charAt(0) == '#')   //如果整行为注释
    				continue;
    			else if (input.contains(str[6]) ) {      //END,程序结束 (后面有内容的话只可能是注释和空格)
    				
    				System.out.println("TPL Finished OK [" + num + " lines processed].");
    				break;
    			}
    			/* 进行下面的处理前,先去掉注释      */
    			if(input.contains("#") )  //如果一行部分注释,需要去掉注释和空白
    				input = input.substring(0, input.indexOf("#")).trim() ;
    			
    			/* 剩下的情况有参数   (除了PRINTLN后面可能没有)*/
    			/* 对input进行处理,将input分为command(空格左侧,保留字) 和 par(空格右侧,parameter参数)  */
    			String command = input, par = "!" ;
    			int index = input.indexOf(' ');
    			if (index != -1) {
    				command =input.substring(0, index);
    				par = input.substring(index+1, input.length());		
    			}
    			
    			/*     根据保留字进行不同的处理        */
    			if (command.equals(str[0]) )     	 //声明整型变量——保留字INTEGER
    				Int.put(par, 0);
    			
    			else if ( command.equals(str[1]) ) 	 //声明字符串变量——保留字STRING
    				Str.put(par, "");

    			else if ( command.equals(str[2])  ) { 	 //为变量赋值——保留字LET
    				String value = getStrForLET(1,par) ;  //赋予变量的值——数字或者字符串
    				par = getStrForLET(0, par) ;	  //被赋值的变量名
    				if( !(Int.containsKey(par) || Str.containsKey(par)) )  { //如果待赋值变量不存在
    					System.out.println("ERROR:LET指令错误——待赋值变量错误");
    					break;
    				}
    				if(value.charAt(0) == '"') {
    					value = value.substring(1, value.length()-1 );
    					Str.put(par, value);
    				}
    				else {
    					int number = Integer.parseInt(value);
    					Int.put(par, number );
    				}
    				
    			}
    			
    			else if ( command.equals(str[3])  ) {   //进行算术运算——保留字CALCULATE 
    				int index1 =0, flag = 0;  // flag标记运算方式,1,2,3,4分别对应+,-,*,/
    				/*下面对par进行处理,判断运算类型,并获取运算符号的下标    */
    				if(par.contains("+") ) {
    					index1 = par.indexOf("+");
    					flag = 1;
    				}
    				else if (par.contains("-")) {
    					index1 = par.indexOf("-") ;
    					flag = 2;
    				}
    				else if (par.contains("*")) {
    					index1 = par.indexOf("*") ;
    					flag = 3;
    				}
    				else if (par.contains("/")) {
    					index1 = par.indexOf("/");
    					flag = 4;
    				}
    				else {
    					System.out.println("ERROR:CALCULATE指令错误——运算符错误");
    					break;
    				}
    				/*  根据运算符的位置,获取参数1,参数2和待赋值的变量名   */
    				String value1 = getStrForCAL(1, par, index1);
    				String value2 = getStrForCAL(2, par, index1);
    				par = getStrForCAL(0, par, index1);   //待赋值的变量
    				if(!Int.containsKey(par) ) {   //如果待赋值变量不存在
    					System.out.println("ERROR:CALCULATE指令错误——待保存变量错误");
    					break;
    				}
    				/*如果参数是变量名,那么取出相应数值并保存;否则参数本身就是数字,直接转换成数字保存  */
    				int num1= 0, num2 = 0, result = 0;
    				if (value1.charAt(0) >= '0' && value1.charAt(0) <= '9') 
    					num1 = Integer.parseInt(value1);
    				else {
    					if ( Int.containsKey(value1) )
    						num1 = Int.get(value1);		
    					else {
    						System.out.println("ERROR:CALCULATE指令错误——参数变量错误");
        					break;
    					}	
    				}
    				if (value2.charAt(0) >= '0' && value2.charAt(0) <= '9') 
    					num2 = Integer.parseInt(value2);
    				else {	
    					if ( Int.containsKey(value2) )
    						num2 = Int.get(value2);		
    					else {
    						System.out.println("ERROR:CALCULATE指令错误——参数变量错误");
        					break;
    					}	
    				}
    				/* 根据num1、num2进行运算 ,并赋值 */
    				if(flag ==4 && num2 == 0) {
    					System.out.println("ERROR:CALCULATE指令错误——除数为0错误");
    					break;
    				}
    				switch (flag) {
    				case 1:   //加法
    					result = num1 + num2;
    					Int.put(par, result);
    					break;
    				case 2:   //减法
    					result = num1 - num2;
    					Int.put(par, result);
    					break;
    				case 3:   //乘法
    					result = num1 * num2;
    					Int.put(par, result);
    					break;
    				case 4:   //除法
    					result = num1 / num2;
    					Int.put(par, result);
    					break;
    				}
    			}
    			
    			else if (command.contains("PRINT")  ) {   //如果par中含有“PRINT”,即需要输出
    				if(par.charAt(0) == '"') //如果输出某个固定的字符串
    					System.out.print(par.substring(1, par.length()-1 ));
    				else if ( Int.containsKey(par) ||  Str.containsKey(par) ) {  // 如果输出变量
    					if (Int.containsKey(par)  )   //如果输出int变量
    						System.out.print(   Int.get(par)   );
    					if (Str.containsKey(par)  )   //如果输出String变量
    						System.out.print(  Str.get(par) );
    				}
					else if (par != "!") {  //如果既不是输出固定字符串,也不存在这样的变量名,抛出错误
						System.out.println("ERROR:"+command+"指令错误——输出变量错误");
    					break;
					}	
    				if (command.length() > 5)  //如果命令是“PRINTLN”,需要追加回车
    					System.out.println("");	
    			}
    			else {
    				System.out.println("ERROR:保留字错误");
    				break;
    			}
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
		
	}

}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).