⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semanticize.java

📁 java 编译器java复杂编译器,可以编译java文件的类库
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * Copyright © 2002 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * California 95054, U.S.A. All rights reserved.  Sun Microsystems, Inc. has * intellectual property rights relating to technology embodied in the product * that is described in this document. In particular, and without limitation, * these intellectual property rights may include one or more of the U.S. * patents listed at http://www.sun.com/patents and one or more additional * patents or pending patent applications in the U.S. and in other countries. * U.S. Government Rights - Commercial software. Government users are subject * to the Sun Microsystems, Inc. standard license agreement and applicable * provisions of the FAR and its supplements.  Use is subject to license terms. * Sun,  Sun Microsystems,  the Sun logo and  Java are trademarks or registered * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.  This * product is covered and controlled by U.S. Export Control laws and may be * subject to the export or import laws in other countries.  Nuclear, missile, * chemical biological weapons or nuclear maritime end uses or end users, * whether direct or indirect, are strictly prohibited.  Export or reexport * to countries subject to U.S. embargo or to entities identified on U.S. * export exclusion lists, including, but not limited to, the denied persons * and specially designated nationals lists is strictly prohibited. */package org.javacc.parser;public class Semanticize extends JavaCCGlobals {  static java.util.Vector removeList = new java.util.Vector();  static java.util.Vector itemList = new java.util.Vector();  static void prepareToRemove(java.util.Vector vec, Object item) {    removeList.addElement(vec);    itemList.addElement(item);  }  static void removePreparedItems() {    for (int i = 0; i < removeList.size(); i++) {      java.util.Vector vec = (java.util.Vector)(removeList.elementAt(i));      vec.removeElement(itemList.elementAt(i));    }    removeList.removeAllElements();    itemList.removeAllElements();  }  static public void start() throws MetaParseException {    if (JavaCCErrors.get_error_count() != 0) throw new MetaParseException();    if (Options.I("LOOKAHEAD") > 1 && !Options.B("FORCE_LA_CHECK") && Options.B("SANITY_CHECK")) {      JavaCCErrors.warning("Lookahead adequacy checking not being performed since option LOOKAHEAD is more than 1.  Set option FORCE_LA_CHECK to true to force checking.");    }    /*     * The following walks the entire parse tree to convert all LOOKAHEAD's     * that are not at choice points (but at beginning of sequences) and converts     * them to trivial choices.  This way, their semantic lookahead specification     * can be evaluated during other lookahead evaluations.     */    for (java.util.Enumeration enum = bnfproductions.elements(); enum.hasMoreElements();) {      ExpansionTreeWalker.postOrderWalk(((NormalProduction)enum.nextElement()).expansion, new LookaheadFixer());    }    /*     * The following loop populates "production_table"     */    for (java.util.Enumeration enum = bnfproductions.elements(); enum.hasMoreElements();) {      NormalProduction p = (NormalProduction)enum.nextElement();      if (production_table.put(p.lhs, p) != null) {        JavaCCErrors.semantic_error(p, p.lhs + " occurs on the left hand side of more than one production.");      }    }    /*     * The following walks the entire parse tree to make sure that all     * non-terminals on RHS's are defined on the LHS.     */    for (java.util.Enumeration enum = bnfproductions.elements(); enum.hasMoreElements();) {      ExpansionTreeWalker.preOrderWalk(((NormalProduction)enum.nextElement()).expansion, new ProductionDefinedChecker());    }    /*     * The following loop ensures that all target lexical states are     * defined.  Also piggybacking on this loop is the detection of     * <EOF> and <name> in token productions.  After reporting an     * error, these entries are removed.  Also checked are definitions     * on inline private regular expressions.     * This loop works slightly differently when USER_TOKEN_MANAGER     * is set to true.  In this case, <name> occurrences are OK, while     * regular expression specs generate a warning.     */    for (java.util.Enumeration enum = rexprlist.elements(); enum.hasMoreElements();) {      TokenProduction tp = (TokenProduction)(enum.nextElement());      java.util.Vector respecs = tp.respecs;      for (java.util.Enumeration enum1 = respecs.elements(); enum1.hasMoreElements();) {        RegExprSpec res = (RegExprSpec)(enum1.nextElement());        if (res.nextState != null) {          if (lexstate_S2I.get(res.nextState) == null) {            JavaCCErrors.semantic_error(res.nsTok, "Lexical state \"" + res.nextState + "\" has not been defined.");          }        }        if (res.rexp instanceof REndOfFile) {          //JavaCCErrors.semantic_error(res.rexp, "Badly placed <EOF>.");          if (tp.lexStates != null)            JavaCCErrors.semantic_error(res.rexp, "EOF action/state change must be specified for all states, i.e., <*>TOKEN:.");          if (tp.kind != TokenProduction.TOKEN)            JavaCCErrors.semantic_error(res.rexp, "EOF action/state change can be specified only in a TOKEN specification.");          if (nextStateForEof != null || actForEof != null)            JavaCCErrors.semantic_error(res.rexp, "Duplicate action/state change specification for <EOF>.");          actForEof = res.act;          nextStateForEof = res.nextState;          prepareToRemove(respecs, res);        } else if (tp.isExplicit && Options.B("USER_TOKEN_MANAGER")) {          JavaCCErrors.warning(res.rexp, "Ignoring regular expression specification since option USER_TOKEN_MANAGER has been set to true.");        } else if (tp.isExplicit && !Options.B("USER_TOKEN_MANAGER") && res.rexp instanceof RJustName) {            JavaCCErrors.warning(res.rexp, "Ignoring free-standing regular expression reference.  If you really want this, you must give it a different label as <NEWLABEL:<" + res.rexp.label + ">>.");            prepareToRemove(respecs, res);        } else if (!tp.isExplicit && res.rexp.private_rexp) {          JavaCCErrors.semantic_error(res.rexp, "Private (#) regular expression cannot be defined within grammar productions.");        }      }    }    removePreparedItems();    /*     * The following loop inserts all names of regular expressions into     * "named_tokens_table" and "ordered_named_tokens".     * Duplications are flagged as errors.     */    for (java.util.Enumeration enum = rexprlist.elements(); enum.hasMoreElements();) {      TokenProduction tp = (TokenProduction)(enum.nextElement());      java.util.Vector respecs = tp.respecs;      for (java.util.Enumeration enum1 = respecs.elements(); enum1.hasMoreElements();) {        RegExprSpec res = (RegExprSpec)(enum1.nextElement());        if (!(res.rexp instanceof RJustName) && !res.rexp.label.equals("")) {          String s = res.rexp.label;          Object obj = named_tokens_table.put(s, res.rexp);          if (obj != null) {            JavaCCErrors.semantic_error(res.rexp, "Multiply defined lexical token name \"" + s + "\".");          } else {            ordered_named_tokens.addElement(res.rexp);          }          if (lexstate_S2I.get(s) != null) {            JavaCCErrors.semantic_error(res.rexp, "Lexical token name \"" + s + "\" is the same as that of a lexical state.");          }        }      }    }    /*     * The following code merges multiple uses of the same string in the same     * lexical state and produces error messages when there are multiple     * explicit occurrences (outside the BNF) of the string in the same     * lexical state, or when within BNF occurrences of a string are duplicates     * of those that occur as non-TOKEN's (SKIP, MORE, SPECIAL_TOKEN) or private     * regular expressions.  While doing this, this code also numbers all     * regular expressions (by setting their ordinal values), and populates the     * table "names_of_tokens".     */    tokenCount = 1;    for (java.util.Enumeration enum = rexprlist.elements(); enum.hasMoreElements();) {      TokenProduction tp = (TokenProduction)(enum.nextElement());      java.util.Vector respecs = tp.respecs;      if (tp.lexStates == null) {        tp.lexStates = new String[lexstate_I2S.size()];        int i = 0;        for (java.util.Enumeration enum1 = lexstate_I2S.elements(); enum1.hasMoreElements();) {          tp.lexStates[i++] = (String)(enum1.nextElement());        }      }      java.util.Hashtable table[] = new java.util.Hashtable[tp.lexStates.length];      for (int i = 0; i < tp.lexStates.length; i++) {        table[i] = (java.util.Hashtable)simple_tokens_table.get(tp.lexStates[i]);      }      for (java.util.Enumeration enum1 = respecs.elements(); enum1.hasMoreElements();) {        RegExprSpec res = (RegExprSpec)(enum1.nextElement());        if (res.rexp instanceof RStringLiteral) {          RStringLiteral sl = (RStringLiteral)res.rexp;          // This loop performs the checks and actions with respect to each lexical state.          for (int i = 0; i < table.length; i++) {            // Get table of all case variants of "sl.image" into table2.            java.util.Hashtable table2 = (java.util.Hashtable)(table[i].get(sl.image.toUpperCase()));            if (table2 == null) {              // There are no case variants of "sl.image" earlier than the current one.              // So go ahead and insert this item.              if (sl.ordinal == 0) {                sl.ordinal = tokenCount++;              }              table2 = new java.util.Hashtable();              table2.put(sl.image, sl);              table[i].put(sl.image.toUpperCase(), table2);            } else if (hasIgnoreCase(table2, sl.image)) { // hasIgnoreCase sets "other" if it is found.              // Since IGNORE_CASE version exists, current one is useless and bad.              if (!sl.tpContext.isExplicit) {                // inline BNF string is used earlier with an IGNORE_CASE.                JavaCCErrors.semantic_error(sl, "String \"" + sl.image + "\" can never be matched due to presence of more general (IGNORE_CASE) regular expression at line " + other.line + ", column " + other.column + ".");              } else {                // give the standard error message.                JavaCCErrors.semantic_error(sl, "Duplicate definition of string token \"" + sl.image + "\" can never be matched.");              }            } else if (sl.tpContext.ignoreCase) {              // This has to be explicit.  A warning needs to be given with respect              // to all previous strings.              String pos = ""; int count = 0;              for (java.util.Enumeration enum2 = table2.elements(); enum2.hasMoreElements();) {                RegularExpression rexp = (RegularExpression)(enum2.nextElement());                if (count != 0) pos += ",";                pos += " line " + rexp.line;                count++;              }              if (count == 1) {                JavaCCErrors.warning(sl, "String with IGNORE_CASE is partially superceded by string at" + pos + ".");              } else {                JavaCCErrors.warning(sl, "String with IGNORE_CASE is partially superceded by strings at" + pos + ".");              }              // This entry is legitimate.  So insert it.              if (sl.ordinal == 0) {                sl.ordinal = tokenCount++;              }              table2.put(sl.image, sl);              // The above "put" may override an existing entry (that is not IGNORE_CASE) and that's              // the desired behavior.            } else {              // The rest of the cases do not involve IGNORE_CASE.              RegularExpression re = (RegularExpression)table2.get(sl.image);              if (re == null) {                if (sl.ordinal == 0) {                  sl.ordinal = tokenCount++;                }                table2.put(sl.image, sl);              } else if (tp.isExplicit) {                // This is an error even if the first occurrence was implicit.                if (tp.lexStates[i].equals("DEFAULT")) {                  JavaCCErrors.semantic_error(sl, "Duplicate definition of string token \"" + sl.image + "\".");                } else {                  JavaCCErrors.semantic_error(sl, "Duplicate definition of string token \"" + sl.image + "\" in lexical state \"" + tp.lexStates[i] + "\".");                }              } else if (re.tpContext.kind != TokenProduction.TOKEN) {                JavaCCErrors.semantic_error(sl, "String token \"" + sl.image + "\" has been defined as a \"" + TokenProduction.kindImage[re.tpContext.kind] + "\" token.");              } else if (re.private_rexp) {                JavaCCErrors.semantic_error(sl, "String token \"" + sl.image + "\" has been defined as a private regular expression.");              } else {                // This is now a legitimate reference to an existing RStringLiteral.                // So we assign it a number and take it out of "rexprlist".                // Therefore, if all is OK (no errors), then there will be only unequal                // string literals in each lexical state.  Note that the only way                // this can be legal is if this is a string declared inline within the                // BNF.  Hence, it belongs to only one lexical state - namely "DEFAULT".                sl.ordinal = re.ordinal;                prepareToRemove(respecs, res);              }            }          }        } else if (!(res.rexp instanceof RJustName)) {          res.rexp.ordinal = tokenCount++;        }        if (!(res.rexp instanceof RJustName) && !res.rexp.label.equals("")) {          names_of_tokens.put(new Integer(res.rexp.ordinal), res.rexp.label);        }        if (!(res.rexp instanceof RJustName)) {          rexps_of_tokens.put(new Integer(res.rexp.ordinal), res.rexp);        }      }    }    removePreparedItems();    /*     * The following code performs a tree walk on all regular expressions     * attaching links to "RJustName"s.  Error messages are given if     * undeclared names are used, or if "RJustNames" refer to private     * regular expressions or to regular expressions of any kind other     * than TOKEN.  In addition, this loop also removes top level     * "RJustName"s from "rexprlist".

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -