?? preprocessor.java
字號(hào):
t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(false))); continue main; } } // T_EXPR_NOT T_BOOL for (int i = 0; i < t.size()-1; i++) { Scanner.Token t1 = (Scanner.Token) t.get(i); Scanner.Token t2 = (Scanner.Token) t.get(i+1); if ((t1.getType() == Scanner.Token.T_EXPR_NOT) && (t2.getType() == Scanner.Token.T_BOOL)) { t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(!((Boolean) t2.getValue()).booleanValue()))); continue main; } } // T_BOOL T_EXPR_AND T_BOOL for (int i = 0; i < t.size()-2; i++) { Scanner.Token t1 = (Scanner.Token) t.get(i); Scanner.Token t2 = (Scanner.Token) t.get(i+1); Scanner.Token t3 = (Scanner.Token) t.get(i+2); if ((t1.getType() == Scanner.Token.T_BOOL) && (t2.getType() == Scanner.Token.T_EXPR_AND) && (t3.getType() == Scanner.Token.T_BOOL)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(((Boolean) t1.getValue()).booleanValue() && ((Boolean) t3.getValue()).booleanValue()))); continue main; } } // T_BOOL T_EXPR_OR T_BOOL for (int i = 0; i < t.size()-2; i++) { Scanner.Token t1 = (Scanner.Token) t.get(i); Scanner.Token t2 = (Scanner.Token) t.get(i+1); Scanner.Token t3 = (Scanner.Token) t.get(i+2); if ((t1.getType() == Scanner.Token.T_BOOL) && (t2.getType() == Scanner.Token.T_EXPR_OR) && (t3.getType() == Scanner.Token.T_BOOL)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(((Boolean) t1.getValue()).booleanValue() || ((Boolean) t3.getValue()).booleanValue()))); continue main; } } break; } // Return resulting tokens as array Scanner.Token[] ret = new Scanner.Token[t.size()]; t.copyInto(ret); return (ret); } // Evaluate condition (if/unless/elseif/else/end) statement public void evalCond(Scanner.Token[] tokens) throws SijappException { // Copy non-evaluted tokens to new array Scanner.Token[] remainingTokens = new Scanner.Token[tokens.length - 2]; System.arraycopy(tokens, 2, remainingTokens, 0, tokens.length - 2); // Command condition.if if ((tokens.length >= 2) && (tokens[0].getType() == Scanner.Token.T_SEP) && (tokens[1].getType() == Scanner.Token.T_CMD2_IF)) { // Evaluate expression and check result type Scanner.Token[] resultingTokens = this.evalExpr(remainingTokens); if ((resultingTokens.length != 1) || (resultingTokens[0].getType() != Scanner.Token.T_BOOL)) { throw (new SijappException("Syntax error")); } boolean result = ((Boolean) resultingTokens[0].getValue()).booleanValue(); // Save state variables this.skipStack.push(new Boolean(this.skip)); this.doneStack.push(new Boolean(this.done)); // Set state variables this.skip |= !result; this.done = result; } // Command condition.elseif else if ((tokens.length >= 2) && (tokens[0].getType() == Scanner.Token.T_SEP) && (tokens[1].getType() == Scanner.Token.T_CMD2_ELSEIF)) { // Evaluate expression and check result type Scanner.Token[] resultingTokens = this.evalExpr(remainingTokens); if ((resultingTokens.length != 1) || (resultingTokens[0].getType() != Scanner.Token.T_BOOL)) { throw (new SijappException("Syntax error")); } boolean result = ((Boolean) resultingTokens[0].getValue()).booleanValue(); // Set state variables this.skip = ((Boolean) this.skipStack.peek()).booleanValue() || this.done || !result; this.done |= result; } // Command condition.else else if ((tokens.length == 2) && (tokens[0].getType() == Scanner.Token.T_SEP) && (tokens[1].getType() == Scanner.Token.T_CMD2_ELSE)) { // Set state variables this.skip = ((Boolean) this.skipStack.peek()).booleanValue() || this.done; this.done = true; } // Command condition.end else if ((tokens.length == 2) && (tokens[0].getType() == Scanner.Token.T_SEP) && (tokens[1].getType() == Scanner.Token.T_CMD2_END)) { // Reset state variables this.skip = ((Boolean) this.skipStack.pop()).booleanValue(); this.done = ((Boolean) this.doneStack.pop()).booleanValue(); } // Unknown command/Syntax error else { throw (new SijappException("Syntax error")); } } // Evaluate echo statement public void evalEcho(Scanner.Token[] tokens) throws SijappException { if ((tokens.length != 1) || (tokens[0].getType() != Scanner.Token.T_STRING)) { throw (new SijappException("Syntax error")); } else if (!this.skip) { String s = (String) tokens[0].getValue(); try { writer.write(s, 0, s.length()); writer.newLine(); } catch (IOException e) { throw (new SijappException("An I/O error occured")); } } } // Evaluate enviroment statement public void evalEnv(Scanner.Token[] tokens) throws SijappException { if ((tokens.length == 3) && (tokens[0].getType() == Scanner.Token.T_SEP) && (tokens[1].getType() == Scanner.Token.T_CMD2_DEF) && (tokens[2].getType() == Scanner.Token.T_IDENT)) { if (!this.skip) { this.localDefines.put(tokens[2].getValue(), "defined"); } } else if ((tokens.length == 4) && (tokens[0].getType() == Scanner.Token.T_SEP) && (tokens[1].getType() == Scanner.Token.T_CMD2_DEF) && (tokens[2].getType() == Scanner.Token.T_IDENT) && (tokens[3].getType() == Scanner.Token.T_STRING)) { if (!this.skip) { this.localDefines.put(tokens[2].getValue(), tokens[3].getValue()); } } else if ((tokens.length == 3) && (tokens[0].getType() == Scanner.Token.T_SEP) && (tokens[1].getType() == Scanner.Token.T_CMD2_UNDEF) && (tokens[2].getType() == Scanner.Token.T_IDENT)) { if (!this.skip) { this.localDefines.remove(tokens[2].getValue()); } } else { throw (new SijappException("Syntax error")); } } // Evaluate exit statement public void evalExit(Scanner.Token[] tokens) throws SijappException { if (tokens.length != 0) { throw (new SijappException("Syntax error")); } else if (!this.skip) { this.stop = true; } } // Evaluate SiJaPP statement public void eval(Scanner.Token[] tokens) throws SijappException { // Valid statement consists of at least 3 tokens if (tokens.length < 3) { throw (new SijappException("Syntax error")); } // Look for MAGIC_BEGIN and MAGIC_END if ((tokens[0].getType() != Scanner.Token.T_MAGIC_BEGIN) || (tokens[tokens.length-1].getType() != Scanner.Token.T_MAGIC_END)) { throw (new SijappException("Syntax error")); } // Copy non-evaluted tokens to new array Scanner.Token[] remainingTokens = new Scanner.Token[tokens.length - 3]; System.arraycopy(tokens, 2, remainingTokens, 0, tokens.length - 3); // Delegate evaluation switch (tokens[1].getType()) { case Scanner.Token.T_CMD1_COND: this.evalCond(remainingTokens); break; case Scanner.Token.T_CMD1_ECHO: this.evalEcho(remainingTokens); break; case Scanner.Token.T_CMD1_ENV: this.evalEnv(remainingTokens); break; case Scanner.Token.T_CMD1_EXIT: this.evalExit(remainingTokens); break; default: throw (new SijappException("Syntax error")); } } // Preprocess public void run(BufferedReader reader, BufferedWriter writer) throws SijappException { // Restore global defines this.localDefines.clear(); for (Enumeration keys = this.defines.keys(); keys.hasMoreElements(); ) { String key = new String((String) keys.nextElement()); String value = new String((String) this.defines.get(key)); this.localDefines.put(key, value); } // Save input/output stream this.reader = reader; this.writer = writer; // Reset line counter this.lineNum = 1; // Reset stop flag this.stop = false; // Reset skip flag this.skip = false; // Read until EOF try { String line; while ((line = this.reader.readLine()) != null) { // Scan read line for s SiJaPP statement Scanner.Token[] tokens = Scanner.scan(line); // Get rid of special sijapp comments //# if inside an sijapp statement if (tokens.length == 0 && line.trim().startsWith("//#") && this.doneStack.size() > 0) line = line.trim().substring(3); // No statement has been found if (tokens.length == 0) { if (!skip) { this.writer.write(line, 0, line.length()); this.writer.newLine(); } else { this.writer.write("//# "+line, 0, line.length()+4); this.writer.newLine(); } } // A statement has been found else { this.eval(tokens); this.writer.write(line, 0, line.length()); this.writer.newLine(); if (this.stop) { return; } } // Advance line counter this.lineNum++; } } catch (SijappException e) { throw (new SijappException(this.lineNum + ": " + e.getMessage())); } catch (IOException e) { throw (new SijappException("An I/O error occured")); } }}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -