/** * * Expression := [ "!" ] <Boolean> { BooleanOperator Boolean } * generates the 3 new productions in the following order: * * Expression := <GeneratedSymbol-1> <Boolean> <GeneratedSymbol-2> * GeneratedSymbol-1 := lambda * GeneratedSymbol-1 := "!" * GeneratedSymbol-2 := lambda * GeneratedSymbol-2 := BooleanOperator Boolean GeneratedSymbol-2 */ public function testOrderOfConvertedBnfProductions() { $testGrammars = $this->getTestGrammars(); $expressionUtils = $testGrammars->getExpressionUtils(); $productions = array(); $leftSide = $expressionUtils->createNonTerminal('Expression'); $expressionItems = [new Optional($expressionUtils->createTerminal('!')), $expressionUtils->createNonTerminal('Boolean'), new Repetition($expressionUtils->createConcatenationFromSymbols(array($expressionUtils->createNonTerminal('BooleanOperator'), $expressionUtils->createNonTerminal('Boolean'))))]; $rightSide = new Concatenation(array_shift($expressionItems), $expressionItems); $productions[] = new StandardProduction($leftSide, $rightSide); $ebnfGrammar = new StandardGrammar('simple test boolean logic', $productions); $converter = new Conversions(); $actualBnfProductions = $converter->ebnfToBnf($ebnfGrammar); $namingStrategy = $expressionUtils->createNonTerminalNamingStrategy(); $generatedNames = array($namingStrategy->getName(), $namingStrategy->getName()); $expectedBnfProductions = [new StandardProduction($expressionUtils->createNonTerminal('Expression'), $expressionUtils->createConcatenationFromSymbols([$expressionUtils->createNonTerminal($generatedNames[0]), $expressionUtils->createNonTerminal('Boolean'), $expressionUtils->createNonTerminal($generatedNames[1])])), new StandardProduction($expressionUtils->createNonTerminal($generatedNames[0]), $expressionUtils->createTerminal('')), new StandardProduction($expressionUtils->createNonTerminal($generatedNames[0]), $expressionUtils->createTerminal('!')), new StandardProduction($expressionUtils->createNonTerminal($generatedNames[1]), $expressionUtils->createTerminal('')), new StandardProduction($expressionUtils->createNonTerminal($generatedNames[1]), $expressionUtils->createConcatenationFromSymbols(array($expressionUtils->createNonTerminal('BooleanOperator'), $expressionUtils->createNonTerminal('Boolean'), $expressionUtils->createNonTerminal($generatedNames[1]))))]; $assertFailMessage = 'Expected a different set of bnf productions'; $this->assertEquals(count($expectedBnfProductions), count($actualBnfProductions), $assertFailMessage); while (!is_null(key($expectedBnfProductions)) && !is_null(key($actualBnfProductions))) { /** @var $expectedBnfProduction Production */ $expectedBnfProduction = current($expectedBnfProductions); next($expectedBnfProductions); /** @var $actualBnfProduction Production */ $actualBnfProduction = current($actualBnfProductions); next($actualBnfProductions); $this->assertEquals(array($expectedBnfProduction->getNonTerminal()->getType(), $expectedBnfProduction->getNonTerminal()->toString()), array($actualBnfProduction->getNonTerminal()->getType(), $actualBnfProduction->getNonTerminal()->toString()), $assertFailMessage); $this->assertEquals($expectedBnfProduction->getExpression(), $actualBnfProduction->getExpression(), $assertFailMessage); } }
public function testBnfConversion() { $grammarFile = $this->getResourceFilePath('logo-simple.ebnf'); $lexer = (new IsoEbnfLexerFactory())->fromFile($grammarFile); $assertions = new ParseAssertions(new TokenPredicates()); $parser = new IsoEbnfParser($assertions); $syntaxNode = $parser->parse($lexer); $translator = new AstTranslator(); $ebnfGrammar = $translator->translate($syntaxNode); $conversions = new Conversions(); $bnfGrammar = $conversions->ebnfToBnf($ebnfGrammar); $this->assertNotNull($bnfGrammar); }