HTMLCodeGenerator.java
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:21k
源码类别:

编译器/解释器

开发平台:

Others

  1. package antlr;
  2. /* ANTLR Translator Generator
  3.  * Project led by Terence Parr at http://www.jGuru.com
  4.  * Software rights: http://www.antlr.org/RIGHTS.html
  5.  *
  6.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/HTMLCodeGenerator.java#1 $
  7.  */
  8. import java.util.Enumeration;
  9. import antlr.collections.impl.BitSet;
  10. import antlr.collections.impl.Vector;
  11. import java.io.PrintWriter; //SAS: changed for proper text file io
  12. import java.io.IOException;
  13. import java.io.FileWriter;
  14. /**Generate P.html, a cross-linked representation of P with or without actions */
  15. public class HTMLCodeGenerator extends CodeGenerator {
  16. /** non-zero if inside syntactic predicate generation */
  17. protected int syntacticPredLevel = 0;
  18. /** true during lexer generation, false during parser generation */
  19. protected boolean doingLexRules = false;
  20. protected boolean firstElementInAlt;
  21. protected AlternativeElement prevAltElem = null; // what was generated last?
  22. /** Create a Diagnostic code-generator using the given Grammar
  23.  * The caller must still call setTool, setBehavior, and setAnalyzer
  24.  * before generating code.
  25.  */
  26. public HTMLCodeGenerator() {
  27. super();
  28. charFormatter = new JavaCharFormatter();
  29. }
  30. public void gen() {
  31. // Do the code generation
  32. try {
  33. // Loop over all grammars
  34. Enumeration grammarIter = behavior.grammars.elements();
  35. while (grammarIter.hasMoreElements()) {
  36. Grammar g = (Grammar)grammarIter.nextElement();
  37. // Connect all the components to each other
  38. /*
  39. g.setGrammarAnalyzer(analyzer);
  40. analyzer.setGrammar(g);
  41. */
  42. g.setCodeGenerator(this);
  43. // To get right overloading behavior across hetrogeneous grammars
  44. g.generate();
  45. if (tool.hasError) {
  46. System.out.println("Exiting due to errors.");
  47. System.exit(1);
  48. }
  49. }
  50. }
  51. catch (IOException e) {
  52. System.out.println(e.getMessage());
  53. }
  54. }
  55. /** Generate code for the given grammar element.
  56.  * @param blk The {...} action to generate
  57.  */
  58. public void gen(ActionElement action) {
  59. /*
  60. _print("{");
  61. _printAction(action.actionText);
  62. _print("} ");
  63. */
  64. }
  65. /** Generate code for the given grammar element.
  66.  * @param blk The "x|y|z|..." block to generate
  67.  */
  68. public void gen(AlternativeBlock blk) {
  69. genGenericBlock(blk, "");
  70. }
  71. /** Generate code for the given grammar element.
  72.  * @param blk The block-end element to generate.  Block-end
  73.  * elements are synthesized by the grammar parser to represent
  74.  * the end of a block.
  75.  */
  76. public void gen(BlockEndElement end) {
  77. // no-op
  78. }
  79. /** Generate code for the given grammar element.
  80.  * @param blk The character literal reference to generate
  81.  */
  82. public void gen(CharLiteralElement atom) {
  83. /*
  84. if (atom.label != null) {
  85. _print(atom.label+"=");
  86. }
  87. */
  88. if (atom.not) {
  89. _print("~");
  90. }
  91. _print(atom.atomText+" ");
  92. }
  93. /** Generate code for the given grammar element.
  94.  * @param blk The character-range reference to generate
  95.  */
  96. public void gen(CharRangeElement r) {
  97. /*
  98. if ( r.label!=null ) {
  99. _print(r.label+"=");
  100. }
  101. */
  102. print(r.beginText + ".." + r.endText+" ");
  103. }
  104. /** Generate the lexer TXT file */
  105. public void gen(LexerGrammar g) throws IOException {
  106. setGrammar(g);
  107. System.out.println("Generating " + grammar.getClassName() + TokenTypesFileExt);
  108. currentOutput = antlr.Tool.openOutputFile(grammar.getClassName() + TokenTypesFileExt);
  109. //SAS: changed for proper text file io
  110. tabs=0;
  111. doingLexRules = true;
  112. // Generate header common to all TXT output files
  113. genHeader();
  114. /*
  115. // Output the user-defined lexer premamble
  116. println(grammar.preambleAction);
  117. */
  118. // Generate lexer class definition
  119. println("");
  120. // print javadoc comment if any
  121. if ( grammar.comment!=null ) {
  122. _println(grammar.comment);
  123. }
  124. println("class " + grammar.getClassName() + " extends " + grammar.getSuperClass() + " {");
  125. // Generate user-defined parser class members
  126. // printAction(grammar.classMemberAction);
  127. /*
  128. // Generate string literals
  129. println("");
  130. println("*** String literals used in the parser");
  131. println("The following string literals were used in the parser.");
  132. println("An actual code generator would arrange to place these literals");
  133. println("into a table in the generated lexer, so that actions in the");
  134. println("generated lexer could match token text against the literals.");
  135. println("String literals used in the lexer are not listed here, as they");
  136. println("are incorporated into the mainstream lexer processing.");
  137. tabs++;
  138. // Enumerate all of the symbols and look for string literal symbols
  139. Enumeration ids = grammar.getSymbols();
  140. while ( ids.hasMoreElements() ) {
  141. GrammarSymbol sym = (GrammarSymbol)ids.nextElement();
  142. // Only processing string literals -- reject other symbol entries
  143. if ( sym instanceof StringLiteralSymbol ) {
  144. StringLiteralSymbol s = (StringLiteralSymbol)sym;
  145. println(s.getId() + " = " + s.getTokenType());
  146. }
  147. }
  148. tabs--;
  149. println("*** End of string literals used by the parser");
  150. */
  151. // Generate nextToken() rule.
  152. // nextToken() is a synthetic lexer rule that is the implicit OR of all
  153. // user-defined lexer rules.
  154. genNextToken();
  155. // Generate code for each rule in the lexer
  156. Enumeration ids = grammar.rules.elements();
  157. while ( ids.hasMoreElements() ) {
  158. RuleSymbol rs = (RuleSymbol)ids.nextElement();
  159. if (!rs.id.equals("mnextToken")) {
  160. genRule(rs);
  161. }
  162. }
  163. // Close the lexer output file
  164. currentOutput.close();
  165. currentOutput = null;
  166. doingLexRules = false;
  167. }
  168. /** Generate code for the given grammar element.
  169.  * @param blk The (...)+ block to generate
  170.  */
  171. public void gen(OneOrMoreBlock blk) {
  172. genGenericBlock(blk, "+");
  173. }
  174. /** Generate the parser TXT file */
  175. public void gen(ParserGrammar g) throws IOException {
  176. setGrammar(g);
  177. // Open the output stream for the parser and set the currentOutput
  178. System.out.println("Generating " + grammar.getClassName() + ".html");
  179. currentOutput = antlr.Tool.openOutputFile(grammar.getClassName()+".html");
  180. tabs = 0;
  181. // Generate the header common to all output files.
  182. genHeader();
  183. /*
  184. _print("{");
  185. printAction(grammar.preambleAction);
  186. _print("}");
  187. */
  188. // Generate parser class definition
  189. println("");
  190. // print javadoc comment if any
  191. if ( grammar.comment!=null ) {
  192. _println(grammar.comment);
  193. }
  194. println("class " + grammar.getClassName() + " extends " + grammar.getSuperClass());
  195. /*
  196. // Generate user-defined parser class members
  197. println("");
  198. _print("{");
  199. printAction(grammar.classMemberAction);
  200. _print("}");
  201. */
  202. // Enumerate the parser rules
  203. Enumeration rules = grammar.rules.elements();
  204. while ( rules.hasMoreElements() ) {
  205. println("");
  206. // Get the rules from the list and downcast it to proper type
  207. GrammarSymbol sym = (GrammarSymbol) rules.nextElement();
  208. // Only process parser rules
  209. if ( sym instanceof RuleSymbol) {
  210. genRule((RuleSymbol)sym);
  211. }
  212. }
  213. tabs--;
  214. println("");
  215. genTail();
  216. // Close the parser output stream
  217. currentOutput.close();
  218. currentOutput = null;
  219. }
  220. /** Generate code for the given grammar element.
  221.  * @param blk The rule-reference to generate
  222.  */
  223. public void gen(RuleRefElement rr) {
  224. RuleSymbol rs = (RuleSymbol)grammar.getSymbol(rr.targetRule);
  225. // Generate the actual rule description
  226. /*
  227. if ( rr.idAssign!=null ) {
  228. _print(rr.idAssign+"=");
  229. }
  230. */
  231. _print("<a href="+grammar.getClassName() + ".html#"+rr.targetRule+">");
  232. _print(rr.targetRule);
  233. _print("</a>");
  234. if (rr.args != null) {
  235. _print("["+rr.args+"]");
  236. }
  237. _print(" ");
  238. }
  239. /** Generate code for the given grammar element.
  240.  * @param blk The string-literal reference to generate
  241.  */
  242. public void gen(StringLiteralElement atom) {
  243. /*
  244. if (atom.label != null) {
  245. _print(atom.label+"=");
  246. }
  247. */
  248. if (atom.not) {
  249. _print("~");
  250. }
  251. _print(atom.atomText);
  252. _print(" ");
  253. }
  254. /** Generate code for the given grammar element.
  255.  * @param blk The token-range reference to generate
  256.  */
  257. public void gen(TokenRangeElement r) {
  258. /*
  259. if ( r.label!=null ) {
  260. _print(r.label+"=");
  261. }
  262. */
  263. print(r.beginText + ".." + r.endText+" ");
  264. }
  265. /** Generate code for the given grammar element.
  266.  * @param blk The token-reference to generate
  267.  */
  268. public void gen(TokenRefElement atom) {
  269. /*
  270. if (atom.label != null) {
  271. _print(atom.label+"=");
  272. }
  273. */
  274. if (atom.not) {
  275. _print("~");
  276. }
  277. _print(atom.atomText);
  278. _print(" ");
  279. }
  280. public void gen(TreeElement t) {
  281. print(t+" ");
  282. }
  283. /** Generate the tree-walker TXT file */
  284. public  void gen(TreeWalkerGrammar g) throws IOException {
  285. setGrammar(g);
  286. // Open the output stream for the parser and set the currentOutput
  287. System.out.println("Generating " + grammar.getClassName() + ".txt");
  288. currentOutput = antlr.Tool.openOutputFile(grammar.getClassName()+".txt");
  289. //SAS: changed for proper text file io
  290. tabs = 0;
  291. // Generate the header common to all output files.
  292. genHeader();
  293. // Output the user-defined parser premamble
  294. println("");
  295. println("*** Tree-walker Preamble Action.");
  296. println("This action will appear before the declaration of your tree-walker class:");
  297. tabs++;
  298. println(grammar.preambleAction);
  299. tabs--;
  300. println("*** End of tree-walker Preamble Action");
  301. // Generate tree-walker class definition
  302. println("");
  303. // print javadoc comment if any
  304. if ( grammar.comment!=null ) {
  305. _println(grammar.comment);
  306. }
  307. println("class " + grammar.getClassName() + " extends " + grammar.getSuperClass() + "{");
  308. // Generate user-defined tree-walker class members
  309. println("");
  310. println("*** User-defined tree-walker class members:");
  311. println("These are the member declarations that you defined for your class:");
  312. tabs++;
  313. printAction(grammar.classMemberAction);
  314. tabs--;
  315. println("*** End of user-defined tree-walker class members");
  316. // Generate code for each rule in the grammar
  317. println("");
  318. println("*** tree-walker rules:");
  319. tabs++;
  320. // Enumerate the tree-walker rules
  321. Enumeration rules = grammar.rules.elements();
  322. while ( rules.hasMoreElements() ) {
  323. println("");
  324. // Get the rules from the list and downcast it to proper type
  325. GrammarSymbol sym = (GrammarSymbol) rules.nextElement();
  326. // Only process tree-walker rules
  327. if ( sym instanceof RuleSymbol) {
  328. genRule((RuleSymbol)sym);
  329. }
  330. }
  331. tabs--;
  332. println("");
  333. println("*** End of tree-walker rules");
  334. println("");
  335. println("*** End of tree-walker");
  336. // Close the tree-walker output stream
  337. currentOutput.close();
  338. currentOutput = null;
  339. }
  340. /** Generate a wildcard element */
  341. public void gen(WildcardElement wc) {
  342. /*
  343. if ( wc.getLabel()!=null ) {
  344. _print(wc.getLabel()+"=");
  345. }
  346. */
  347. _print(". ");
  348. }
  349. /** Generate code for the given grammar element.
  350.  * @param blk The (...)* block to generate
  351.  */
  352. public void gen(ZeroOrMoreBlock blk) {
  353. genGenericBlock(blk, "*");
  354. }
  355. protected void genAlt(Alternative alt) {
  356. if (alt.getTreeSpecifier() != null) {
  357. _print(alt.getTreeSpecifier().getText());
  358. }
  359. prevAltElem = null;
  360. for (AlternativeElement elem = alt.head; !(elem instanceof BlockEndElement); elem = elem.next) {
  361. elem.generate();
  362. firstElementInAlt = false;
  363. prevAltElem = elem;
  364. }
  365. }
  366. /** Generate the header for a block, which may be a RuleBlock or a
  367.  * plain AlternativeBLock.  This generates any variable declarations,
  368.  * init-actions, and syntactic-predicate-testing variables.
  369.  * @blk The block for which the preamble is to be generated.
  370.  */
  371. protected void genBlockPreamble(AlternativeBlock blk) {
  372. // dump out init action
  373. if ( blk.initAction!=null ) {
  374. printAction("{" + blk.initAction + "}");
  375. }
  376. }
  377. /**Generate common code for a block of alternatives; return a postscript
  378.  * that needs to be generated at the end of the block.  Other routines
  379.  * may append else-clauses and such for error checking before the postfix
  380.  * is generated.
  381.  */
  382. public void genCommonBlock(AlternativeBlock blk) {
  383. for (int i = 0; i < blk.alternatives.size(); i++) {
  384. Alternative alt = blk.getAlternativeAt(i);
  385. AlternativeElement elem = alt.head;
  386. // dump alt operator |
  387. if ( i>0 && blk.alternatives.size()>1 ) {
  388. /*
  389. // only do newline if the last element wasn't a multi-line block
  390. if ( prevAltElem==null ||
  391.  !(prevAltElem instanceof AlternativeBlock) ||
  392.  ((AlternativeBlock)prevAltElem).alternatives.size()==1 )
  393. {
  394. _println("");
  395. }
  396. */
  397. _println("");
  398. print("|t");
  399. }
  400. // Dump the alternative, starting with predicates
  401. boolean save = firstElementInAlt;
  402. firstElementInAlt = true;
  403. tabs++; // in case we do a newline in alt, increase the tab indent
  404. // Dump semantic predicates
  405. if (alt.semPred != null) {
  406. println("{" + alt.semPred + "}?");
  407. }
  408. // Dump syntactic predicate
  409. if (alt.synPred != null) {
  410. genSynPred(alt.synPred);
  411. }
  412. genAlt(alt);
  413. tabs--;
  414. firstElementInAlt = save;
  415. }
  416. }
  417. /** Generate a textual representation of the follow set
  418.  * for a block.
  419.  * @param blk  The rule block of interest
  420.  */
  421. public void genFollowSetForRuleBlock(RuleBlock blk)
  422. {
  423. Lookahead follow = grammar.theLLkAnalyzer.FOLLOW(1, blk.endNode);
  424. printSet(grammar.maxk, 1, follow);
  425. }
  426. protected void genGenericBlock(AlternativeBlock blk, String blkOp) {
  427. if (blk.alternatives.size() > 1) {
  428. // make sure we start on a new line
  429. if (!firstElementInAlt) {
  430. // only do newline if the last element wasn't a multi-line block
  431. if ( prevAltElem==null ||
  432.  !(prevAltElem instanceof AlternativeBlock) ||
  433.  ((AlternativeBlock)prevAltElem).alternatives.size()==1 )
  434. {
  435. _println("");
  436. print("(t");
  437. }
  438. else {
  439. _print("(t");
  440. }
  441. // _println("");
  442. // print("(t");
  443. }
  444. else {
  445. _print("(t");
  446. }
  447. } else {
  448. _print("( ");
  449. }
  450. genBlockPreamble(blk);
  451. genCommonBlock(blk);
  452. if (blk.alternatives.size() > 1) {
  453. _println("");
  454. print(")" + blkOp + " ");
  455. // if not last element of alt, need newline & to indent
  456. if ( !(blk.next instanceof BlockEndElement) ) {
  457. _println("");
  458. print("");
  459. }
  460. } else {
  461. _print(")" + blkOp + " ");
  462. }
  463. }
  464. /** Generate a header that is common to all TXT files */
  465. protected void genHeader() 
  466. {
  467. println("<HTML>");
  468. println("<HEAD>");
  469. println("<TITLE>Grammar "+tool.grammarFile+"</TITLE>");
  470. println("</HEAD>");
  471. println("<BODY>");
  472. println("<table border=1 cellpadding=5>");
  473. println("<tr>");
  474. println("<td>");
  475. println("<font size=+2>Grammar "+grammar.getClassName()+"</font><br>");
  476. println("<a href=http://www.ANTLR.org>ANTLR</a>-generated HTML file from "+tool.grammarFile);
  477. println("<p>");
  478. println("Terence Parr, <a href=http://www.magelang.com>MageLang Institute</a>");
  479. println("<br>ANTLR Version "+Tool.version+"; 1989-1999");
  480. println("</td>");
  481. println("</tr>");
  482. println("</table>");
  483. println("<PRE>");
  484. tabs++;
  485. printAction((String)behavior.headerActions.get(""));
  486. tabs--;
  487. }
  488. /**Generate the lookahead set for an alternate. */
  489. protected void genLookaheadSetForAlt(Alternative alt) {
  490. if ( doingLexRules && alt.cache[1].containsEpsilon() ) {
  491. println("MATCHES ALL");
  492. return;
  493. }
  494. int depth = alt.lookaheadDepth;
  495. if ( depth == GrammarAnalyzer.NONDETERMINISTIC ) {
  496. // if the decision is nondeterministic, do the best we can: LL(k)
  497. // any predicates that are around will be generated later.
  498. depth = grammar.maxk;
  499. }
  500. for (int i = 1; i <= depth; i++)
  501. {
  502. Lookahead lookahead = alt.cache[i];
  503. printSet(depth, i, lookahead);
  504. }
  505. }
  506. /** Generate a textual representation of the lookahead set
  507.  * for a block.
  508.  * @param blk  The block of interest
  509.  */
  510. public void genLookaheadSetForBlock(AlternativeBlock blk)
  511. {
  512. // Find the maximal lookahead depth over all alternatives
  513. int depth = 0;
  514. for (int i=0; i<blk.alternatives.size(); i++) {
  515. Alternative alt = blk.getAlternativeAt(i);
  516. if (alt.lookaheadDepth == GrammarAnalyzer.NONDETERMINISTIC) {
  517. depth = grammar.maxk;
  518. break;
  519. else if (depth < alt.lookaheadDepth) {
  520. depth = alt.lookaheadDepth;
  521. }
  522. }
  523. for (int i = 1; i <= depth; i++)
  524. {
  525. Lookahead lookahead = grammar.theLLkAnalyzer.look(i, blk);
  526. printSet(depth, i, lookahead);
  527. }
  528. }
  529. /** Generate the nextToken rule.
  530.  * nextToken is a synthetic lexer rule that is the implicit OR of all
  531.  * user-defined lexer rules.
  532.  */
  533. public void genNextToken() {
  534. println("");
  535. println("/** Lexer nextToken rule:");
  536. println(" *  The lexer nextToken rule is synthesized from all of the user-defined");
  537. println(" *  lexer rules.  It logically consists of one big alternative block with");
  538. println(" *  each user-defined rule being an alternative.");
  539. println(" */");
  540. // Create the synthesized rule block for nextToken consisting
  541. // of an alternate block containing all the user-defined lexer rules.
  542. RuleBlock blk = MakeGrammar.createNextTokenRule(grammar, grammar.rules, "nextToken");
  543. // Define the nextToken rule symbol
  544. RuleSymbol nextTokenRs = new RuleSymbol("mnextToken");
  545. nextTokenRs.setDefined();
  546. nextTokenRs.setBlock(blk);
  547. nextTokenRs.access = "private";
  548. grammar.define(nextTokenRs);
  549. /*
  550. // Analyze the synthesized block
  551. if (!grammar.theLLkAnalyzer.deterministic(blk))
  552. {
  553. println("The grammar analyzer has determined that the synthesized");
  554. println("nextToken rule is non-deterministic (i.e., it has ambiguities)");
  555. println("This means that there is some overlap of the character");
  556. println("lookahead for two or more of your lexer rules.");
  557. }
  558. */
  559. genCommonBlock(blk);
  560. }
  561. /** Generate code for a named rule block
  562.  * @param s The RuleSymbol describing the rule to generate
  563. */
  564. public void genRule(RuleSymbol s) {
  565. if ( s==null || !s.isDefined() ) return; // undefined rule
  566. println("");
  567. if ( s.comment!=null ) {
  568. _println(s.comment);
  569. }
  570. if (s.access.length() != 0) {
  571. if ( !s.access.equals("public") ) {
  572. _print(s.access+" ");
  573. }
  574. }
  575. _print("<a name="+s.getId()+">");
  576. _print(s.getId());
  577. _print("</a>");
  578. // Get rule return type and arguments
  579. RuleBlock rblk = s.getBlock();
  580. // Gen method return value(s)
  581. if (rblk.returnAction != null) {
  582. _print("["+rblk.returnAction+"]");
  583. }
  584. // Gen arguments
  585. if (rblk.argAction != null) 
  586. {
  587. _print(" returns [" + rblk.argAction+"]");
  588. }
  589. _println("");
  590. tabs++;
  591. print(":t");
  592. // Dump any init-action
  593. // genBlockPreamble(rblk);
  594. // Dump the alternates of the rule
  595. genCommonBlock(rblk);
  596. _println("");
  597. println(";");
  598. tabs--;
  599. }
  600. /** Generate the syntactic predicate.  This basically generates
  601.  * the alternative block, buts tracks if we are inside a synPred
  602.  * @param blk  The syntactic predicate block
  603.  */
  604. protected void genSynPred(SynPredBlock blk) {
  605. syntacticPredLevel++;
  606. genGenericBlock(blk, " =>");
  607. syntacticPredLevel--;
  608. }
  609. public void genTail() {
  610. println("</PRE>");
  611. println("</BODY>");
  612. println("</HTML>");
  613. }
  614. /** Generate the token types TXT file */
  615. protected void genTokenTypes(TokenManager tm) throws IOException {
  616. // Open the token output TXT file and set the currentOutput stream
  617. System.out.println("Generating " + tm.getName() + TokenTypesFileSuffix+TokenTypesFileExt);
  618. currentOutput = antlr.Tool.openOutputFile(tm.getName() + TokenTypesFileSuffix+TokenTypesFileExt);
  619. //SAS: changed for proper text file io
  620. tabs = 0;
  621. // Generate the header common to all diagnostic files
  622. genHeader();
  623. // Generate a string for each token.  This creates a static
  624. // array of Strings indexed by token type.
  625. println("");
  626. println("*** Tokens used by the parser");
  627. println("This is a list of the token numeric values and the corresponding");
  628. println("token identifiers.  Some tokens are literals, and because of that");
  629. println("they have no identifiers.  Literals are double-quoted.");
  630. tabs++;
  631. // Enumerate all the valid token types
  632. Vector v = tm.getVocabulary();
  633. for (int i = Token.MIN_USER_TYPE; i < v.size(); i++) {
  634. String s = (String)v.elementAt(i);
  635. if (s != null) {
  636. println(s + " = " + i);
  637. }
  638. }
  639. // Close the interface
  640. tabs--;
  641. println("*** End of tokens used by the parser");
  642. // Close the tokens output file
  643. currentOutput.close();
  644. currentOutput = null;
  645. }
  646. /** Get a string for an expression to generate creation of an AST subtree.
  647.   * @param v A Vector of String, where each element is an expression in the target language yielding an AST node.
  648.   */
  649. public String getASTCreateString(Vector v) {
  650. return null;
  651. }
  652. /** Get a string for an expression to generate creating of an AST node
  653.   * @param str The arguments to the AST constructor
  654.   */
  655. public String getASTCreateString(GrammarAtom atom, String str) {
  656. return null;
  657. }
  658. /** Map an identifier to it's corresponding tree-node variable.
  659.   * This is context-sensitive, depending on the rule and alternative
  660.   * being generated
  661.   * @param id The identifier name to map
  662.   * @param forInput true if the input tree node variable is to be returned, otherwise the output variable is returned.
  663.   */
  664. public String mapTreeId(String id, ActionTransInfo tInfo) {
  665. return id;
  666. }
  667. /** Format a lookahead or follow set.
  668.  * @param depth The depth of the entire lookahead/follow
  669.  * @param k The lookahead level to print
  670.  * @param lookahead  The lookahead/follow set to print
  671.  */
  672. public void printSet(int depth, int k, Lookahead lookahead) {
  673. int numCols = 5;
  674. int[] elems = lookahead.fset.toArray();
  675. if (depth != 1) {
  676. print("k==" + k + ": {");
  677. } else {
  678. print("{ ");
  679. }
  680. if (elems.length > numCols) {
  681. _println("");
  682. tabs++;
  683. print("");
  684. }
  685. int column = 0;
  686. for (int i = 0; i < elems.length; i++)
  687. {
  688. column++;
  689. if (column > numCols) {
  690. _println("");
  691. print("");
  692. column = 0;
  693. }
  694. if (doingLexRules) {
  695. _print(charFormatter.literalChar(elems[i]));
  696. } else {
  697. _print((String)grammar.tokenManager.getVocabulary().elementAt(elems[i]));
  698. }
  699. if (i != elems.length-1) {
  700. _print(", ");
  701. }
  702. }
  703. if (elems.length > numCols) {
  704. _println("");
  705. tabs--;
  706. print("");
  707. }
  708. _println(" }");
  709. }
  710. }