1 /*
2 * Copyright (c) 2012-2020 The ANTLR Project. All rights reserved.
3 * Use of this file is governed by the BSD 3-clause license that
4 * can be found in the LICENSE.txt file in the project root.
5 */
6
7 module antlr.v4.runtime.dfa.DFASerializer;
8
9 import std.array;
10 import std.conv;
11 import antlr.v4.runtime.dfa.DFA;
12 import antlr.v4.runtime.dfa.DFAState;
13 import antlr.v4.runtime.Vocabulary;
14 import antlr.v4.runtime.VocabularyImpl;
15
16 /**
17 * @uml
18 * A DFA walker that knows how to dump them to serialized strings.
19 */
20 class DFASerializer
21 {
22
23 public DFA dfa;
24
25 public Vocabulary vocabulary;
26
27 public this(DFA dfa, string[] tokenNames)
28 {
29 this(dfa, VocabularyImpl.fromTokenNames(tokenNames));
30 }
31
32 public this(DFA dfa, Vocabulary vocabulary)
33 {
34 this.dfa = dfa;
35 this.vocabulary = vocabulary;
36 }
37
38 /**
39 * @uml
40 * @override
41 */
42 public override string toString()
43 {
44 if (dfa.s0 is null)
45 return null;
46 auto buf = appender!string;
47 DFAState[] states = dfa.getStates;
48 foreach (DFAState s; states) {
49 uint n = 0;
50 if (s.edges !is null)
51 n = to!uint(s.edges.length);
52 for (uint i = 0; i < n; i++) {
53 DFAState t = s.edges[i];
54 if (t && t.stateNumber != int.max) {
55 buf.put(getStateString(s));
56 string label = getEdgeLabel(i);
57 buf.put("-");
58 buf.put(label);
59 buf.put("->");
60 buf.put(getStateString(t));
61 buf.put('\n');
62 }
63 }
64 }
65
66 string output = buf.data;
67 if (output.length == 0) return null;
68 //return Utils.sortLinesInString(output);
69 return output;
70 }
71
72 public string getEdgeLabel(int i)
73 {
74 return vocabulary.getDisplayName(i - 1);
75 }
76
77 public string getStateString(DFAState s)
78 {
79 int n = s.stateNumber;
80 string baseStateStr = (s.isAcceptState ? ":" : "") ~ "s" ~ to!string(n) ~
81 (s.requiresFullContext ? "^" : "");
82 if (s.isAcceptState) {
83 if (s.predicates !is null) {
84 return baseStateStr ~ "=>" ~ to!string(s.predicates);
85 }
86 else {
87 return baseStateStr ~ "=>" ~ to!string(s.prediction);
88 }
89 }
90 else {
91 return baseStateStr;
92 }
93
94 }
95
96 }