コード例 #1
0
ファイル: EbnfToBnfTest.php プロジェクト: helstern/nomsky-lib
 /**
  *
  * 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);
     }
 }
コード例 #2
0
 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);
 }