Static Value-Flow Analysis
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Attributes | Static Protected Attributes | Private Attributes | List of all members
SVF::GrammarBase Class Reference

#include <CFGrammar.h>

Inheritance diagram for SVF::GrammarBase:
SVF::CFGrammar

Classes

struct  Symbol
 
class  SymbolHash
 
struct  SymbolVectorHash
 

Public Types

typedef u32_t Kind
 
typedef u32_t Attribute
 
typedef u32_t VariableAttribute
 
typedef struct SVF::GrammarBase::Symbol Symbol
 
template<typename Key , typename Value , typename Hash = SymbolHash, typename KeyEqual = std::equal_to<Key>, typename Allocator = std::allocator<std::pair<const Key, Value>>>
using SymbolMap = Map< Key, Value, Hash, KeyEqual, Allocator >
 
template<typename Key , typename Hash = SymbolVectorHash, typename KeyEqual = std::equal_to<Key>, typename Allocator = std::allocator<Key>>
using SymbolSet = Set< Key, Hash, KeyEqual, Allocator >
 
typedef std::vector< SymbolProduction
 
typedef SymbolSet< ProductionProductions
 

Public Member Functions

Map< std::string, Kind > & getNonterminals ()
 
void setNonterminals (Map< std::string, Kind > &nonterminals)
 
Map< std::string, Kind > & getTerminals ()
 
void setTerminals (Map< std::string, Kind > &terminals)
 
Map< std::string, Kind > & getEBNFSigns ()
 
void setEBNFSigns (Map< std::string, Kind > &EBNFSigns)
 
SymbolMap< Symbol, Productions > & getRawProductions ()
 
const Map< Kind, Set< Attribute > > & getKindToAttrsMap () const
 
Kind getTotalKind ()
 
Kind getStartKind ()
 
void setStartKind (Kind startKind)
 
void setTotalKind (Kind totalKind)
 
std::string extractKindStrFromSymbolStr (const std::string &symbolStr) const
 
std::string extractAttributeStrFromSymbolStr (const std::string &symbolStr) const
 
void setRawProductions (SymbolMap< Symbol, Productions > &rawProductions)
 
void setKindToAttrsMap (const Map< Kind, Set< Attribute > > &kindToAttrsMap)
 
void setAttributeKinds (const Set< Kind > &attributeKind)
 
Kind strToKind (std::string str) const
 
Symbol strToSymbol (const std::string str) const
 
std::string kindToStr (Kind kind) const
 
std::string symToStrDump (Symbol sym) const
 
Symbol getSymbol (const Production &prod, u32_t pos)
 
const Set< Kind > & getAttrSyms () const
 
Kind insertNonterminalKind (std::string const kindStr)
 Insert kind to nonterminal and return kind.
 
Kind insertTerminalKind (std::string strLit)
 
Symbol insertSymbol (std::string strLit)
 
Symbol insertNonTerminalSymbol (std::string strLit)
 
Symbol insertTerminalSymbol (std::string strLit)
 
Symbol insertEBNFSigns (std::string strLit)
 
void insertAttribute (Kind kind, Attribute a)
 

Static Public Member Functions

static Kind getAttributedKind (Attribute attribute, Kind kind)
 
static Kind getVariabledKind (VariableAttribute variableAttribute, Kind kind)
 

Protected Attributes

Kind startKind
 

Static Protected Attributes

static constexpr unsigned char EdgeKindMaskBits = 8
 We use the lower 8 bits to denote edge kind.
 
static constexpr unsigned char AttributedKindMaskBits = 24
 We use the lower 24 bits to denote attributed kind.
 
static constexpr u64_t EdgeKindMask = (~0ULL) >> (64 - EdgeKindMaskBits)
 

Private Attributes

Map< std::string, Kindnonterminals
 
Map< std::string, Kindterminals
 
Map< std::string, KindEBNFSigns
 
Set< KindattributeKinds
 Map contains Signs' String and associated Symbols.
 
Map< Kind, Set< Attribute > > kindToAttrsMap
 
SymbolMap< Symbol, ProductionsrawProductions
 
u32_t totalKind
 

Detailed Description

Definition at line 40 of file CFGrammar.h.

Member Typedef Documentation

◆ Attribute

Definition at line 44 of file CFGrammar.h.

◆ Kind

Definition at line 43 of file CFGrammar.h.

◆ Production

Definition at line 160 of file CFGrammar.h.

◆ Productions

Definition at line 161 of file CFGrammar.h.

◆ Symbol

◆ SymbolMap

