Wer will nicht seinen eigenen Parser schreiben ;)
:: also ich hab nun auch den parser und lexer getrennt. Dazu nur soviel zu sagen, die Dokumentation ist nicht all zu berauschend ^^ - ''diese Seite muss nochmal angepasst werden'' 

Da man ja nicht immer alles neu machen will, kann man sich ja mal [ANTLR|http://www.antlr.org/] ansehen.

Problem, ich will eine Konfiguration in ein anderes Format bringen.

{{{
A {
	B {
		C {
			D	E
			F	G
		}
	}
	B	C
}
1 3
}}}
Soll 
{{{
ABCD E
ABCF G
AB C
1 3
}}}
werden.

Das ganze kann man ja selber schreiben, das hier gegebene Beispiel ist noch simpel.
Die Grammatik kann dann so aussehen. 
{{{
lexer grammar Expr;

@lexer::header {
package de.back2heaven.parser;
import java.util.*;
}


@members {
  private  Stack<String> block = new Stack<String>(); 
  private  Stack<String> data = new Stack<String>(); 
  private  List<String> list = new ArrayList<String>(); 
  
  private void add(String t){ 
     String n = "";
    for (String s:block){
      n += s;
    }
    list.add(n +" "+t); 
  }
  public String get(){
    String t = "";
    for (String s : list){
      t += s +"\n";
    }
    return t;
  }

  private void pop(){
    if (!block.isEmpty()){
      block.pop();
    }
  }
  private void push(String t){
    block.push(t);
  }
}

DOCUMENT
    :  ELEMENT
    ;

fragment ELEMENT
    : 
    WS? d=DATA
    { push(d.getText()); }
    WS (BLOCK | MIX) WS? 
    {
    if (!data.isEmpty()) {
      add(data.pop());
      pop();
    }
    }
    ;

fragment BLOCK
  : ('{' ELEMENT+ '}')
  { pop(); }
  ;
  
fragment MIX
  : v=DATA
  {data.push(v.getText());}
  ;
  
  
fragment DATA
	: ('a'..'z' 
	| 'A'..'Z'
	| '0'..'9'
	| '"'
	| '/'
	)+
	;

fragment WS  :
        (
        ' '
        | '\t'
        | '\r'
        | '\n'
        )+
    ;    
}}}

Hier wird das Paket de.back2heaven erstellt.
Nutzen kann man das ganze dann mit z.b.

{{{
 public static void main(String[] args) {
        try {
            CharStream input = new ANTLRFileStream("input.txt");
            Expr lexer = new Expr(input);
            while (lexer.nextToken() != Token.EOF_TOKEN)
                ;
            System.out.println(lexer.get());
        }
        catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}}}