public function testBraces() { $grammar = new Grammar(array("expression" => new ConcatenatedExpression(array(new RepeaterExpression(new NotExpression(new AlternativeExpression(array(new ConstantExpression("("))))), new AlternativeExpression(array(new ConcatenatedExpression(array(new ConstantExpression("("), new NamedExpression("expression"), new ConstantExpression(")"))), new RepeaterExpression(new NotExpression(new AlternativeExpression(array(new ConstantExpression("("))))))), new RepeaterExpression(new NotExpression(new AlternativeExpression(array(new ConstantExpression("("))))))))); $no_opening_brace = new RepeaterExpression(new NotExpression(new AlternativeExpression(array(new ConstantExpression("("))))); $grammar = new Grammar(array("expression" => new AlternativeExpression(array(new ConcatenatedExpression(array($no_opening_brace, new ConstantExpression("("), new NamedExpression("expression"), new ConstantExpression(")"), $no_opening_brace)), $no_opening_brace)))); $parser = ParserHelper::compileWithGrammar(new NamedExpression("expression"), $grammar); $result = $parser->parse("ab"); $this->assertNotNull($result); $this->assertEquals("ab", $result->getString()); $result = $parser->parse("ab("); $this->assertNotNull($result); $this->assertEquals("ab", $result->getString()); $result = $parser->parse("ab(c(d)ef)g"); $this->assertNotNull($result); $this->assertEquals("ab(c(d)ef)g", $result->getString()); $this->assertEquals("abg", $result->getResult()->getPart(0)->getString() . $result->getResult()->getPart(4)->getString()); }