Index: trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfFormatterVisitor.java
===================================================================
--- trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfFormatterVisitor.java	(revision 10)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfFormatterVisitor.java	(revision 11)
@@ -1,4 +1,5 @@
 package de.ugoe.cs.swe.bnftools.ui.formatter;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 
@@ -45,61 +46,133 @@
 	// -----------------------------------------------------------------------------
 
-	protected void visit(EtsiBnf node) {
+	protected void visitBefore(EtsiBnf node) {
 		buf.append("grammar " + node.getName());
 		if (node.getType() != null)
 			buf.append(node.getType());
 		buf.append(";");
+		buf.append("\n\n");
 	}
 
-	protected void visit(Atom node) {
+	protected void visitAfter(EtsiBnf node) {
 	}
 
-	protected void visit(DefinitionList node) {
+	protected void visitBefore(Atom node) {
 	}
 
-	protected void visit(ExtRule node) {
+	protected void visitAfter(Atom node) {
 	}
 
-	protected void visit(GlobalCombinator node) {
+	protected void visitBefore(Term node) {
 	}
 
-	protected void visit(GroupedSequence node) {
+	protected void visitAfter(Term node) {
+		SingleDefinition parent = (SingleDefinition) node.eContainer();
+		int index = parent.getTerms().indexOf(node);
+		if ((parent.getTerms().size() > 0) && (index < parent.getTerms().size()-1))
+			buf.append(" ");
 	}
 
-	protected void visit(HookCombinator node) {
+	protected void visitBefore(DefinitionList node) {
 	}
 
-	protected void visit(Import node) {
+	protected void visitAfter(DefinitionList node) {
 	}
 
-	protected void visit(MergeRule node) {
+	protected void visitBefore(ExtRule node) {
 	}
 
-	protected void visit(OptionalSequence node) {
+	protected void visitAfter(ExtRule node) {
 	}
 
-	protected void visit(RepeatedSequence node) {
+	protected void visitBefore(GlobalCombinator node) {
 	}
 
-	protected void visit(Rule node) {
+	protected void visitAfter(GlobalCombinator node) {
 	}
 
-	protected void visit(RuleCombinator node) {
+	protected void visitBefore(GroupedSequence node) {
+		buf.append("(");
 	}
 
-	protected void visit(RuleReference node) {
+	protected void visitAfter(GroupedSequence node) {
+		buf.append(")");
 	}
 
-	protected void visit(SectionHeading node) {
+	protected void visitBefore(HookCombinator node) {
 	}
 
-	protected void visit(SingleDefinition node) {
+	protected void visitAfter(HookCombinator node) {
 	}
 
-	protected void visit(StringRule node) {
+	protected void visitBefore(Import node) {
 	}
 
-	protected void visit(Term node) {
+	protected void visitAfter(Import node) {
 	}
 
+	protected void visitBefore(MergeRule node) {
+	}
+
+	protected void visitAfter(MergeRule node) {
+	}
+
+	protected void visitBefore(OptionalSequence node) {
+	}
+
+	protected void visitAfter(OptionalSequence node) {
+	}
+
+	protected void visitBefore(RepeatedSequence node) {
+	}
+
+	protected void visitAfter(RepeatedSequence node) {
+	}
+
+	protected void visitBefore(Rule node) {
+		if (node.getRulenumber() > 0)
+			buf.append(node.getRulenumber() + ". ");
+		
+		buf.append(node.getName() + " ::= ");
+	}
+
+	protected void visitAfter(Rule node) {
+		buf.append(";\n");
+	}
+
+	protected void visitBefore(RuleCombinator node) {
+	}
+
+	protected void visitAfter(RuleCombinator node) {
+	}
+
+	protected void visitBefore(RuleReference node) {
+	}
+
+	protected void visitAfter(RuleReference node) {
+	}
+
+	protected void visitBefore(SectionHeading node) {
+	}
+
+	protected void visitAfter(SectionHeading node) {
+	}
+
+	protected void visitBefore(SingleDefinition node) {
+	}
+
+	protected void visitAfter(SingleDefinition node) {
+	}
+
+	protected void visitBefore(StringRule node) {
+		if (node.getLiteral() != null)
+			buf.append("\"" + node.getLiteral() + "\"");
+		else if (node.getColon() != null)
+			buf.append(" " + node.getColon());
+	}
+
+	protected void visitAfter(StringRule node) {
+	}
+
+	
+	
 }
Index: trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/FormatterProcessor.java
===================================================================
--- trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/FormatterProcessor.java	(revision 10)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/FormatterProcessor.java	(revision 11)
@@ -104,6 +104,6 @@
 		
 		FormatterConfig config = new FormatterConfig();
-		EbnfFormatterVisitor visitor = new EbnfFormatterVisitor(rootNode.getElement(), config);
-		visitor.accept();
+		EbnfFormatterVisitor visitor = new EbnfFormatterVisitor(config);
+		visitor.accept(rootNode.getElement());
 		
 		ReplaceEdit replaceEdit = new ReplaceEdit(0, document.getLength(), visitor.getBuf().toString());
Index: trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/visitor/EbnfVisitor.java
===================================================================
--- trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/visitor/EbnfVisitor.java	(revision 10)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/visitor/EbnfVisitor.java	(revision 11)
@@ -1,9 +1,5 @@
 package de.ugoe.cs.swe.bnftools.visitor;
 
-import java.util.Collections;
-
-import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
 
 import com.sun.xml.internal.bind.v2.schemagen.xmlschema.Import;
@@ -28,4 +24,5 @@
 
 public abstract class EbnfVisitor {
+	
 	protected EObject rootNode = null;
 
@@ -43,107 +40,207 @@
 
 	public void accept(EObject node) {
-		TreeIterator<Object> it = EcoreUtil.getAllContents(Collections
-				.singleton(node));
-
-		while (it.hasNext()) {
-			EObject currentNode = (EObject) it.next();
-			dispatcher(currentNode);
+		dispatcherBefore(node);
+		acceptInner(node);
+		dispatcherAfter(node);
+	}
+
+	private void acceptInner(EObject node) {
+		for (int i=0; i < node.eContents().size(); i++) {
+			EObject currentNode = (EObject) node.eContents().get(i);
+			dispatcherBefore(currentNode);
+			acceptInner(currentNode);
+			dispatcherAfter(currentNode);
 		}
 	}
-
-	protected void dispatcher(EObject node) {
+	
+	protected void dispatcherBefore(EObject node) {
 		// ugly, but no time to find a prettier solution
 		if (node instanceof EtsiBnf) {
-			visit((EtsiBnf) node);
+			visitBefore((EtsiBnf) node);
 		} else if (node instanceof Atom) {
-			visit((Atom) node);
+			visitBefore((Atom) node);
 		} else if (node instanceof DefinitionList) {
-			visit((DefinitionList) node);
+			visitBefore((DefinitionList) node);
 		} else if (node instanceof ExtRule) {
-			visit((ExtRule) node);
+			visitBefore((ExtRule) node);
 		} else if (node instanceof GlobalCombinator) {
-			visit((GlobalCombinator) node);
+			visitBefore((GlobalCombinator) node);
 		} else if (node instanceof GroupedSequence) {
-			visit((GroupedSequence) node);
+			visitBefore((GroupedSequence) node);
 		} else if (node instanceof HookCombinator) {
-			visit((HookCombinator) node);
+			visitBefore((HookCombinator) node);
 		} else if (node instanceof Import) {
-			visit((Import) node);
+			visitBefore((Import) node);
 		} else if (node instanceof MergeRule) {
-			visit((MergeRule) node);
+			visitBefore((MergeRule) node);
 		} else if (node instanceof OptionalSequence) {
-			visit((OptionalSequence) node);
+			visitBefore((OptionalSequence) node);
 		} else if (node instanceof RepeatedSequence) {
-			visit((RepeatedSequence) node);
+			visitBefore((RepeatedSequence) node);
 		} else if (node instanceof Rule) {
-			visit((Rule) node);
+			visitBefore((Rule) node);
 		} else if (node instanceof RuleCombinator) {
-			visit((RuleCombinator) node);
+			visitBefore((RuleCombinator) node);
 		} else if (node instanceof RuleReference) {
-			visit((RuleReference) node);
+			visitBefore((RuleReference) node);
 		} else if (node instanceof SectionHeading) {
-			visit((SectionHeading) node);
+			visitBefore((SectionHeading) node);
 		} else if (node instanceof SingleDefinition) {
-			visit((SingleDefinition) node);
+			visitBefore((SingleDefinition) node);
 		} else if (node instanceof StringRule) {
-			visit((StringRule) node);
+			visitBefore((StringRule) node);
 		} else if (node instanceof Term) {
-			visit((Term) node);
+			visitBefore((Term) node);
 		}
 	}
 	
-	protected void visit(EtsiBnf node) {
-	}
-
-	protected void visit(Atom node) {
-	}
-
-	protected void visit(DefinitionList node) {
-	}
-
-	protected void visit(ExtRule node) {
-	}
-
-	protected void visit(GlobalCombinator node) {
-	}
-
-	protected void visit(GroupedSequence node) {
-	}
-
-	protected void visit(HookCombinator node) {
-	}
-
-	protected void visit(Import node) {
-	}
-
-	protected void visit(MergeRule node) {
-	}
-
-	protected void visit(OptionalSequence node) {
-	}
-
-	protected void visit(RepeatedSequence node) {
-	}
-
-	protected void visit(Rule node) {
-	}
-
-	protected void visit(RuleCombinator node) {
-	}
-
-	protected void visit(RuleReference node) {
-	}
-
-	protected void visit(SectionHeading node) {
-	}
-
-	protected void visit(SingleDefinition node) {
-	}
-
-	protected void visit(StringRule node) {
-	}
-
-	protected void visit(Term node) {
-	}
-
+	protected void dispatcherAfter(EObject node) {
+		// ugly, but no time to find a prettier solution
+		if (node instanceof EtsiBnf) {
+			visitAfter((EtsiBnf) node);
+		} else if (node instanceof Atom) {
+			visitAfter((Atom) node);
+		} else if (node instanceof DefinitionList) {
+			visitAfter((DefinitionList) node);
+		} else if (node instanceof ExtRule) {
+			visitAfter((ExtRule) node);
+		} else if (node instanceof GlobalCombinator) {
+			visitAfter((GlobalCombinator) node);
+		} else if (node instanceof GroupedSequence) {
+			visitAfter((GroupedSequence) node);
+		} else if (node instanceof HookCombinator) {
+			visitAfter((HookCombinator) node);
+		} else if (node instanceof Import) {
+			visitAfter((Import) node);
+		} else if (node instanceof MergeRule) {
+			visitAfter((MergeRule) node);
+		} else if (node instanceof OptionalSequence) {
+			visitAfter((OptionalSequence) node);
+		} else if (node instanceof RepeatedSequence) {
+			visitAfter((RepeatedSequence) node);
+		} else if (node instanceof Rule) {
+			visitAfter((Rule) node);
+		} else if (node instanceof RuleCombinator) {
+			visitAfter((RuleCombinator) node);
+		} else if (node instanceof RuleReference) {
+			visitAfter((RuleReference) node);
+		} else if (node instanceof SectionHeading) {
+			visitAfter((SectionHeading) node);
+		} else if (node instanceof SingleDefinition) {
+			visitAfter((SingleDefinition) node);
+		} else if (node instanceof StringRule) {
+			visitAfter((StringRule) node);
+		} else if (node instanceof Term) {
+			visitAfter((Term) node);
+		}
+	}
+
+	protected void visitBefore(EtsiBnf node) {
+	}
+
+	protected void visitAfter(EtsiBnf node) {
+	}
+
+	protected void visitBefore(Atom node) {
+	}
+
+	protected void visitAfter(Atom node) {
+	}
+
+	protected void visitBefore(Term node) {
+	}
+
+	protected void visitAfter(Term node) {
+	}
+
+	protected void visitBefore(DefinitionList node) {
+	}
+
+	protected void visitAfter(DefinitionList node) {
+	}
+
+	protected void visitBefore(ExtRule node) {
+	}
+
+	protected void visitAfter(ExtRule node) {
+	}
+
+	protected void visitBefore(GlobalCombinator node) {
+	}
+
+	protected void visitAfter(GlobalCombinator node) {
+	}
+
+	protected void visitBefore(GroupedSequence node) {
+	}
+
+	protected void visitAfter(GroupedSequence node) {
+	}
+
+	protected void visitBefore(HookCombinator node) {
+	}
+
+	protected void visitAfter(HookCombinator node) {
+	}
+
+	protected void visitBefore(Import node) {
+	}
+
+	protected void visitAfter(Import node) {
+	}
+
+	protected void visitBefore(MergeRule node) {
+	}
+
+	protected void visitAfter(MergeRule node) {
+	}
+
+	protected void visitBefore(OptionalSequence node) {
+	}
+
+	protected void visitAfter(OptionalSequence node) {
+	}
+
+	protected void visitBefore(RepeatedSequence node) {
+	}
+
+	protected void visitAfter(RepeatedSequence node) {
+	}
+
+	protected void visitBefore(Rule node) {
+	}
+
+	protected void visitAfter(Rule node) {
+	}
+
+	protected void visitBefore(RuleCombinator node) {
+	}
+
+	protected void visitAfter(RuleCombinator node) {
+	}
+
+	protected void visitBefore(RuleReference node) {
+	}
+
+	protected void visitAfter(RuleReference node) {
+	}
+
+	protected void visitBefore(SectionHeading node) {
+	}
+
+	protected void visitAfter(SectionHeading node) {
+	}
+
+	protected void visitBefore(SingleDefinition node) {
+	}
+
+	protected void visitAfter(SingleDefinition node) {
+	}
+
+	protected void visitBefore(StringRule node) {
+	}
+
+	protected void visitAfter(StringRule node) {
+	}
+	
 }
Index: trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/GenerateEbnf.mwe2
===================================================================
--- trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/GenerateEbnf.mwe2	(revision 10)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/GenerateEbnf.mwe2	(revision 11)
@@ -76,6 +76,7 @@
 			//fragment = exporting.QualifiedNamesFragment {}
 			
-			// formatter API 
-			fragment = formatting.FormatterFragment {}
+			// formatter API
+			// skip it as it is not sufficient for our case... 
+//			fragment = formatting.FormatterFragment {}
 
 			// labeling API 
Index: trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/formatting/EbnfFormatter.java
===================================================================
--- trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/formatting/EbnfFormatter.java	(revision 10)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/formatting/EbnfFormatter.java	(revision 11)
@@ -19,26 +19,26 @@
 	@Override
 	protected void configureFormatting(FormattingConfig c) {
-		de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess f = (de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess) getGrammarAccess();
-
-		c.setIndentationSpace(" ");
-		c.setNoLinewrap();
-		c.setAutoLinewrap(10000000);
-		c.setLinewrap(2).before(f.getSectionHeadingRule());
-		c.setLinewrap(2).after(f.getSectionHeadingRule());
-		
-		
-		c.setNoSpace().after(f.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0());
-		c.setNoSpace().after(f.getRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0());
-
-		c.setLinewrap().before(f.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0());
-		c.setNoSpace().before(f.getRuleAccess().getSemicolonKeyword_4());
-//		c.setNoSpace().before(f.getRuleAccess().getNameIDTerminalRuleCall_1_0());
-
-//		c.setLinewrap().after(f.getRuleAccess().getDefinitionListDefinitionListParserRuleCall_3_0());
-		c.setLinewrap().after(f.getRuleAccess().getDefinitionListAssignment_3());
-
-		c.setLinewrap(2).before(f.getSL_COMMENTRule());
-		c.setNoLinewrap().after(f.getSL_COMMENTRule());
-		c.setLinewrap(2).before(f.getML_COMMENTRule());	
+//		de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess f = (de.ugoe.cs.swe.bnftools.services.EbnfGrammarAccess) getGrammarAccess();
+//
+//		c.setIndentationSpace(" ");
+//		c.setNoLinewrap();
+//		c.setAutoLinewrap(10000000);
+//		c.setLinewrap(2).before(f.getSectionHeadingRule());
+//		c.setLinewrap(2).after(f.getSectionHeadingRule());
+//		
+//		
+//		c.setNoSpace().after(f.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0());
+//		c.setNoSpace().after(f.getRuleAccess().getRulevariantIDTerminalRuleCall_0_1_0());
+//
+//		c.setLinewrap().before(f.getRuleAccess().getRulenumberINTTerminalRuleCall_0_0_0());
+//		c.setNoSpace().before(f.getRuleAccess().getSemicolonKeyword_4());
+////		c.setNoSpace().before(f.getRuleAccess().getNameIDTerminalRuleCall_1_0());
+//
+////		c.setLinewrap().after(f.getRuleAccess().getDefinitionListDefinitionListParserRuleCall_3_0());
+//		c.setLinewrap().after(f.getRuleAccess().getDefinitionListAssignment_3());
+//
+//		c.setLinewrap(2).before(f.getSL_COMMENTRule());
+//		c.setNoLinewrap().after(f.getSL_COMMENTRule());
+//		c.setLinewrap(2).before(f.getML_COMMENTRule());	
 	}
 	
