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
Problem, ich will eine Konfiguration in ein anderes Format bringen.
A { B { C { D E F G } } B C } 1 3Soll
ABCD E ABCF G AB C 1 3werden.
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.