This page (revision-2) was last changed on 14-Oct-2009 21:39 by JensKapitza 

This page was created on 11-Oct-2009 01:05 by JensKapitza

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
2 14-Oct-2009 21:39 2 KB JensKapitza to previous teil2 Seite muss überarbeitet werden
1 11-Oct-2009 01:05 2 KB JensKapitza to last ANTLR

Page References

Incoming links Outgoing links
Java.ANTLR...nobody

Version management

Difference between version and

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