📄 parseengine.java
字号:
} return retval; } static void dumpFormattedString(String str) { char ch = ' '; char prevChar; boolean indentOn = true; for (int i = 0; i < str.length(); i++) { prevChar = ch; ch = str.charAt(i); if (ch == '\n' && prevChar == '\r') { // do nothing - we've already printed a new line for the '\r' // during the previous iteration. } else if (ch == '\n' || ch == '\r') { if (indentOn) { phase1NewLine(); } else { ostr.println(""); } } else if (ch == '\u0001') { indentamt += 2; } else if (ch == '\u0002') { indentamt -= 2; } else if (ch == '\u0003') { indentOn = false; } else if (ch == '\u0004') { indentOn = true; } else { ostr.print(ch); } } } static void buildPhase1Routine(BNFProduction p) { Token t; t = (Token)(p.return_type_tokens.elementAt(0)); boolean voidReturn = false; if (t.kind == JavaCCParserConstants.VOID) { voidReturn = true; } printTokenSetup(t); ccol = 1; printLeadingComments(t, ostr); ostr.print(" " + staticOpt() + "final public "); cline = t.beginLine; ccol = t.beginColumn; printTokenOnly(t, ostr); for (int i = 1; i < p.return_type_tokens.size(); i++) { t = (Token)(p.return_type_tokens.elementAt(i)); printToken(t, ostr); } printTrailingComments(t, ostr); ostr.print(" " + p.lhs + "("); if (p.parameter_list_tokens.size() != 0) { printTokenSetup((Token)(p.parameter_list_tokens.elementAt(0))); for (java.util.Enumeration enum = p.parameter_list_tokens.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); printToken(t, ostr); } printTrailingComments(t, ostr); } ostr.print(") throws ParseException"); for (java.util.Enumeration enum = p.throws_list.elements(); enum.hasMoreElements();) { ostr.print(", "); java.util.Vector name = (java.util.Vector)enum.nextElement(); for (java.util.Enumeration enum1 = name.elements(); enum1.hasMoreElements();) { t = (Token)enum1.nextElement(); ostr.print(t.image); } } ostr.print(" {"); indentamt = 4; if (Options.B("DEBUG_PARSER")) { ostr.println(""); ostr.println(" trace_call(\"" + p.lhs + "\");"); ostr.print(" try {"); indentamt = 6; } if (p.declaration_tokens.size() != 0) { printTokenSetup((Token)(p.declaration_tokens.elementAt(0))); cline--; for (java.util.Enumeration enum = p.declaration_tokens.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); printToken(t, ostr); } printTrailingComments(t, ostr); } String code = phase1ExpansionGen(p.expansion); dumpFormattedString(code); ostr.println(""); if (p.jumpPatched && !voidReturn) { ostr.println(" throw new Error(\"Missing return statement in function\");"); } if (Options.B("DEBUG_PARSER")) { ostr.println(" } finally {"); ostr.println(" trace_return(\"" + p.lhs + "\");"); ostr.println(" }"); } ostr.println(" }"); ostr.println(""); } static void phase1NewLine() { ostr.println(""); for (int i = 0; i < indentamt; i++) { ostr.print(" "); } } static String phase1ExpansionGen(Expansion e) { String retval = ""; Token t = null; Lookahead[] conds; String[] actions; if (e instanceof RegularExpression) { RegularExpression e_nrw = (RegularExpression)e; retval += "\n"; if (e_nrw.lhsTokens.size() != 0) { printTokenSetup((Token)(e_nrw.lhsTokens.elementAt(0))); for (java.util.Enumeration enum = e_nrw.lhsTokens.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); retval += printToken(t); } retval += printTrailingComments(t); retval += " = "; } if (e_nrw.label.equals("")) { Object label = names_of_tokens.get(new Integer(e_nrw.ordinal)); if (label != null) { retval += "jj_consume_token(" + (String)label + ");"; } else { retval += "jj_consume_token(" + e_nrw.ordinal + ");"; } } else { retval += "jj_consume_token(" + e_nrw.label + ");"; } } else if (e instanceof NonTerminal) { NonTerminal e_nrw = (NonTerminal)e; retval += "\n"; if (e_nrw.lhsTokens.size() != 0) { printTokenSetup((Token)(e_nrw.lhsTokens.elementAt(0))); for (java.util.Enumeration enum = e_nrw.lhsTokens.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); retval += printToken(t); } retval += printTrailingComments(t); retval += " = "; } retval += e_nrw.name + "("; if (e_nrw.argument_tokens.size() != 0) { printTokenSetup((Token)(e_nrw.argument_tokens.elementAt(0))); for (java.util.Enumeration enum = e_nrw.argument_tokens.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); retval += printToken(t); } retval += printTrailingComments(t); } retval += ");"; } else if (e instanceof Action) { Action e_nrw = (Action)e; retval += "\u0003\n"; if (e_nrw.action_tokens.size() != 0) { printTokenSetup((Token)(e_nrw.action_tokens.elementAt(0))); ccol = 1; for (java.util.Enumeration enum = e_nrw.action_tokens.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); retval += printToken(t); } retval += printTrailingComments(t); } retval += "\u0004"; } else if (e instanceof Choice) { Choice e_nrw = (Choice)e; conds = new Lookahead[e_nrw.choices.size()]; actions = new String[e_nrw.choices.size() + 1]; actions[e_nrw.choices.size()] = "\n" + "jj_consume_token(-1);\n" + "throw new ParseException();"; // In previous line, the "throw" never throws an exception since the // evaluation of jj_consume_token(-1) causes ParseException to be // thrown first. Sequence nestedSeq; for (int i = 0; i < e_nrw.choices.size(); i++) { nestedSeq = (Sequence)(e_nrw.choices.elementAt(i)); actions[i] = phase1ExpansionGen(nestedSeq); conds[i] = (Lookahead)(nestedSeq.units.elementAt(0)); } retval = buildLookaheadChecker(conds, actions); } else if (e instanceof Sequence) { Sequence e_nrw = (Sequence)e; // We skip the first element in the following iteration since it is the // Lookahead object. for (int i = 1; i < e_nrw.units.size(); i++) { retval += phase1ExpansionGen((Expansion)(e_nrw.units.elementAt(i))); } } else if (e instanceof OneOrMore) { OneOrMore e_nrw = (OneOrMore)e; Expansion nested_e = e_nrw.expansion; Lookahead la; if (nested_e instanceof Sequence) { la = (Lookahead)(((Sequence)nested_e).units.elementAt(0)); } else { la = new Lookahead(); la.amount = Options.I("LOOKAHEAD"); la.la_expansion = nested_e; } retval += "\n"; int labelIndex = ++gensymindex; retval += "label_" + labelIndex + ":\n"; retval += "while (true) {\u0001"; retval += phase1ExpansionGen(nested_e); conds = new Lookahead[1]; conds[0] = la; actions = new String[2]; actions[0] = "\n;"; actions[1] = "\nbreak label_" + labelIndex + ";"; retval += buildLookaheadChecker(conds, actions); retval += "\u0002\n" + "}"; } else if (e instanceof ZeroOrMore) { ZeroOrMore e_nrw = (ZeroOrMore)e; Expansion nested_e = e_nrw.expansion; Lookahead la; if (nested_e instanceof Sequence) { la = (Lookahead)(((Sequence)nested_e).units.elementAt(0)); } else { la = new Lookahead(); la.amount = Options.I("LOOKAHEAD"); la.la_expansion = nested_e; } retval += "\n"; int labelIndex = ++gensymindex; retval += "label_" + labelIndex + ":\n"; retval += "while (true) {\u0001"; conds = new Lookahead[1]; conds[0] = la; actions = new String[2]; actions[0] = "\n;"; actions[1] = "\nbreak label_" + labelIndex + ";"; retval += buildLookaheadChecker(conds, actions); retval += phase1ExpansionGen(nested_e); retval += "\u0002\n" + "}"; } else if (e instanceof ZeroOrOne) { ZeroOrOne e_nrw = (ZeroOrOne)e; Expansion nested_e = e_nrw.expansion; Lookahead la; if (nested_e instanceof Sequence) { la = (Lookahead)(((Sequence)nested_e).units.elementAt(0)); } else { la = new Lookahead(); la.amount = Options.I("LOOKAHEAD"); la.la_expansion = nested_e; } conds = new Lookahead[1]; conds[0] = la; actions = new String[2]; actions[0] = phase1ExpansionGen(nested_e); actions[1] = "\n;"; retval += buildLookaheadChecker(conds, actions); } else if (e instanceof TryBlock) { TryBlock e_nrw = (TryBlock)e; Expansion nested_e = e_nrw.exp; java.util.Vector v; retval += "\n"; retval += "try {\u0001"; retval += phase1ExpansionGen(nested_e); retval += "\u0002\n" + "}"; for (int i = 0; i < e_nrw.catchblks.size(); i++) { retval += " catch ("; v = (java.util.Vector)(e_nrw.types.elementAt(i)); if (v.size() != 0) { printTokenSetup((Token)(v.elementAt(0))); for (java.util.Enumeration enum = v.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); retval += printToken(t); } retval += printTrailingComments(t); } retval += " "; t = (Token)(e_nrw.ids.elementAt(i)); printTokenSetup(t); retval += printToken(t); retval += printTrailingComments(t); retval += ") {\u0003\n"; v = (java.util.Vector)(e_nrw.catchblks.elementAt(i)); if (v.size() != 0) { printTokenSetup((Token)(v.elementAt(0))); ccol = 1; for (java.util.Enumeration enum = v.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); retval += printToken(t); } retval += printTrailingComments(t); } retval += "\u0004\n" + "}"; } if (e_nrw.finallyblk != null) { retval += " finally {\u0003\n"; if (e_nrw.finallyblk.size() != 0) { printTokenSetup((Token)(e_nrw.finallyblk.elementAt(0))); ccol = 1; for (java.util.Enumeration enum = e_nrw.finallyblk.elements(); enum.hasMoreElements();) { t = (Token)enum.nextElement(); retval += printToken(t); } retval += printTrailingComments(t); } retval += "\u0004\n" + "}"; } } return retval; } static void buildPhase2Routine(Lookahead la) { Expansion e = la.la_expansion; ostr.println(" " + staticOpt() + "final private boolean jj_2" + e.internal_name + "(int xla) {"); ostr.println(" jj_la = xla; jj_lastpos = jj_scanpos = token;"); ostr.println(" try { return !jj_3" + e.internal_name + "(); }"); ostr.println(" catch(LookaheadSuccess ls) { return true; }"); if (Options.B("ERROR_REPORTING")) ostr.println(" finally { jj_save(" + (Integer.parseInt(e.internal_name.substring(1))-1) + ", xla); }"); ostr.println(" }"); ostr.println(""); Phase3Data p3d = new Phase3Data(e, la.amount); phase3list.addElement(p3d); phase3table.put(e, p3d); } static private boolean xsp_declared; static Expansion jj3_expansion; static String genReturn(boolean value) { String retval = (value ? "true" : "false"); if (Options.B("DEBUG_LOOKAHEAD") && jj3_expansion != null) { String tracecode = "trace_return(\"" + ((NormalProduction)jj3_expansion.parent).lhs + "(LOOKAHEAD " + (value ? "FAILED" : "SUCCEEDED") + ")\");"; if (Options.B("ERROR_REPORTING")) { tracecode = "if (!jj_rescan) " + tracecode; } return "{ " + tracecode + " return " + retval + "; }"; } else { return "return " + retval + ";"; } } private static void generate3R(Expansion e, Phase3Data inf) { Expansion seq = e; if (e.internal_name.equals("")) { while (true) { if (seq instanceof Sequence && ((Sequence)seq).units.size() == 2) { seq = (Expansion)((Sequence)seq).units.elementAt(1); } else if (seq instanceof NonTerminal) { NonTerminal e_nrw = (NonTerminal)seq; NormalProduction ntprod = (NormalProduction)(production_table.get(e_nrw.name)); if (ntprod instanceof JavaCodeProduction) { break; // nothing to do here } else { seq = ntprod.expansion; } } else break; } if (seq instanceof RegularExpression) { e.internal_name = "jj_scan_token(" + ((RegularExpression)seq).ordinal + ")"; return; } gensymindex++;//if (gensymindex == 100)//{//new Error().printStackTrace();//System.out.println(" ***** seq: " + seq.internal_name + "; size: " + ((Sequence)seq).units.size());//} e.internal_name = "R_" + gensymindex; } Phase3Data p3d = (Phase3Data)(phase3table.get(e)); if (p3d == null || p3d.count < inf.count) { p3d = new Phase3Data(e, inf.count); phase3list.addElement(p3d); phase3table.put(e, p3d); } } static void setupPhase3Builds(Phase3Data inf) { Expansion e = inf.exp; if (e instanceof RegularExpression) { ; // nothing to here } else if (e instanceof NonTerminal) { // All expansions of non-terminals have the "name" fields set. So
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -