1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.regex.Pattern;
import kodkod.ast.Relation;
public class StringManager
{
private final Map<String, String> TO_ID;
private final Collection<Pattern> regexes;
private final VHDLType string_type;
private final String anon_string_prefix;
private int anon_string_count;
private static String cleanup_string (final String str)
{
return str.replaceAll("\\s","").toLowerCase();
}
public StringManager ()
{
TO_ID = new HashMap<String, String>();
regexes = new ArrayList<Pattern>();
string_type = Main.get_model().get_string_type();
anon_string_prefix = "_string_"; /* TODO: use a program param. */
anon_string_count = 0;
}
public Relation get_string_as_relation
(
final String str
)
{
String id;
id = TO_ID.get(cleanup_string(str));
if (id == null)
{
id = (anon_string_prefix + anon_string_count);
anon_string_count += 1;
string_type.add_member(id);
TO_ID.put(str, id);
}
return string_type.get_member_as_relation(id);
}
public Relation get_regex_as_relation
(
final String str
)
{
regexes.add(Pattern.compile(str.substring(1, (str.length() - 1))));
return get_string_as_relation(str);
}
public void populate_regex_predicate (final VHDLPredicate rp)
{
final Set<Map.Entry<String, String>> candidates;
candidates = TO_ID.entrySet();
for (final Pattern p: regexes)
{
for (final Map.Entry<String, String> c: candidates)
{
String word;
word = c.getKey();
/* Remove the surounding "" */
word = word.substring(1, (word.length() - 1));
if (p.matcher(word).matches())
{
System.out.println
(
"[D] \""
+ word
+ "\" MATCHES pattern \""
+ p.pattern()
+ "\"."
);
rp.add_member
(
new String[]
{
c.getValue(),
TO_ID.get("\"" + p.pattern() + "\"")
}
);
}
/*
else
{
System.out.println
(
"[D] \""
+ word
+ "\" DOES NOT match pattern \""
+ p.pattern()
+ "\"."
);
}
*/
}
}
}
private void add_mapping (String str, final String id)
{
str = cleanup_string(str);
if (!TO_ID.containsKey(str))
{
TO_ID.put(str, id);
string_type.add_member(id);
}
}
public boolean handle_mapping_instruction (final String... instr)
{
if (instr.length < 3)
{
return false;
}
if (!instr[0].equals("string->instr"))
{
return false;
}
add_mapping(instr[1], instr[2]);
return true;
}
}
|