Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Commit 7a88d32

Browse files
committed
Fix several critical bugs
1 parent 2ee061c commit 7a88d32

File tree

10 files changed

+36
-30
lines changed

10 files changed

+36
-30
lines changed

src/main/java/cn/alumik/parsetree/ParseTreeApp.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ public class ParseTreeApp {
1212
public static void main(String[] args) {
1313
final Config config = new Config("config.yml");
1414
try {
15-
final Lexer lexer = new Lexer(config);
1615
final Parser parser = new Parser(config);
16+
final Lexer lexer = new Lexer(config, parser);
1717

1818
final Scanner scanner = new Scanner(System.in);
1919
final ParseTree parseTree = parser.parse(lexer.lex(scanner.next()));
20-
parseTree.draw("out/parse-tree.png");
20+
parseTree.draw("out/parse_tree.png");
2121
} catch (Exception e) {
2222
e.printStackTrace();
2323
}

src/main/java/cn/alumik/parsetree/lexer/Lexer.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import cn.alumik.parsetree.lexer.fsm.DFA;
66
import cn.alumik.parsetree.lexer.fsm.FSMState;
77
import cn.alumik.parsetree.lexer.fsm.NFA;
8+
import cn.alumik.parsetree.parser.Parser;
89
import cn.alumik.parsetree.symbol.TerminalSymbol;
910
import cn.alumik.parsetree.util.Config;
1011

@@ -14,14 +15,17 @@ public class Lexer {
1415

1516
private final Config mConfig;
1617

18+
private final Parser mParser;
19+
1720
private DFA mDfa;
1821

1922
private Map<String, String> mAcceptingRules = new LinkedHashMap<>();
2023

2124
private Set<String> mIgnoredSymbols = new HashSet<>();
2225

23-
public Lexer(Config config) throws AnalysisException, ParsingException {
26+
public Lexer(Config config, Parser parser) throws AnalysisException, ParsingException {
2427
mConfig = config;
28+
mParser = parser;
2529
initAcceptingRules();
2630
initDFA();
2731
}
@@ -38,11 +42,7 @@ public void setAcceptingRule(Map<String, String> acceptingRules) {
3842
mAcceptingRules = acceptingRules;
3943
}
4044

41-
public Set<String> getIgnoredSymbols() {
42-
return mIgnoredSymbols;
43-
}
44-
45-
public List<TerminalSymbol> lex(String input) throws ParsingException {
45+
public List<TerminalSymbol> lex(String input) throws ParsingException, AnalysisException {
4646
final List<TerminalSymbol> lexResult = new ArrayList<>();
4747
final StringBuilder stringBuilder = new StringBuilder(input);
4848
while (stringBuilder.length() != 0) {
@@ -53,7 +53,9 @@ public List<TerminalSymbol> lex(String input) throws ParsingException {
5353
if (!mIgnoredSymbols.contains(result.getKey())) {
5454
final String value = stringBuilder.substring(0, result.getValue());
5555
System.out.println(result.getKey() + ": " + value);
56-
final TerminalSymbol terminalSymbol = new TerminalSymbol(value);
56+
final TerminalSymbol terminalSymbol = new TerminalSymbol(
57+
mParser.getGrammar().getSymbolPool().getTerminalSymbol(result.getKey()));
58+
terminalSymbol.setValue(value);
5759
lexResult.add(terminalSymbol);
5860
}
5961
stringBuilder.delete(0, result.getValue());

src/main/java/cn/alumik/parsetree/parser/Grammar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class Grammar {
1515

1616
private AbstractNonterminalSymbol mStartSymbol;
1717

18-
final private SymbolPool mSymbolPool;
18+
private final SymbolPool mSymbolPool;
1919

2020
private List<Production> mProductions;
2121

src/main/java/cn/alumik/parsetree/parser/ParseTree.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package cn.alumik.parsetree.parser;
22

33
import cn.alumik.parsetree.util.IDGen;
4-
import guru.nidi.graphviz.attribute.Color;
5-
import guru.nidi.graphviz.attribute.Label;
4+
import guru.nidi.graphviz.attribute.*;
65
import guru.nidi.graphviz.engine.Format;
76
import guru.nidi.graphviz.engine.Graphviz;
87
import guru.nidi.graphviz.engine.GraphvizV8Engine;
@@ -39,10 +38,14 @@ private MutableGraph getGraph() {
3938
while (!nodeQueue.isEmpty()) {
4039
final ParseTreeNode currentNode = nodeQueue.poll();
4140
final MutableNode currentGraphNode = mutNode(currentNode.getId())
42-
.add(Label.of(currentNode.getSymbol().getValue()));
41+
.add(Label.of(currentNode.getSymbol().getAbstractSymbol().getName()));
4342
graphNodes.add(currentGraphNode);
4443
if (currentNode.getChildren().isEmpty()) {
45-
currentGraphNode.add(Color.BLUE);
44+
final MutableNode valueNode = mutNode(currentNode.getId() + currentNode.getSymbol().getValue())
45+
.add(Label.of(currentNode.getSymbol().getValue())).add(Shape.BOX).add(Color.BLUE);
46+
graphNodes.add(valueNode);
47+
currentGraphNode.addLink(currentGraphNode.linkTo(valueNode)
48+
.add(Style.DASHED).add(Color.BLUE).add(Arrow.NONE));
4649
} else {
4750
for (final ParseTreeNode nextNode : currentNode.getChildren()) {
4851
nodeQueue.add(nextNode);

src/main/java/cn/alumik/parsetree/parser/Parser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ public ParseTree parse(List<TerminalSymbol> terminalSymbols) throws AnalysisExce
8080

8181
private void initTerminalSymbolList(List<TerminalSymbol> terminalSymbols) throws AnalysisException {
8282
for (final TerminalSymbol terminalSymbol : terminalSymbols) {
83-
terminalSymbol.setAbstractSymbol(mGrammar.getSymbolPool().getTerminalSymbol(terminalSymbol.getValue()));
83+
terminalSymbol.setAbstractSymbol(
84+
mGrammar.getSymbolPool().getTerminalSymbol(terminalSymbol.getAbstractSymbol().getName()));
8485
}
8586
}
8687
}

src/main/java/cn/alumik/parsetree/symbol/AbstractSymbol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public boolean equals(Object obj) {
2929

3030
@Override
3131
public String toString() {
32-
return (getType() == TERMINAL ? "Terminal Symbol: " : "Nonterminal Symbol: ") + mName;
32+
return (getType() == TERMINAL ? "Terminal symbol: " : "Nonterminal symbol: ") + mName;
3333
}
3434

3535
@Override

src/main/java/cn/alumik/parsetree/symbol/NonterminalSymbol.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,4 @@ public NonterminalSymbol(AbstractNonterminalSymbol abstractNonterminalSymbol) {
66
super(abstractNonterminalSymbol.getName());
77
setAbstractSymbol(abstractNonterminalSymbol);
88
}
9-
10-
public NonterminalSymbol(String value) {
11-
super(value);
12-
}
139
}

src/main/java/cn/alumik/parsetree/symbol/Symbol.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public class Symbol {
44

55
private AbstractSymbol mAbstractSymbol;
66

7-
final private String mValue;
7+
private String mValue;
88

99
public Symbol(String value) {
1010
mValue = value;
@@ -22,6 +22,10 @@ public String getValue() {
2222
return mValue;
2323
}
2424

25+
public void setValue(String value) {
26+
mValue = value;
27+
}
28+
2529
@Override
2630
public boolean equals(Object obj) {
2731
if (obj instanceof Symbol) {

src/main/java/cn/alumik/parsetree/util/Config.java

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

99
public class Config {
1010

11-
final private ConfigSource mConfigSource;
11+
private final ConfigSource mConfigSource;
1212

1313
public Config(String path) {
1414
final Yaml yaml = new Yaml(new Constructor(ConfigSource.class));

src/main/resources/config.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ nonterminalSymbols:
77
? S
88
terminalSymbols:
99
# name: regex
10-
a: a
11-
b: b
10+
α: a
11+
β: b
1212
ignoredSymbols:
1313
startSymbol: S
1414
productions:
1515
# - left part -> right part
16-
- S -> C b B A
17-
- A -> A a b
18-
- A -> a b
16+
- S -> C β B A
17+
- A -> A α β
18+
- A -> α β
1919
- B -> C
20-
- B -> D b
21-
- C -> a
22-
- D -> a
20+
- B -> D β
21+
- C -> α
22+
- D -> α

0 commit comments

Comments
 (0)