jjdoc.java
来自「java 编译器java复杂编译器,可以编译java文件的类库」· Java 代码 · 共 502 行
JAVA
502 行
/* * 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.jjdoc;import java.io.PrintWriter;import java.util.Vector;import java.util.Enumeration;import java.util.Stack;import org.javacc.parser.*;public class JJDoc extends JavaCCGlobals { /** * The main entry point for JJDoc. */ static void start() { PrintWriter pw = create_output_stream(); Generator gen; if (Options.B("TEXT")) { gen = new Generator(pw); } else { gen = new HTMLGenerator(pw); } gen.documentStart(); emitTokenProductions(gen, rexprlist); emitNormalProductions(gen, bnfproductions); gen.documentEnd(); pw.close(); } private static Token getPrecedingSpecialToken(Token tok) { Token t = tok; while (t.specialToken != null) { t = t.specialToken; } return (t != tok) ? t : null; } private static void emitTopLevelSpecialTokens(Token tok, Generator gen) { if (tok == null) { // Strange ... return; } tok = getPrecedingSpecialToken(tok); String s = ""; if (tok != null) { cline = tok.beginLine; ccol = tok.beginColumn; while (tok != null) { s += printTokenOnly(tok); tok = tok.next; } } gen.specialTokens(s); } private static boolean toplevelExpansion(Expansion exp) { return exp.parent != null && ( (exp.parent instanceof NormalProduction) || (exp.parent instanceof TokenProduction) ); } private static void emitTokenProductions(Generator gen, Vector prods) {// gen.tokensStart(); for (Enumeration enum = prods.elements(); enum.hasMoreElements();) { TokenProduction tp = (TokenProduction)enum.nextElement();// emitTopLevelSpecialTokens(ostr, tp.firstToken);// if (tp.isExplicit) {// if (tp.lexStates == null) {// ostr.print("<*> ");// } else {// ostr.print("<");// for (int i = 0; i < tp.lexStates.length; ++i) {// ostr.print(tp.lexStates[i]);// if (i < tp.lexStates.length - 1) {// ostr.print(",");// }// }// ostr.print("> ");// }// ostr.print(tp.kindImage[tp.kind]);// if (tp.ignoreCase) {// ostr.print(" [IGNORE_CASE]");// }// ostr.print(" : {\n");// for (Enumeration e2 = tp.respecs.elements(); e2.hasMoreElements();) {// RegExprSpec res = (RegExprSpec)e2.nextElement();// emitRE(res.rexp, ostr);// if (res.nsTok != null) {// ostr.print(" : " + res.nsTok.image);// }// ostr.print("\n");// if (e2.hasMoreElements()) {// ostr.print("| ");// }// }// ostr.print("}\n\n");// } }// gen.tokensEnd(); } private static void emitNormalProductions(Generator gen, Vector prods) { gen.nonterminalsStart(); for (Enumeration enum = prods.elements(); enum.hasMoreElements();) { NormalProduction np = (NormalProduction)enum.nextElement(); emitTopLevelSpecialTokens(np.firstToken, gen); if (np instanceof BNFProduction) { gen.productionStart(np); if (np.expansion instanceof Choice) { boolean first = true; Choice c = (Choice)np.expansion; for (java.util.Enumeration enume = c.choices.elements(); enume.hasMoreElements();) { Expansion e = (Expansion)(enume.nextElement()); gen.expansionStart(e, first); emitExpansionTree(e, gen); gen.expansionEnd(e, first); first = false; } } else { gen.expansionStart(np.expansion, true); emitExpansionTree(np.expansion, gen); gen.expansionEnd(np.expansion, true); } gen.productionEnd(np); } else if (np instanceof JavaCodeProduction) { gen.javacode((JavaCodeProduction)np); } } gen.nonterminalsEnd(); } private static void emitExpansionTree(Expansion exp, Generator gen) {// gen.text("[->" + exp.getClass().getName() + "]"); if (exp instanceof Action) { emitExpansionAction((Action)exp, gen); } else if (exp instanceof Choice) { emitExpansionChoice((Choice)exp, gen); } else if (exp instanceof Lookahead) { emitExpansionLookahead((Lookahead)exp, gen); } else if (exp instanceof NonTerminal) { emitExpansionNonTerminal((NonTerminal)exp, gen); } else if (exp instanceof OneOrMore) { emitExpansionOneOrMore((OneOrMore)exp, gen); } else if (exp instanceof RegularExpression) { emitExpansionRegularExpression((RegularExpression)exp, gen); } else if (exp instanceof Sequence) { emitExpansionSequence((Sequence)exp, gen); } else if (exp instanceof TryBlock) { emitExpansionTryBlock((TryBlock)exp, gen); } else if (exp instanceof ZeroOrMore) { emitExpansionZeroOrMore((ZeroOrMore)exp, gen); } else if (exp instanceof ZeroOrOne) { emitExpansionZeroOrOne((ZeroOrOne)exp, gen); } else { System.out.println("Oops: Unknown expansion type."); }// gen.text("[<-" + exp.getClass().getName() + "]"); } private static void emitExpansionAction(Action a, Generator gen) { } private static void emitExpansionChoice(Choice c, Generator gen) { for (java.util.Enumeration enum = c.choices.elements(); enum.hasMoreElements();) { Expansion e = (Expansion)(enum.nextElement()); emitExpansionTree(e, gen); if (enum.hasMoreElements()) { gen.text(" | "); } } } private static void emitExpansionLookahead(Lookahead l, Generator gen) { } private static void emitExpansionNonTerminal(NonTerminal nt, Generator gen) { gen.nonTerminalStart(nt); gen.text(nt.name); gen.nonTerminalEnd(nt); } private static void emitExpansionOneOrMore(OneOrMore o, Generator gen) { gen.text("( "); emitExpansionTree(o.expansion, gen); gen.text(" )+"); } private static void emitExpansionRegularExpression(RegularExpression r, Generator gen) { gen.reStart(r); emitRE(r, gen); gen.reEnd(r); } private static void emitExpansionSequence(Sequence s, Generator gen) { boolean firstUnit = true; for (java.util.Enumeration enum = s.units.elements(); enum.hasMoreElements();) { Expansion e = (Expansion)enum.nextElement(); if (e instanceof Lookahead || e instanceof Action) { continue; } if (!firstUnit) { gen.text(" "); } boolean needParens = (e instanceof Choice) || (e instanceof Sequence); if (needParens) { gen.text("( "); } emitExpansionTree(e, gen); if (needParens) { gen.text(" )"); } firstUnit = false; } } private static void emitExpansionTryBlock(TryBlock t, Generator gen) { boolean needParens = t.exp instanceof Choice; if (needParens) { gen.text("( "); } emitExpansionTree(t.exp, gen); if (needParens) { gen.text(" )"); } } private static void emitExpansionZeroOrMore(ZeroOrMore z, Generator gen) { gen.text("( "); emitExpansionTree(z.expansion, gen); gen.text(" )*"); } private static void emitExpansionZeroOrOne(ZeroOrOne z, Generator gen) { gen.text("( "); emitExpansionTree(z.expansion, gen); gen.text(" )?"); } private static void emitRE(RegularExpression re, Generator gen) { boolean hasLabel = !re.label.equals(""); boolean justName = re instanceof RJustName; boolean eof = re instanceof REndOfFile; boolean isString = re instanceof RStringLiteral; boolean toplevelRE = (re.tpContext != null); boolean needBrackets = justName || eof || hasLabel || (!isString && toplevelRE); if (needBrackets) { gen.text("<"); if (!justName) { if (re.private_rexp) { gen.text("#"); } if (hasLabel) { gen.text(re.label); gen.text(": "); } } } if (re instanceof RCharacterList) { RCharacterList cl = (RCharacterList)re; if (cl.negated_list) { gen.text("~"); } gen.text("["); for (java.util.Enumeration enum = cl.descriptors.elements(); enum.hasMoreElements();) { Object o = enum.nextElement(); if (o instanceof SingleCharacter) { gen.text("\""); char s[] = { ((SingleCharacter)o).ch }; gen.text(add_escapes(new String(s))); gen.text("\""); } else if (o instanceof CharacterRange) { gen.text("\""); char s[] = { ((CharacterRange)o).left }; gen.text(add_escapes(new String(s))); gen.text("\"-\""); s[0] = ((CharacterRange)o).right; gen.text(add_escapes(new String(s))); gen.text("\""); } else { System.out.println("Oops: unknown character list element type."); } if (enum.hasMoreElements()) { gen.text(","); } } gen.text("]"); } else if (re instanceof RChoice) { RChoice c = (RChoice)re; for (java.util.Enumeration enum = c.choices.elements(); enum.hasMoreElements();) { RegularExpression sub = (RegularExpression)(enum.nextElement()); emitRE(sub, gen); if (enum.hasMoreElements()) { gen.text(" | "); } } } else if (re instanceof REndOfFile) { gen.text("EOF"); } else if (re instanceof RJustName) { RJustName jn = (RJustName)re; gen.text(jn.label); } else if (re instanceof ROneOrMore) { ROneOrMore om = (ROneOrMore)re; gen.text("("); emitRE(om.regexpr, gen); gen.text(")+"); } else if (re instanceof RSequence) { RSequence s = (RSequence)re; for (java.util.Enumeration enum = s.units.elements(); enum.hasMoreElements();) { RegularExpression sub = (RegularExpression)(enum.nextElement()); boolean needParens = false; if (sub instanceof RChoice) { needParens = true; } if (needParens) { gen.text("("); } emitRE(sub, gen); if (needParens) { gen.text(")"); } if (enum.hasMoreElements()) { gen.text(" "); } } } else if (re instanceof RStringLiteral) { RStringLiteral sl = (RStringLiteral)re; gen.text("\"" + JavaCCParserInternals.add_escapes(sl.image) + "\""); } else if (re instanceof RZeroOrMore) { RZeroOrMore zm = (RZeroOrMore)re; gen.text("("); emitRE(zm.regexpr, gen); gen.text(")*"); } else if (re instanceof RZeroOrOne) { RZeroOrOne zo = (RZeroOrOne)re; gen.text("("); emitRE(zo.regexpr, gen); gen.text(")?"); } else { System.out.println("Oops: Unknown regular expression type."); } if (needBrackets) { gen.text(">"); } } private static String v2s(Vector v, boolean newLine) { String s = ""; boolean firstToken = true; for (Enumeration enum = v.elements(); enum.hasMoreElements();) { Token tok = (Token)enum.nextElement(); Token stok = getPrecedingSpecialToken(tok); if (firstToken) { if (stok != null) { cline = stok.beginLine; ccol = stok.beginColumn; } else { cline = tok.beginLine; ccol = tok.beginColumn; } s = ws(ccol - 1); firstToken = false; } while (stok != null) { s += printToken(stok); stok = stok.next; } s += printToken(tok); } return s; } /** * Create an output stream for the generated Jack code. Try to open * a file based on the name of the parser, but if that fails use the * standard output stream. */ private static PrintWriter create_output_stream() { PrintWriter ostr; if (Options.S("OUTPUT_FILE").equals("")) { if (JJDocGlobals.input_file.equals("standard input")) { return new java.io.PrintWriter(new java.io.OutputStreamWriter(System.out)); } else { String ext = ".html"; if (Options.B("TEXT")) { ext = ".txt"; } int i = JJDocGlobals.input_file.lastIndexOf('.'); if (i == -1) { JJDocGlobals.output_file = JJDocGlobals.input_file + ext; } else { String suffix = JJDocGlobals.input_file.substring(i); if (suffix.equals(ext)) { JJDocGlobals.output_file = JJDocGlobals.input_file + ext; } else { JJDocGlobals.output_file = JJDocGlobals.input_file.substring(0, i) + ext; } } } } else { JJDocGlobals.output_file = Options.S("OUTPUT_FILE"); } try { ostr = new java.io.PrintWriter(new java.io.FileWriter(JJDocGlobals.output_file)); } catch (java.io.IOException e) { System.err.println("JJDoc: can't open output stream on file " + JJDocGlobals.output_file + ". Using standard output."); ostr = new java.io.PrintWriter(new java.io.OutputStreamWriter(System.out)); } return ostr; } /** * A utility to produce a string of blanks. */ private static String ws(int len) { String s = ""; for (int i = 0; i < len; ++i) { s += " "; } return s; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?