@Before public void init() { Nonterminal S = Nonterminal.withName("S"); Nonterminal E = Nonterminal.builder("E").addParameters("l", "r").build(); Character z = Character.from('z'); Character w = Character.from('w'); Rule r0 = Rule.withHead(S) .addSymbol(Nonterminal.builder(E).apply(integer(0), integer(0)).build()) .build(); Rule r1_1 = Rule.withHead(E) .addSymbol( Nonterminal.builder(E) .apply(integer(5), var("r")) .addPreCondition(predicate(greaterEq(integer(5), var("r")))) .build()) .addSymbol(z) .build(); Rule r1_2 = Rule.withHead(E) .addSymbol( Character.builder('x') .addPreCondition(predicate(greaterEq(integer(4), var("l")))) .build()) .addSymbol(Nonterminal.builder(E).apply(var("l"), integer(4)).build()) .build(); Rule r1_3 = Rule.withHead(E) .addSymbol( Nonterminal.builder(E) .apply(integer(3), integer(0)) .addPreCondition(predicate(greaterEq(integer(3), var("r")))) .build()) .addSymbol(w) .build(); Rule r1_4 = Rule.withHead(E) .addSymbol( Character.builder('y') .addPreCondition(predicate(greaterEq(integer(2), var("l")))) .build()) .addSymbol(Nonterminal.builder(E).apply(integer(0), integer(0)).build()) .build(); Rule r1_5 = Rule.withHead(E).addSymbol(Character.from('a')).build(); grammar = Grammar.builder().addRules(r0, r1_1, r1_2, r1_3, r1_4, r1_5).build(); }
@Test public void test() { Grammar grammar = Grammar.builder() // $default$ ::= {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("$default$").build()) .setLayoutStrategy(NO_LAYOUT) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) // E ::= ('-') E {UNDEFINED,1,RIGHT_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(45).build()).build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.RIGHT_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, 1, true, false, false, false)) .build()) // E ::= ('a') {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(97).build()).build()) .build()) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, 1, true, false, false, false)) .build()) // E ::= E ('^') E {LEFT,2,LEFT_RIGHT_REC} PREC(2,2) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(94).build()).build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.LEFT_RIGHT_REC) .setAssociativity(Associativity.LEFT) .setPrecedence(2) .setPrecedenceLevel(PrecedenceLevel.from(2, 2, -1, false, false, true, false)) .build()) // E ::= E ('*') E {UNDEFINED,3,LEFT_RIGHT_REC} PREC(3,3) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(42).build()).build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.LEFT_RIGHT_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(3) .setPrecedenceLevel(PrecedenceLevel.from(3, 3, 3, false, false, true, false)) .build()) // S ::= E {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("S").build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) .build(); // grammar = new EBNFToBNF().transform(grammar); System.out.println(grammar); grammar = new DesugarPrecedenceAndAssociativity().transform(grammar); System.out.println(grammar.toStringWithOrderByPrecedence()); Input input = Input.fromString("a*-a^a"); GrammarGraph graph = GrammarGraph.from(grammar, input, Configuration.DEFAULT); // Visualization.generateGrammarGraph("test/org/iguana/parser/datadependent/precedence/", // graph); ParseResult result = Iguana.parse(input, graph, Nonterminal.withName("S")); Assert.assertTrue(result.isParseSuccess()); // Visualization.generateSPPFGraph("test/org/iguana/parser/datadependent/precedence/", // result.asParseSuccess().getSPPFNode(), input); Assert.assertEquals(0, result.asParseSuccess().getStatistics().getCountAmbiguousNodes()); }
@Test public void test() { Grammar grammar = Grammar.builder() // $default$ ::= {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("$default$").build()) .setLayoutStrategy(NO_LAYOUT) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) // E ::= E ('+') E {LEFT,1,LEFT_RIGHT_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(43).build()).build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.LEFT_RIGHT_REC) .setAssociativity(Associativity.LEFT) .setPrecedence(1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) // E ::= ('a') {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(97).build()).build()) .build()) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) // S ::= E {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("S").build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) .build(); // grammar = new EBNFToBNF().transform(grammar); System.out.println(grammar); grammar = new DesugarPrecedenceAndAssociativity().transform(grammar); System.out.println(grammar.toStringWithOrderByPrecedence()); Input input = Input.fromString("a+a+a"); GrammarGraph graph = grammar.toGrammarGraph(input, Configuration.DEFAULT); // Visualization.generateGrammarGraph("/Users/anastasiaizmaylova/git/diguana/test/org/jgll/parser/datadependent/precedence/", graph); GLLParser parser = ParserFactory.getParser(Configuration.DEFAULT, input, grammar); ParseResult result = parser.parse(input, graph, Nonterminal.withName("S")); Assert.assertTrue(result.isParseSuccess()); // Visualization.generateSPPFGraph("/Users/anastasiaizmaylova/git/diguana/test/org/jgll/parser/datadependent/precedence/", // result.asParseSuccess().getRoot(), input); Assert.assertTrue(result.asParseSuccess().getStatistics().getCountAmbiguousNodes() == 0); }
@Test public void test() { Grammar grammar = Grammar.builder() .setLayout(Nonterminal.builder("L").build()) // $default$ ::= {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("$default$").build()) .setLayoutStrategy(NO_LAYOUT) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) // L ::= (\u0009-\\u000A | \\u000D | \u0020)* !>> (\u0009-\\u000A | \\u000D | \u0020) // {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("L").build()) .addSymbol( Star.builder( Alt.builder( CharacterRange.builder(9, 10).build(), CharacterRange.builder(13, 13).build(), CharacterRange.builder(32, 32).build()) .build()) .addPostConditions( set( new RegularExpressionCondition( ConditionType.NOT_FOLLOW, Alt.builder( CharacterRange.builder(9, 10).build(), CharacterRange.builder(13, 13).build(), CharacterRange.builder(32, 32).build()) .build()))) .build()) .setLayoutStrategy(NO_LAYOUT) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) // E ::= (i f) E (t h e n) E (e l s e) E {UNDEFINED,1,RIGHT_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder( Sequence.builder( Character.builder(105).build(), Character.builder(102).build()) .build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder( Sequence.builder( Character.builder(116).build(), Character.builder(104).build(), Character.builder(101).build(), Character.builder(110).build()) .build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder( Sequence.builder( Character.builder(101).build(), Character.builder(108).build(), Character.builder(115).build(), Character.builder(101).build()) .build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.RIGHT_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, 1, true, false, false, false)) .build()) // E ::= (a) {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(97).build()).build()) .build()) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, 1, true, false, false, false)) .build()) // E ::= E (+) E {LEFT,2,LEFT_RIGHT_REC} PREC(2,2) .addRule( Rule.withHead(Nonterminal.builder("E").build()) .addSymbol(Nonterminal.builder("E").build()) .addSymbol( Terminal.builder(Sequence.builder(Character.builder(43).build()).build()) .build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.LEFT_RIGHT_REC) .setAssociativity(Associativity.LEFT) .setPrecedence(2) .setPrecedenceLevel(PrecedenceLevel.from(2, 2, -1, false, false, true, false)) .build()) // S ::= E {UNDEFINED,-1,NON_REC} PREC(1,1) .addRule( Rule.withHead(Nonterminal.builder("S").build()) .addSymbol(Nonterminal.builder("E").build()) .setRecursion(Recursion.NON_REC) .setAssociativity(Associativity.UNDEFINED) .setPrecedence(-1) .setPrecedenceLevel(PrecedenceLevel.from(1, 1, -1, false, false, false, false)) .build()) .build(); grammar = new EBNFToBNF().transform(grammar); grammar = new DesugarPrecedenceAndAssociativity().transform(grammar); System.out.println(grammar.toStringWithOrderByPrecedence()); grammar = new LayoutWeaver().transform(grammar); Input input = Input.fromString("a + if a then a else a + a"); GrammarGraph graph = grammar.toGrammarGraph(input, Configuration.DEFAULT); // Visualization.generateGrammarGraph("/Users/anastasiaizmaylova/git/diguana/test/org/jgll/parser/datadependent/precedence/", graph); GLLParser parser = ParserFactory.getParser(Configuration.DEFAULT, input, grammar); ParseResult result = parser.parse(input, graph, Nonterminal.withName("S")); Assert.assertTrue(result.isParseSuccess()); Visualization.generateSPPFGraph( "/Users/anastasiaizmaylova/git/diguana/test/org/jgll/parser/datadependent/precedence/", result.asParseSuccess().getRoot(), input); Assert.assertTrue(result.asParseSuccess().getStatistics().getCountAmbiguousNodes() == 0); }