/* package whatever; // don't place package name! */
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
String str
= "( S ( NP-SBJ ( PRP I ) ) ( INODE@S ( VP ( VBP have ) ( NP ( DT a ) ( INODE@NP ( NN savings ) ( NN account ) ) ) ) ( . . ) ) )"; // cleanup double spaces:
while (str.contains(" ")){
str = str.replaceAll(" ", " ");
}
// find no parenthesis zones!
Matcher m = Pattern.compile("\\([^\\(\\)]*\\)").matcher(str);
// loop until nothing left:
while (m.find()) {
item = m.group();
// make the grammar:
grammar = item.substring(1, item.length()-1).trim().replaceFirst(" ", " -> ");
if (!grammarRepo.contains(grammar)) {
grammarRepo.add(grammar);
ps.print(grammar + "\n");
}
str = str.replace(item, grammar.split(" -> ")[0]);
m = Pattern.compile("\\([^\\(\\)]*\\)").matcher(str);
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEubGFuZy4qOwppbXBvcnQgamF2YS5pby4qOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShTeXN0ZW0ub3V0KTsKCQlBcnJheUxpc3QgZ3JhbW1hclJlcG8gPSBuZXcgQXJyYXlMaXN0KCk7CgkJU3RyaW5nIGl0ZW0sIGdyYW1tYXI7CgkJU3RyaW5nIHN0ciA9ICIoIFMgKCBOUC1TQkogKCBQUlAgSSAgKSAgKSAgKCBJTk9ERUBTICggVlAgKCBWQlAgaGF2ZSAgKSAgKCBOUCAoIERUIGEgICkgICggSU5PREVATlAgKCBOTiBzYXZpbmdzICApICAoIE5OIGFjY291bnQgICkgICkgICkgICkgICggLiAuICkgICkgICkiOwoJCS8vIGNsZWFudXAgZG91YmxlIHNwYWNlczoKCQl3aGlsZSAoc3RyLmNvbnRhaW5zKCIgICIpKXsKICAgICAgICAJc3RyID0gc3RyLnJlcGxhY2VBbGwoIiAgIiwgIiAiKTsKICAgIAl9CiAgICAJLy8gZmluZCBubyBwYXJlbnRoZXNpcyB6b25lcyEKICAgIAlNYXRjaGVyIG0gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcKFteXFwoXFwpXSpcXCkiKS5tYXRjaGVyKHN0cik7CiAgICAJCiAgICAJLy8gbG9vcCB1bnRpbCBub3RoaW5nIGxlZnQ6CiAgICAJd2hpbGUgKG0uZmluZCgpKSB7CiAgICAJCWl0ZW0gPSBtLmdyb3VwKCk7CiAgICAJCQogICAgCQkvLyBtYWtlIHRoZSBncmFtbWFyOgogICAgCQlncmFtbWFyID0gaXRlbS5zdWJzdHJpbmcoMSwgaXRlbS5sZW5ndGgoKS0xKS50cmltKCkucmVwbGFjZUZpcnN0KCIgIiwgIiAtPiAiKTsKICAgIAkJCiAgICAJCWlmICghZ3JhbW1hclJlcG8uY29udGFpbnMoZ3JhbW1hcikpIHsKICAgIAkJCWdyYW1tYXJSZXBvLmFkZChncmFtbWFyKTsKICAgIAkJCXBzLnByaW50KGdyYW1tYXIgKyAiXG4iKTsKICAgIAkJfQoKICAgIAkJc3RyID0gc3RyLnJlcGxhY2UoaXRlbSwgZ3JhbW1hci5zcGxpdCgiIC0+ICIpWzBdKTsKICAgIAkJbSA9IFBhdHRlcm4uY29tcGlsZSgiXFwoW15cXChcXCldKlxcKSIpLm1hdGNoZXIoc3RyKTsKICAgIAl9Cgl9Cn0=