?? preprocessor.java.svn-base
字號:
/*******************************************************************************SiJaPP - Simple Java PreProcessorCopyright (C) 2003 Manuel LinsmayerThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*******************************************************************************/package sijapp;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.util.Enumeration;import java.util.Hashtable;import java.util.Stack;import java.util.Vector;public class Preprocessor { // Defines private Hashtable defines; private Hashtable localDefines = new Hashtable(); // Input stream private BufferedReader reader; // Output stream private BufferedWriter writer; // Line counter private int lineNum; // Stop flag private boolean stop; // Skip flag/stack private boolean skip; private Stack skipStack = new Stack(); // Done flag/stack private boolean done; private Stack doneStack = new Stack(); // Constructor public Preprocessor(Hashtable defines) { this.defines = defines; } // Evaluate expression public Scanner.Token[] evalExpr(Scanner.Token[] tokens) throws SijappException { // Create token vector Vector t = new Vector(); for (int i = 0; i < tokens.length; i++) { t.add(tokens[i]); } main: while(true) { // T_EXPR_PRS_LEFT T_BOOL T_EXPR_PRS_RIGHT 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_EXPR_PRS_LEFT) && (t2.getType() == Scanner.Token.T_BOOL) && (t3.getType() == Scanner.Token.T_EXPR_PRS_RIGHT)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, t2); continue main; } } // T_IDENT/T_STRING/T_EXPR_DEF T_EXPR_EQ T_IDENT/T_STRING/T_EXPR_DEF 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_IDENT) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_IDENT)) { t.remove(i+2); t.remove(i+1); t.remove(i); String left = (String) this.localDefines.get(t1.getValue()); String right = (String) this.localDefines.get(t3.getValue()); if (((left == null) && (right != null)) || ((left != null) && (right == null))) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(false))); continue main; } else if ((left == null) && (right == null)) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(true))); continue main; } else { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(left.equals(right)))); continue main; } } else if ((t1.getType() == Scanner.Token.T_IDENT) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_STRING)) { t.remove(i+2); t.remove(i+1); t.remove(i); String left = (String) this.localDefines.get(t1.getValue()); String right = (String) t3.getValue(); if (left == null) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(false))); continue main; } else { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(left.equals(right)))); continue main; } } else if ((t1.getType() == Scanner.Token.T_IDENT) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_EXPR_DEF)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(this.localDefines.containsKey(t1.getValue())))); continue main; } else if ((t1.getType() == Scanner.Token.T_STRING) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_IDENT)) { t.remove(i+2); t.remove(i+1); t.remove(i); String right = (String) this.localDefines.get(t1.getValue()); String left = (String) t1.getValue(); if (left == null) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(false))); continue main; } else { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(left.equals(right)))); continue main; } } else if ((t1.getType() == Scanner.Token.T_STRING) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_STRING)) { t.remove(i+2); t.remove(i+1); t.remove(i); String left = (String) t1.getValue(); String right = (String) t3.getValue(); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(left.equals(right)))); continue main; } else if ((t1.getType() == Scanner.Token.T_STRING) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_EXPR_DEF)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(true))); continue main; } else if ((t1.getType() == Scanner.Token.T_EXPR_DEF) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_IDENT)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(this.localDefines.containsKey(t3.getValue())))); continue main; } else if ((t1.getType() == Scanner.Token.T_EXPR_DEF) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_STRING)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(true))); continue main; } else if ((t1.getType() == Scanner.Token.T_EXPR_DEF) && (t2.getType() == Scanner.Token.T_EXPR_EQ) && (t3.getType() == Scanner.Token.T_EXPR_DEF)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(true))); continue main; } } // T_IDENT/T_STRING/T_EXPR_DEF T_EXPR_NEQ T_IDENT/T_STRING/T_EXPR_DEF 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_IDENT) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_IDENT)) { t.remove(i+2); t.remove(i+1); t.remove(i); String left = (String) this.localDefines.get(t1.getValue()); String right = (String) this.localDefines.get(t3.getValue()); if (((left == null) && (right != null)) || ((left != null) && (right == null))) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(true))); continue main; } else if ((left == null) && (right == null)) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(false))); continue main; } else { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(!left.equals(right)))); continue main; } } else if ((t1.getType() == Scanner.Token.T_IDENT) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_STRING)) { t.remove(i+2); t.remove(i+1); t.remove(i); String left = (String) this.localDefines.get(t1.getValue()); String right = (String) t3.getValue(); if (left == null) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(true))); continue main; } else { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(!left.equals(right)))); continue main; } } else if ((t1.getType() == Scanner.Token.T_IDENT) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_EXPR_DEF)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(!this.localDefines.containsKey(t1.getValue())))); continue main; } else if ((t1.getType() == Scanner.Token.T_STRING) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_IDENT)) { t.remove(i+2); t.remove(i+1); t.remove(i); String right = (String) this.localDefines.get(t1.getValue()); String left = (String) t1.getValue(); if (left == null) { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(true))); continue main; } else { t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(!left.equals(right)))); continue main; } } else if ((t1.getType() == Scanner.Token.T_STRING) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_STRING)) { t.remove(i+2); t.remove(i+1); t.remove(i); String left = (String) t1.getValue(); String right = (String) t3.getValue(); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(!left.equals(right)))); continue main; } else if ((t1.getType() == Scanner.Token.T_STRING) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_EXPR_DEF)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(false))); continue main; } else if ((t1.getType() == Scanner.Token.T_EXPR_DEF) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_IDENT)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(!this.localDefines.containsKey(t3.getValue())))); continue main; } else if ((t1.getType() == Scanner.Token.T_EXPR_DEF) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_STRING)) { t.remove(i+2); t.remove(i+1); t.remove(i); t.add(i, new Scanner.Token(Scanner.Token.T_BOOL, new Boolean(false))); continue main; } else if ((t1.getType() == Scanner.Token.T_EXPR_DEF) && (t2.getType() == Scanner.Token.T_EXPR_NEQ) && (t3.getType() == Scanner.Token.T_EXPR_DEF)) { t.remove(i+2); t.remove(i+1);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -