package grammar;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import util.StringUtils;
import driver.Context;
import grammar.Expression.Rule;
import grammar.java._A_Lexical;
import grammar.java._B_Expressions;
import grammar.java._C_Statements;
import grammar.java._D_Requires;
import grammar.java._E_MacroDefinitions;
/**
* Pretty prints the caxap Grammar, for inclusion in a latex document.
*/
public class GrammarPrinter
{
private final Grammar grammar;
private final List<Class<?>> classes;
public GrammarPrinter(Grammar grammar, List<Class<?>> classes)
{
this.grammar = grammar;
this.classes = classes;
}
public void print(PrintStream out)
{
for (Class<?> klass : classes) {
out.println("\\begin{lstlisting}[breaklines=true]");
for (Field field : klass.getDeclaredFields()) {
Rule rule = grammar.maybeRule(field.getName());
if (rule != null) {
out.println(ruleString(rule));
}
}
out.println("\\end{lstlisting}");
}
}
public String ruleString(Rule rule)
{
return rule.name + " ::= "+ StringUtils.join(rule.children(), " | ") + "\n";
}
public static void main(String[] args)
{
new GrammarPrinter(Context.get().grammar(), Arrays.asList(new Class<?>[]{
_A_Lexical.class,
_B_Expressions.class,
_C_Statements.class,
_D_Requires.class,
_E_MacroDefinitions.class
})).print(System.out);
}
}