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 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);
        }
    }

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-2) was last changed on 14-Oct-2009 21:39 by JensKapitza