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 29)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfFormatterVisitor.java	(revision 30)
@@ -8,4 +8,5 @@
 import org.eclipse.xtext.parsetree.CompositeNode;
 import org.eclipse.xtext.parsetree.LeafNode;
+import org.eclipse.xtext.parsetree.NodeAdapter;
 import org.eclipse.xtext.parsetree.NodeUtil;
 
@@ -52,4 +53,5 @@
 	private int rightHandSideRuleOffset = 0;
 	private Stack<Integer> ruleSpacingStack = new Stack<Integer>();
+	private Double averageSingleDefinitionLength;
 	
 	public EbnfFormatterVisitor(EObject rootNode, FormatterConfig config) {
@@ -258,5 +260,4 @@
 		}
 		buf = result;
-		
 	}
 
@@ -294,5 +295,4 @@
 		originalTextNoWhitespaces = originalText.replaceAll("[ \t\n\r]", "");
 		
-		//System.out.println(allComments.toString());
 		text("grammar " + node.getName());
 		if (node.getType() != null)
@@ -348,4 +348,11 @@
 
 	protected void visitBefore(DefinitionList node) {
+		averageSingleDefinitionLength = null;
+		int totalLength = 0;
+		for (int i=0; i < node.eContents().size(); i++) {
+			CompositeNode parseNode = NodeUtil.getNodeAdapter(node.eContents().get(i)).getParserNode();
+			totalLength += parseNode.serialize().trim().length();
+		}
+		averageSingleDefinitionLength = (double) totalLength / (double) node.eContents().size();
 	}
 
@@ -458,7 +465,4 @@
 		
 		lastWasSectionHeading=true;
-//		if (!lastWasSectionHeading || !buf.substring(buf.length()-2).equals("\n\n"))
-//		if (!buf.substring(buf.length()-2).equals("\n\n"))
-//			buf.append("\n");
 		
 		text(node.getSectionHeader());
@@ -472,4 +476,5 @@
 
 	protected void visitAfter(SingleDefinition node) {
+		boolean preventAlternativeBreakShortAlternatives = config.isPreventNewLineAfterAlternativeOnShortAlternatives() && (averageSingleDefinitionLength <= config.getShortAlternativeThreshold());
 		if (!isLastElement()) {
 			text(" | ");
@@ -477,11 +482,14 @@
 				if (config.isPreventNewLineAfterAlternativeOnLessThanThreeElements()) {
 					DefinitionList definitionList = (DefinitionList) node.eContainer();
-					if (definitionList.eContents().size() > 2) {
+					
+					if ((definitionList.eContents().size() > 2) && (!preventAlternativeBreakShortAlternatives)) {
 						newLine();
 						spaces(ruleSpacingStack.peek());
 					}
 				} else {
-					newLine();
-					spaces(ruleSpacingStack.peek());
+					if (!preventAlternativeBreakShortAlternatives) {
+						newLine();
+						spaces(ruleSpacingStack.peek());
+					}
 				}
 			}
Index: trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/FormatterConfig.java
===================================================================
--- trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/FormatterConfig.java	(revision 29)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/FormatterConfig.java	(revision 30)
@@ -5,4 +5,5 @@
 	private boolean preventNewLineAfterAlternativeOnLessThanThreeElements = true;
 	private boolean preventNewLineAfterAlternativeOnShortAlternatives = true;
+	private double shortAlternativeThreshold = 3.0;
 
 	public boolean isNewLineAfterAlternative() {
@@ -32,3 +33,11 @@
 	}
 
+	public double getShortAlternativeThreshold() {
+		return shortAlternativeThreshold;
+	}
+
+	public void setShortAlternativeThreshold(double shortAlternativeThreshold) {
+		this.shortAlternativeThreshold = shortAlternativeThreshold;
+	}
+
 }
