reimplement first + follow + testing

This commit is contained in:
Christoph
2020-12-06 02:07:00 +01:00
parent 49e047ce56
commit cec76298e8
4 changed files with 362 additions and 293 deletions

View File

@ -1,9 +1,8 @@
package parser.grammar;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import parser.grammar.Grammar;
import parser.grammar.GrammarRule;
import parser.grammar.LL1GrammarAnalyzer;
import parser.ILL1ParsingTable;
import java.util.Arrays;
import java.util.HashSet;
@ -13,8 +12,12 @@ import static org.assertj.core.api.Assertions.assertThat;
class LL1GrammarAnalyzerTest {
@Test
void testTable0() {
private static Grammar grammar0;
private static Grammar grammar1;
private static Grammar grammar2;
@BeforeAll
static void initGrammar0() {
/*
S -> a
S -> i E t S
@ -37,19 +40,11 @@ class LL1GrammarAnalyzerTest {
rules.add(new GrammarRule("S", "i", "E", "t", "S"));
rules.add(new GrammarRule("E", "b"));
Grammar grammar = new Grammar(terminals, nonterminals,
startSymbol, epsilonSymbol,
rules);
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar);
assertThat(analyzer.getTable().get("S", "a")).isEqualTo("a");
assertThat(analyzer.getTable().get("S", "i")).isEqualTo("i E t S");
assertThat(analyzer.getTable().get("E", "b")).isEqualTo("b");
grammar0 = new Grammar(terminals, nonterminals, startSymbol, epsilonSymbol, rules);
}
@Test
void testTable1() {
@BeforeAll
static void initGrammar1() {
/*
Folie 4b/32
*/
@ -75,12 +70,115 @@ class LL1GrammarAnalyzerTest {
rules.add(new GrammarRule("F", "(", "E", ")"));
rules.add(new GrammarRule("F", "id"));
Grammar grammar = new Grammar(terminals, nonterminals,
startSymbol, epsilonSymbol,
rules);
grammar1 = new Grammar(terminals, nonterminals, startSymbol, epsilonSymbol, rules);
}
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar);
@BeforeAll
static void initGrammar2() {
/*
Z -> d
Z -> X Y Z
Y ->
Y -> c
X -> Y
X -> a
*/
assertThat(analyzer.getTable().get("F", "id")).isEqualTo("id");
Set<String> nonterminals;
String[] narray = {"X", "Y", "Z"};
nonterminals = new HashSet<>(Arrays.asList(narray));
Set<String> terminals;
String[] tarray = {"a", "c", "d"};
terminals = new HashSet<>(Arrays.asList(tarray));
String startSymbol = "Z";
String epsilonSymbol = "epsilon";
Set<GrammarRule> rules = new HashSet<>();
rules.add(new GrammarRule("Z", "d"));
rules.add(new GrammarRule("Z", "X", "Y", "Z"));
rules.add(new GrammarRule("Y", epsilonSymbol));
rules.add(new GrammarRule("Y", "c"));
rules.add(new GrammarRule("X", "Y"));
rules.add(new GrammarRule("X", "a"));
grammar2 = new Grammar(terminals, nonterminals, startSymbol, epsilonSymbol, rules);
}
@Test
void testFirstGrammar0() {
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar0);
assertThat(analyzer.getFirst().get("S")).containsOnly("i", "a");
assertThat(analyzer.getFirst().get("E")).containsOnly("b");
}
@Test
void testFirstGrammar1() {
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar1);
assertThat(analyzer.getFirst().get("E")).containsOnly("id", "(");
assertThat(analyzer.getFirst().get("E2")).containsOnly("+", grammar1.getEpsilonSymbol());
assertThat(analyzer.getFirst().get("T")).containsOnly("id", "(");
assertThat(analyzer.getFirst().get("T2")).containsOnly("*", grammar1.getEpsilonSymbol());
assertThat(analyzer.getFirst().get("F")).containsOnly("id", "(");
}
@Test
void testFirstGrammar2() {
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar2);
assertThat(analyzer.getFirst().get("X")).containsOnly("c", "a", grammar2.getEpsilonSymbol());
assertThat(analyzer.getFirst().get("Y")).containsOnly("c", grammar2.getEpsilonSymbol());
assertThat(analyzer.getFirst().get("Z")).containsOnly("c", "a", "d");
}
@Test
void testFollowGrammar0() {
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar0);
assertThat(analyzer.getFollow().get("S")).containsOnly("$");
assertThat(analyzer.getFollow().get("E")).containsOnly("t");
}
@Test
void testFollowGrammar1() {
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar1);
assertThat(analyzer.getFollow().get("E")).containsOnly(")", "$");
assertThat(analyzer.getFollow().get("E2")).containsOnly(")", "$");
assertThat(analyzer.getFollow().get("T")).containsOnly("+", ")", "$");
assertThat(analyzer.getFollow().get("T2")).containsOnly("+", ")", "$");
assertThat(analyzer.getFollow().get("F")).containsOnly("+", "*", ")", "$");
}
@Test
void testFollowGrammar2() {
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar2);
assertThat(analyzer.getFollow().get("X")).containsOnly("a", "c", "d");
assertThat(analyzer.getFollow().get("Y")).containsOnly("a", "c", "d");
assertThat(analyzer.getFollow().get("Z")).containsOnly("$");
}
@Test
void testTableGrammar1() {
LL1GrammarAnalyzer analyzer = new LL1GrammarAnalyzer(grammar1);
ILL1ParsingTable table = analyzer.getTable();
assertThat(table.get("E", "id")).isEqualTo("T E2");
assertThat(table.get("E", "(")).isEqualTo("T E2");
assertThat(table.get("E2", "+")).isEqualTo("+ T E2");
assertThat(table.get("E2", ")")).isEqualTo(grammar1.getEpsilonSymbol());
assertThat(table.get("E2", "$")).isEqualTo(grammar1.getEpsilonSymbol());
assertThat(table.get("T", "id")).isEqualTo("F T2");
assertThat(table.get("T", "(")).isEqualTo("F T2");
assertThat(table.get("T2", "+")).isEqualTo(grammar1.getEpsilonSymbol());
assertThat(table.get("T2", "*")).isEqualTo("* F T2");
assertThat(table.get("T2", ")")).isEqualTo(grammar1.getEpsilonSymbol());
assertThat(table.get("T2", "$")).isEqualTo(grammar1.getEpsilonSymbol());
assertThat(table.get("F", "id")).isEqualTo("id");
assertThat(table.get("F", "(")).isEqualTo("( E )");
}
}