using System;
public class Test
{
enum State {
WhiteSpace,
Block,
String };
static string Parse(string s) {
State state = State.WhiteSpace;
int? blockStart = null;
for (int p = 0; ; ) {
switch (state) {
case State.WhiteSpace:
if (s[p] == '{') {
p++;
state = State.Block;
blockStart = p;
} else if (s[p] == ' ') {
p++;
} else {
throw new System.ArgumentException();
}
break;
case State.Block:
if (s[p] == '}') {
return s.Substring((int) blockStart, p - (int) blockStart);
} else if (s[p] == '"') {
p++;
state = State.String;
} else {
p++;
}
break;
case State.String:
if (s[p] == '"') {
p++;
state = State.Block;
} else {
p++;
}
break;
}
}
throw new System.ArgumentException();
}
public static void Main()
{
Console.Out.WriteLine(Parse("{ --isso é um bloco;\n echo \"Aqui tem um } no meio\";}"));
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJZW51bSBTdGF0ZSB7CgkJV2hpdGVTcGFjZSwKCQlCbG9jaywKCQlTdHJpbmcgfTsKCQogICAgc3RhdGljIHN0cmluZyBQYXJzZShzdHJpbmcgcykgewogICAgCVN0YXRlIHN0YXRlID0gU3RhdGUuV2hpdGVTcGFjZTsKICAgIAlpbnQ/IGJsb2NrU3RhcnQgPSBudWxsOwogICAgCWZvciAoaW50IHAgPSAwOyA7ICkgewogICAgCQlzd2l0Y2ggKHN0YXRlKSB7CiAgICAJCQljYXNlIFN0YXRlLldoaXRlU3BhY2U6CiAgICAJCQkJaWYgKHNbcF0gPT0gJ3snKSB7CiAgICAJCQkJCXArKzsKICAgIAkJCQkJc3RhdGUgPSBTdGF0ZS5CbG9jazsKICAgIAkJCQkJYmxvY2tTdGFydCA9IHA7CiAgICAJCQkJfSBlbHNlIGlmIChzW3BdID09ICcgJykgewogICAgCQkJCQlwKys7CiAgICAJCQkJfSBlbHNlIHsKICAgIAkJCQkgICAgdGhyb3cgbmV3IFN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbigpOwogICAgCQkJCX0KICAgIAkJCQlicmVhazsKICAgIAkJCWNhc2UgU3RhdGUuQmxvY2s6CiAgICAJCQkJaWYgKHNbcF0gPT0gJ30nKSB7CiAgICAJCQkJCXJldHVybiBzLlN1YnN0cmluZygoaW50KSBibG9ja1N0YXJ0LCBwIC0gKGludCkgYmxvY2tTdGFydCk7CiAgICAJCQkJfSBlbHNlIGlmIChzW3BdID09ICciJykgewogICAgCQkJCQlwKys7CiAgICAJCQkJCXN0YXRlID0gU3RhdGUuU3RyaW5nOwogICAgCQkJCX0gZWxzZSB7CiAgICAJCQkJCXArKzsKICAgIAkJCQl9CiAgICAJCQkJYnJlYWs7CiAgICAJCQljYXNlIFN0YXRlLlN0cmluZzoKICAgIAkJCQlpZiAoc1twXSA9PSAnIicpIHsKICAgIAkJCQkJcCsrOwogICAgCQkJCQlzdGF0ZSA9IFN0YXRlLkJsb2NrOwogICAgCQkJCX0gZWxzZSB7CiAgICAJCQkJCXArKzsKICAgIAkJCQl9CiAgICAJCQkJYnJlYWs7CiAgICAJCX0KICAgIAl9CiAgICAJdGhyb3cgbmV3IFN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbigpOwogICAgfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJQ29uc29sZS5PdXQuV3JpdGVMaW5lKFBhcnNlKCJ7IC0taXNzbyDDqSB1bSBibG9jbztcbiAgZWNobyBcIkFxdWkgdGVtIHVtIH0gbm8gbWVpb1wiO30iKSk7Cgl9Cn0=