template<typename Key , typename Value , typename Hash = SymbolHash, typename KeyEqual = std::equal_to<Key>, typename Allocator = std::allocator<std::pair<const Key, Value>>>
using SVF::GrammarBase::SymbolMap = Map<Key, Value, Hash, KeyEqual, Allocator>

Definition at line 154 of file CFGrammar.h.

◆ SymbolSet

template<typename Key , typename Hash = SymbolVectorHash, typename KeyEqual = std::equal_to<Key>, typename Allocator = std::allocator<Key>>
using SVF::GrammarBase::SymbolSet = Set<Key, Hash, KeyEqual, Allocator>

Definition at line 158 of file CFGrammar.h.

◆ VariableAttribute

Definition at line 45 of file CFGrammar.h.

Member Function Documentation

◆ extractAttributeStrFromSymbolStr()

std::string GrammarBase::extractAttributeStrFromSymbolStr ( const std::string &  symbolStr) const

Definition at line 221 of file CFGrammar.cpp.

222{
223 std::string attributeStr;
224 // symbolStr end with '_', the whole symbolStr treat as kind, not with attribute.
225 auto underscorePosition = symbolStr.find_last_of("_", symbolStr.size()-1);
226 if (underscorePosition == std::string::npos)
227 {
228 return "";
229 }
230 return symbolStr.substr(underscorePosition+1);
231}
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76

◆ extractKindStrFromSymbolStr()

std::string GrammarBase::extractKindStrFromSymbolStr ( const std::string &  symbolStr) const

Definition at line 209 of file CFGrammar.cpp.

210{
211 std::string kindStr;
212 // symbolStr end with '_', the whole symbolStr treat as kind, not with attribute.
213 auto underscorePosition = symbolStr.find_last_of("_", symbolStr.size()-1);
214 if (underscorePosition == std::string::npos)
215 {
216 return symbolStr;
217 }
218 return symbolStr.substr(0, underscorePosition);
219}

◆ getAttributedKind()

static Kind SVF::GrammarBase::getAttributedKind ( Attribute  attribute,
Kind  kind 
)
inlinestatic

Definition at line 269 of file CFGrammar.h.

270 {
271 return ((attribute << EdgeKindMaskBits)| kind );
272 }
static constexpr unsigned char EdgeKindMaskBits
We use the lower 8 bits to denote edge kind.
Definition CFGrammar.h:280

◆ getAttrSyms()

const Set< Kind > & SVF::GrammarBase::getAttrSyms ( ) const
inline

Definition at line 247 of file CFGrammar.h.

248 {
249 return this->attributeKinds;
250 }
Set< Kind > attributeKinds
Map contains Signs' String and associated Symbols.
Definition CFGrammar.h:288

◆ getEBNFSigns()

Map< std::string, Kind > & SVF::GrammarBase::getEBNFSigns ( )
inline

Definition at line 184 of file CFGrammar.h.

185 {
186 return this->EBNFSigns;
187 }
Map< std::string, Kind > EBNFSigns
Definition CFGrammar.h:287

◆ getKindToAttrsMap()

const Map< Kind, Set< Attribute > > & SVF::GrammarBase::getKindToAttrsMap ( ) const
inline

Definition at line 199 of file CFGrammar.h.

200 {
201 return this->kindToAttrsMap;
202 }
Map< Kind, Set< Attribute > > kindToAttrsMap
Definition CFGrammar.h:289

◆ getNonterminals()

Map< std::string, Kind > & SVF::GrammarBase::getNonterminals ( )
inline

Definition at line 164 of file CFGrammar.h.

165 {
166 return this->nonterminals;
167 }
Map< std::string, Kind > nonterminals
Definition CFGrammar.h:285

◆ getRawProductions()

SymbolMap< Symbol, Productions > & SVF::GrammarBase::getRawProductions ( )
inline

Definition at line 194 of file CFGrammar.h.

195 {
196 return this->rawProductions;
197 }
SymbolMap< Symbol, Productions > rawProductions
Definition CFGrammar.h:290

◆ getStartKind()

Kind SVF::GrammarBase::getStartKind ( )
inline

Definition at line 209 of file CFGrammar.h.

210 {
211 return this->startKind;
212 }

◆ getSymbol()

Symbol SVF::GrammarBase::getSymbol ( const Production prod,
u32_t  pos 
)
inline

Definition at line 242 of file CFGrammar.h.

243 {
244 return prod.at(pos);
245 }

◆ getTerminals()

