/** * Generate common code for a block of alternatives; return a postscript that needs to be * generated at the end of the block. Other routines may append else-clauses and such for error * checking before the postfix is generated. */ public void genCommonBlock(AlternativeBlock blk) { for (int i = 0; i < blk.alternatives.size(); i++) { Alternative alt = blk.getAlternativeAt(i); AlternativeElement elem = alt.head; // dump alt operator | if (i > 0 && blk.alternatives.size() > 1) { _println(""); print("|\t"); } // Dump the alternative, starting with predicates // boolean save = firstElementInAlt; firstElementInAlt = true; tabs++; // in case we do a newline in alt, increase the tab indent // RK: don't dump semantic/syntactic predicates // only obscures grammar. // // Dump semantic predicates // // if (alt.semPred != null) { // println("{" + alt.semPred + "}?"); // } // Dump syntactic predicate // if (alt.synPred != null) { // genSynPred(alt.synPred); // } genAlt(alt); tabs--; firstElementInAlt = save; } }
/** * Generate a textual representation of the lookahead set for a block. * * @param blk The block of interest */ public void genLookaheadSetForBlock(AlternativeBlock blk) { // Find the maximal lookahead depth over all alternatives int depth = 0; for (int i = 0; i < blk.alternatives.size(); i++) { Alternative alt = blk.getAlternativeAt(i); if (alt.lookaheadDepth == GrammarAnalyzer.NONDETERMINISTIC) { depth = grammar.maxk; break; } else if (depth < alt.lookaheadDepth) { depth = alt.lookaheadDepth; } } for (int i = 1; i <= depth; i++) { Lookahead lookahead = grammar.theLLkAnalyzer.look(i, blk); printSet(depth, i, lookahead); } }