Wer will nicht seinen eigenen Parser schreiben ;)
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 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);
}
}