Map< std::string, Kind > & SVF::GrammarBase::getTerminals ( )
inline

Definition at line 174 of file CFGrammar.h.

175 {
176 return this->terminals;
177 }
Map< std::string, Kind > terminals
Definition CFGrammar.h:286

◆ getTotalKind()

Kind SVF::GrammarBase::getTotalKind ( )
inline

Definition at line 204 of file CFGrammar.h.

205 {
206 return this->totalKind;
207 }

◆ getVariabledKind()

static Kind SVF::GrammarBase::getVariabledKind ( VariableAttribute  variableAttribute,
Kind  kind 
)
inlinestatic

Definition at line 274 of file CFGrammar.h.

275 {
276 return ((variableAttribute << AttributedKindMaskBits) | kind);
277 }
static constexpr unsigned char AttributedKindMaskBits
We use the lower 24 bits to denote attributed kind.
Definition CFGrammar.h:281

◆ insertAttribute()

void GrammarBase::insertAttribute ( Kind  kind,
Attribute  a 
)

Definition at line 329 of file CFGrammar.cpp.

330{
331 attributeKinds.insert(kind);
332 if (kindToAttrsMap.find(kind)!= kindToAttrsMap.end())
333 {
334 kindToAttrsMap[kind].insert(attribute);
335 }
336 else
337 {
339 kindToAttrsMap.insert(make_pair(kind, attrs));
340 }
341}

◆ insertEBNFSigns()

GrammarBase::Symbol GrammarBase::insertEBNFSigns ( std::string  strLit)

Definition at line 313 of file CFGrammar.cpp.

314{
315 Symbol sign;
316 if (EBNFSigns.find(symbolStr) == EBNFSigns.end())
317 {
318 sign = totalKind++;
319 EBNFSigns.insert({symbolStr, sign});
320 }
321 else
322 {
324 }
325 return sign;
326
327}
Kind strToKind(std::string str) const
Definition CFGrammar.cpp:57
struct SVF::GrammarBase::Symbol Symbol

◆ insertNonterminalKind()

GrammarBase::Kind GrammarBase::insertNonterminalKind ( std::string const  kindStr)
inline

Insert kind to nonterminal and return kind.

Definition at line 194 of file CFGrammar.cpp.

195{
196 Kind kind;
197 if (nonterminals.find(kindStr) == nonterminals.end())
198 {
199 kind = totalKind++;
200 nonterminals.insert({kindStr, kind});
201 }
202 else
203 {
204 kind = strToKind(kindStr);
205 }
206 return kind;
207}

◆ insertNonTerminalSymbol()

GrammarBase::Symbol GrammarBase::insertNonTerminalSymbol ( std::string  strLit)

Definition at line 251 of file CFGrammar.cpp.

252{
257
258 if ( attributeStr == "") return symbol;
259
260 if ( (attributeStr.size() == 1) && (std::isalpha(attributeStr[attributeStr.size()-1])) )
261 {
262 attributeKinds.insert(symbol.kind);
263 symbol.variableAttribute = (u32_t)attributeStr[attributeStr.size()-1];
264 }
265 else
266 {
267 for( char &c : attributeStr)
268 {
269 if ( std::isdigit(c) == false )
270 {
271 SVFUtil::errs() << SVFUtil::errMsg("\t Symbol Attribute Parse Failure :") << symbolStr
272 << " Attribute:" << attributeStr << " (only number or single alphabet.)";
273 assert(false && "grammar loading failed!");
274 }
275 }
276 attributeKinds.insert(symbol.kind);
277 symbol.attribute = std::stoi(attributeStr);
278 }
279 return symbol;
280}
std::string extractAttributeStrFromSymbolStr(const std::string &symbolStr) const
std::string extractKindStrFromSymbolStr(const std::string &symbolStr) const
Kind insertNonterminalKind(std::string const kindStr)
Insert kind to nonterminal and return kind.
std::string errMsg(const std::string &msg)
Print error message by converting a string into red string output.
Definition SVFUtil.cpp:82
std::ostream & errs()
Overwrite llvm::errs()
Definition SVFUtil.h:58
unsigned u32_t
Definition GeneralType.h:67

◆ insertSymbol()

GrammarBase::Symbol GrammarBase::insertSymbol ( std::string  strLit)

Definition at line 233 of file CFGrammar.cpp.

