Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.io.*;
- public class Parse
- {
- private String line; // our input buffer
- private int [] vars;
- private Scanner scan;
- private boolean eval;
- public Parse()
- {
- line = "";
- vars = new int[26];
- for (int i=0; i<26; i++)
- vars[i] = 0;
- scan = new Scanner(System.in);
- }
- public void run() throws IOException
- {
- String token;
- System.out.print("> ");
- token = getToken();
- parseCode(token); // ::= <code> .
- }
- public void parseCode(String token) throws IOException
- {
- do {
- parseStmt(token); // ::= <statement> <code> | <statment>
- token = getToken();
- } while (!token.equals("."));
- }
- public void parseStmt(String token) throws IOException
- {
- int val;
- String text;
- if (token.equals("load")) // ::= load <string>
- {
- token = getToken();
- text = parseString(token);
- line = loadFile(text) + line;
- }
- else if (token.equals("print")) // ::= print <string> | print <expr>
- {
- token = getToken();
- if (token.charAt(0) == '"')
- {
- text = parseString (token);
- // execute part
- if (eval == true)
- System.out.println(text);
- }
- else
- {
- val = parseExpr(token);
- // execute part
- if (eval == true)
- System.out.println(val);
- }
- }
- else if (token.equals("input")) // ::= input <var>
- {
- token = getToken();
- val = parseVar(token);
- // execute part
- if (eval == true)
- {
- System.out.print("? ");
- val = scan.nextInt();
- storeVar(token, val);
- }
- }
- else if (token.equals("if"))
- {
- token = getToken();
- // determines whether the condition was true or not
- boolean cond = parseCond(token);
- // assigns the boolean value (true or false) to the global eval boolean
- eval = cond;
- token = getToken();
- parseStmt(token);
- }
- else if (isVar(token))
- {
- }
- else
- {
- reportError(token);
- }
- eval = true;
- }
- public int parseExpr(String token)
- {
- int val;
- val = parseVal(token);
- token = getToken();
- switch(token.charAt(0))
- {
- case '+':
- token = getToken();
- val = val + parseVal(token); // ::= <val> + <val>
- break;
- case '-':
- token = getToken();
- val = val - parseVal(token); // ::= <val> - <val>
- break;
- case '*':
- token = getToken();
- val = val * parseVal(token); // ::= <val> * <val>
- break;
- case '/':
- token = getToken();
- val = val / parseVal(token); // ::= <val> / <val>
- break;
- default: // oops, a unary experssion
- line = token + line;
- }
- return val;
- }
- public String parseString(String token)
- {
- String text = "";
- if (!token.equals("\""))
- reportError(token);
- int i;
- for (i=0; i<line.length(); i++)
- if (line.charAt(i) != '"')
- {
- if (line.charAt(i) == '\n' || line.charAt(i) == '\r')
- reportError(text);
- text += line.charAt(i);
- }
- else
- {
- line = line.substring(i+1); // removes string including "
- break;
- }
- if (i == line.length())
- reportError(text);
- return text;
- }
- public boolean parseCond(String token)
- {
- int val;
- boolean cond = false;
- val = parseVal(token);
- token = getToken();
- switch(token.charAt(0))
- {
- case '=':
- token = getToken(); // skip extra equals sign
- token = getToken();
- cond = val == parseVal(token); // ::= <val> + <val>
- break;
- case '<':
- token = getToken();
- cond = val < parseVal(token); // ::= <val> - <val>
- break;
- case '>':
- token = getToken();
- cond = val > parseVal(token); // ::= <val> * <val>
- break;
- default:
- line = token + line;
- }
- return cond;
- }
- public String loadFile(String name) throws IOException
- {
- String text = "";
- Scanner fileScan = new Scanner(new File(name));
- while (fileScan.hasNext())
- text += fileScan.nextLine() + "\n";
- fileScan.close();
- return text;
- }
- public int parseVal(String token)
- {
- if (isNumeric(token))
- return Integer.parseInt(token); // ::= <num>
- else if (isVar(token))
- return parseVar(token); // ::= <var>
- else
- reportError(token);
- return -1; // should never happen
- }
- public int parseVar(String token)
- {
- if (!isVar(token))
- reportError(token);
- return vars [ ((int)(token.charAt(0))) - 97 ];
- }
- public void storeVar(String token, int val)
- {
- vars[ ((int)(token.charAt(0))) - 97 ] = val;
- }
- public boolean isNumeric(String token)
- {
- for (int i=0; i<token.length(); i++)
- if(!Character.isDigit(token.charAt(i)))
- return false;
- return true;
- }
- public boolean isVar(String token)
- {
- return (token.length() == 1) && isAlpha(token.charAt(0));
- }
- public boolean isAlpha(char ch)
- {
- return ((int) ch) >= 97 && ((int) ch) <= 122;
- }
- public void reportError(String token)
- {
- line += "\n";
- System.out.println("ERROR: " + token + line.substring(0, line.indexOf('\n')));
- for (int i = 0; i< token.length()+7; i++)
- System.out.print(" ");
- System.out.println("^");
- System.exit(-1);
- }
- public boolean isBlank(char ch)
- {
- switch (ch)
- {
- case ' ':
- case '\t':
- case '\r': case '\n':
- return true;
- }
- return false;
- }
- public boolean isSymbol(char ch)
- {
- switch (ch)
- {
- case '.':
- case '+': case '-': case '*' : case '/':
- case '=': case '>': case '<':
- case '"':
- return true;
- }
- return false;
- }
- public boolean isDelim(char ch)
- {
- return isBlank(ch) || isSymbol(ch);
- }
- public String skipBlanks(String buffer)
- {
- int i;
- for (i = 0; i<buffer.length(); i++)
- if (!isBlank(buffer.charAt(i)))
- break;
- return line.substring(i);
- }
- public String getToken()
- {
- int i;
- String token;
- line = skipBlanks(line);
- while (line.length() == 0)
- {
- line = scan.nextLine();
- line = skipBlanks(line);
- }
- for (i=0; i<line.length(); i++)
- if (isDelim(line.charAt(i)))
- {
- if (i == 0)
- i++;
- break;
- }
- token = line.substring(0, i);
- line = line.substring(i);
- return token;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement