Skip to content

Commit 74716b7

Browse files
committed
Explain files, Add todos, remove unused stuff
1 parent fb74230 commit 74716b7

29 files changed

Lines changed: 208 additions & 308 deletions

.idea/workspace.xml

Lines changed: 44 additions & 100 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/ko/carbonel/Logger.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,4 @@ public static void internalTrace(Throwable e) {
3333
e.printStackTrace();
3434
}
3535
}
36-
37-
public static String getSymbol(char s) {
38-
if (s == Utils.EOF) return "[EOF]";
39-
return String.valueOf(s);
40-
}
4136
}

src/main/java/ko/carbonel/Utils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.stream.IntStream;
1818
import java.util.stream.Stream;
1919

20+
// TODO: Consider more coverage
2021
public class Utils {
2122
public static final char EOF = 0xffff;
2223
public static final String STR_EOF = String.valueOf(Utils.EOF);

src/main/java/ko/carbonel/compiler/config/Config.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import ko.carbonel.compiler.runner.output.PrettyTableWriter;
1313
import ko.carbonel.compiler.runner.output.TableWriter;
1414
import ko.carbonel.syntax.grammar.generator.AlphabeticRuleSorter;
15+
import ko.carbonel.syntax.grammar.generator.RuleSorter;
1516
import ko.carbonel.syntax.grammar.generator.StartAwareRuleSorter;
16-
import ko.carbonel.syntax.grammar.model.Rule;
1717
import ko.carbonel.syntax.grammar.model.Rules;
1818

1919
import java.io.File;
@@ -124,7 +124,7 @@ private String getSortFun() {
124124
return params.get(SORT_FUN);
125125
}
126126

127-
public Comparator<? super Rule> getActiveSorter(Rules rules) {
127+
public RuleSorter getActiveSorter(Rules rules) {
128128
// We will use rules parameter in the future if we want to do a dfs or bfs sort
129129
if (Objects.equals(getSortFun(), ALPHABETIC_SORT)) return new AlphabeticRuleSorter();
130130
return new StartAwareRuleSorter();

src/main/java/ko/carbonel/compiler/generated/Parser.java

Lines changed: 105 additions & 106 deletions
Large diffs are not rendered by default.

src/main/java/ko/carbonel/syntax/grammar/algorithm/BNFConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
public class BNFConverter {
1616
public static Rules convertBNF(Rules r) {
17-
while (r.rules().stream().anyMatch(rule -> rule.options().stream().anyMatch(to -> to.tokens().stream().anyMatch(Token::isBNFE)))) {
17+
while (r.rules().stream().anyMatch(rule -> rule.options().stream().anyMatch(To::isBNFE))) {
1818
Stream<Rule> newRules = r.rules().stream().flatMap(BNFConverter::convertBNF);
1919
r = new Rules(newRules.toList()).simplify();
2020
}

src/main/java/ko/carbonel/syntax/grammar/algorithm/DeFactorizer.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,9 @@
77

88
public class DeFactorizer {
99
public static Rules deFactorize(Rules r) {
10-
// Find all rules that are only used once
1110
Rules finalR = r;
1211
List<Token> nonTerminalTokens = r.getAllTokens().stream().filter(Token::isNonTerminal).toList();
13-
// List<Token> toDelete = nonTerminalTokens.stream().filter(token -> finalR.getRuleSectionsThatProduce(token).size() == 0).toList();
1412
List<Token> toReplace = nonTerminalTokens.stream().filter(token -> finalR.getRuleSectionsThatProduce(token).size() == 1).toList();
15-
// List<Token> toLeaveIntact = nonTerminalTokens.stream().filter(token -> finalR.getRuleSectionsThatProduce(token).size() > 1).toList();
1613
for (Token token : toReplace) {
1714
r = r.replaceToken(token, r.getRuleFor(token).options());
1815
}

src/main/java/ko/carbonel/syntax/grammar/algorithm/Factorizer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.stream.Collectors;
1212
import java.util.stream.Stream;
1313

14+
// TODO: Add coverage
1415
public class Factorizer {
1516
public static final String FACTORED_EXTRA = "F";
1617
static Map<Rule, List<Token>> multiPrefixRules = new HashMap<>();

src/main/java/ko/carbonel/syntax/grammar/algorithm/FirstCalculator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Set;
1010
import java.util.stream.Collectors;
1111

12+
// TODO: Add coverage
1213
public class FirstCalculator {
1314
public static Set<Token> calculateFirst(List<Token> gamma, Rules r) {
1415
if (gamma.size() == 0) throw new IllegalArgumentException("Cannot calculate first for empty list " + r);
@@ -25,7 +26,7 @@ public static Set<Token> calculateFullFirst(Token from, To to, Rules grammar) {
2526
Set<Token> first = FirstCalculator.calculateFirst(to.tokens(), grammar);
2627
if (first.contains(Token.LAMBDA)) {
2728
first.remove(Token.LAMBDA);
28-
first.addAll(NextCalculator.calculateNext2(from, grammar));
29+
first.addAll(NextCalculator.calculateNext(from, grammar));
2930
}
3031
return first;
3132
}

src/main/java/ko/carbonel/syntax/grammar/algorithm/NextCalculator.java

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,16 @@
11
package ko.carbonel.syntax.grammar.algorithm;
22

33
import ko.carbonel.Pair;
4-
import ko.carbonel.Utils;
54
import ko.carbonel.syntax.ParserGenerator;
6-
import ko.carbonel.syntax.grammar.model.Rule;
75
import ko.carbonel.syntax.grammar.model.Rules;
86
import ko.carbonel.syntax.grammar.model.Token;
97

108
import java.util.*;
119
import java.util.function.BiFunction;
1210
import java.util.stream.IntStream;
1311

12+
// TODO: Add coverage
1413
public class NextCalculator {
15-
// Not working
16-
public static Set<Token> calculateNext(Token gamma, Rules r) {
17-
List<Rule> rulesThatProduce = r.getRulesThatProduce(gamma);
18-
Set<Token> out = new HashSet<>();
19-
rulesThatProduce.forEach(rule -> rule.options().forEach(to -> {
20-
if (!to.tokens().contains(gamma)) return;
21-
List<Token> betas = Utils.indicesOf(gamma, to.tokens()).mapToObj(i -> to.tokens().get(i)).toList();
22-
if (betas.isEmpty()) {
23-
out.addAll(calculateNext(rule.from(), r));
24-
}
25-
betas.forEach(beta -> {
26-
if (beta.equals(Token.LAMBDA)) out.addAll(calculateNext(rule.from(), r));
27-
else out.addAll(FirstCalculator.calculateFirst(List.of(rule.from()), r));
28-
});
29-
}));
30-
return out;
31-
}
32-
3314
private static <T> void streamInPairs(List<T> list, BiFunction<Pair<T, T>, Boolean, Void> fun) {
3415
if (list.size() == 1) {
3516
fun.apply(new Pair<>(null, list.get(0)), true);
@@ -38,7 +19,10 @@ private static <T> void streamInPairs(List<T> list, BiFunction<Pair<T, T>, Boole
3819
}
3920
}
4021

41-
public static Set<Token> calculateNext2(Token gamma, Rules r) {
22+
// TODO: Clean this up
23+
// TODO: Add Caching
24+
// TODO: Avoid calculating all follows for each token everytime
25+
public static Set<Token> calculateNext(Token gamma, Rules r) {
4226
// We should probably cache this
4327
Map<Token, Set<Token>> follows = new HashMap<>();
4428
store(follows, ParserGenerator.START, Token.EOF);

0 commit comments

Comments
 (0)