234{
236 if ((symbolStr.size() == 1) && (!isalpha(symbolStr[0])))
237 {
239 }
240 else if (isupper(symbolStr[0]))
241 {
243 }
244 else
245 {
247 }
248 return symbol;
249}
Symbol insertEBNFSigns(std::string strLit)
Symbol insertNonTerminalSymbol(std::string strLit)
Symbol insertTerminalSymbol(std::string strLit)
int isupper(int c)
Definition extapi.c:1004
int isalpha(int character)
Definition extapi.c:959

◆ insertTerminalKind()

GrammarBase::Kind GrammarBase::insertTerminalKind ( std::string  strLit)

From SymbolStr extract kind to inserted in nonterminal symbolStr = <kindStr> [_] [ attributeStr | variableattributeStr ]

Definition at line 179 of file CFGrammar.cpp.

180{
181 Kind kind;
182 if (terminals.find(kindStr) == terminals.end())
183 {
184 kind = totalKind++;
185 terminals.insert({kindStr, kind});
186 }
187 else
188 {
189 kind = strToKind(kindStr);
190 }
191 return kind;
192}

◆ insertTerminalSymbol()

GrammarBase::Symbol GrammarBase::insertTerminalSymbol ( std::string  strLit)

Definition at line 282 of file CFGrammar.cpp.

283{
288
289 if ( attributeStr == "") return symbol;
290
291 if ( (attributeStr.size() == 1) && (std::isalpha(attributeStr[attributeStr.size()-1])) )
292 {
293 attributeKinds.insert(symbol.kind);
294 symbol.variableAttribute = (u32_t)attributeStr[attributeStr.size()-1];
295 }
296 else
297 {
298 for( char &c : attributeStr)
299 {
300 if ( std::isdigit(c) == false )
301 {
302 SVFUtil::errs() << SVFUtil::errMsg("\t Symbol Attribute Parse Failure :") << symbolStr
303 << " Attribute:" << attributeStr << " (only number or single alphabet.)";
304 assert(false && "grammar loading failed!");
305 }
306 }
307 attributeKinds.insert(symbol.kind);
308 symbol.attribute = std::stoi(attributeStr);
309 }
310 return symbol;
311}
Kind insertTerminalKind(std::string strLit)

◆ kindToStr()

std::string GrammarBase::kindToStr ( Kind  kind) const

Definition at line 105 of file CFGrammar.cpp.

106{
107
108 std::string key = "";
109 for (auto &i : terminals)
110 {
111 if (i.second == kind)
112 {
113 key = i.first;
114 return key;
115 }
116 }
117
118 std::string nkey = "";
119 for (auto &ni : nonterminals)
120 {
121 if (ni.second == kind)
122 {
123 nkey = ni.first;
124 return nkey;
125 }
126 }
127
128 std::string signs = "";
129 for (auto &i : EBNFSigns)
130 {
131 if (i.second == kind)
132 {
133 signs = i.first;
134 return signs;
135 }
136 }
137
138 return "";
139}

◆ setAttributeKinds()

void GrammarBase::setAttributeKinds ( const Set< Kind > &  attributeKind)

Definition at line 52 of file CFGrammar.cpp.

53{
55}

◆ setEBNFSigns()

void SVF::GrammarBase::setEBNFSigns ( Map< std::string, Kind > &  EBNFSigns)
inline

Definition at line 189 of file CFGrammar.h.

190 {
191 this->EBNFSigns = EBNFSigns;
192 }

◆ setKindToAttrsMap()

void GrammarBase::setKindToAttrsMap ( const Map< Kind, Set< Attribute > > &  kindToAttrsMap)

Definition at line 47 of file CFGrammar.cpp.

48{
50}

◆ setNonterminals()

void SVF::GrammarBase::setNonterminals ( Map< std::string, Kind > &  nonterminals)
inline

Definition at line 169 of file CFGrammar.h.

170 {
172 }

◆ setRawProductions()

void GrammarBase::setRawProductions ( SymbolMap< Symbol, Productions > &  rawProductions)

Definition at line 42 of file CFGrammar.cpp.

43{
45}

◆ setStartKind()

void SVF::GrammarBase::setStartKind ( Kind  startKind)
inline

Definition at line 214 of file CFGrammar.h.

215 {
216 this->startKind = startKind;
217 }

◆ setTerminals()

void SVF::GrammarBase::setTerminals ( Map< std::string, Kind > &  terminals)
inline

Definition at line 179 of file CFGrammar.h.

180 {
181 this->terminals = terminals;
182 }

◆ setTotalKind()

void SVF::GrammarBase::setTotalKind ( Kind  totalKind)
inline

Definition at line 219 of file CFGrammar.h.

220 {
221 this->totalKind = totalKind;
222 }

◆ strToKind()

GrammarBase::Kind GrammarBase::strToKind ( std::string  str) const

Definition at line 57 of file CFGrammar.cpp.

58{
59
60 auto tit = terminals.find(str);
61 if(tit!=terminals.end())
62 return tit->second;
63
64 auto nit = nonterminals.find(str);
65 if(nit!=nonterminals.end())
66 return nit->second;
67
68 auto sit = EBNFSigns.find(str);
69 if(sit!=EBNFSigns.end())
70 return sit->second;
71
72 assert(false && "kind not found!");
73 abort();
74}

◆ strToSymbol()

GrammarBase::Symbol GrammarBase::strToSymbol ( const std::string  str) const

Definition at line 76 of file CFGrammar.cpp.

77{
81 symbol.kind = strToKind(kindStr);
82
83 if ( attributeStr == "") return symbol;
84
85 if ( (attributeStr.size() == 1) && (std::isalpha(attributeStr[attributeStr.size()-1])) )
86 {
87 symbol.variableAttribute = (u32_t)attributeStr[attributeStr.size()-1];
88 }
89 else
90 {
91 for( char &c : attributeStr)
92 {
93 if ( std::isdigit(c) == false )
94 {
95 SVFUtil::errs() << SVFUtil::errMsg("\t Symbol Attribute Parse Failure :") << str
96 << " Attribute:" << attributeStr << " (only number or single alphabet.)";
97 assert(false && "grammar loading failed!");
98 }
99 }
100 symbol.attribute = std::stoi(attributeStr);
101 }
102 return symbol;
103}

◆ symToStrDump()

std::string GrammarBase::symToStrDump ( Symbol  sym) const

Definition at line 141 of file CFGrammar.cpp.

142{
143 Kind kind = sym.kind;
144 Attribute attribute = sym.attribute;
145
146 std::string key = "";
147 for (auto &i : terminals)
148 {
149 if (i.second == kind)
150 {
151 key = i.first;
152 if(attribute != 0)
153 {
154 key.append("_");
155 key.append(std::to_string(attribute));
156 }
157 return key;
158 }
159 }
160
161 std::string nkey = "";
162 for (auto &ni : nonterminals)
163 {
164 if (ni.second == kind)
165 {
166 nkey = ni.first;
167 if(attribute != 0)
168 {
169 nkey.append("_");
170 nkey.append(std::to_string(attribute));
171 }
172 return nkey;
173 }
174 }
175
176 return "";
177}

Member Data Documentation

◆ AttributedKindMaskBits

constexpr unsigned char SVF::GrammarBase::AttributedKindMaskBits = 24
staticconstexprprotected

We use the lower 24 bits to denote attributed kind.

Definition at line 281 of file CFGrammar.h.

◆ attributeKinds

Set<Kind> SVF::GrammarBase::attributeKinds
private

Map contains Signs' String and associated Symbols.

Definition at line 288 of file CFGrammar.h.

◆ EBNFSigns

Map<std::string, Kind> SVF::GrammarBase::EBNFSigns
private

Definition at line 287 of file CFGrammar.h.

◆ EdgeKindMask

constexpr u64_t SVF::GrammarBase::EdgeKindMask = (~0ULL) >> (64 - EdgeKindMaskBits)
staticconstexprprotected

Definition at line 282 of file CFGrammar.h.

◆ EdgeKindMaskBits

constexpr unsigned char SVF::GrammarBase::EdgeKindMaskBits = 8
staticconstexprprotected

We use the lower 8 bits to denote edge kind.

Definition at line 280 of file CFGrammar.h.

◆ kindToAttrsMap

Map<Kind, Set<Attribute> > SVF::GrammarBase::kindToAttrsMap
private

Definition at line 289 of file CFGrammar.h.

◆ nonterminals

Map<std::string, Kind> SVF::GrammarBase::nonterminals
private

Definition at line 285 of file CFGrammar.h.

◆ rawProductions

SymbolMap<Symbol, Productions> SVF::GrammarBase::rawProductions
private

Definition at line 290 of file CFGrammar.h.

◆ startKind

Kind SVF::GrammarBase::startKind
protected

Definition at line 283 of file CFGrammar.h.

◆ terminals

Map<std::string, Kind> SVF::GrammarBase::terminals
private

Definition at line 286 of file CFGrammar.h.

◆ totalKind

u32_t SVF::GrammarBase::totalKind
private

Definition at line 291 of file CFGrammar.h.


The documentation for this class was generated from the following files: