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

#include <CFGrammar.h>

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

Public Member Functions

 CFGrammar ()
 
Productions & getEpsilonProds ()
 
SymbolMap< Symbol, Productions > & getSingleRHSToProds ()
 
SymbolMap< Symbol, Productions > & getFirstRHSToProds ()
 
SymbolMap< Symbol, Productions > & getSecondRHSToProds ()
 
const bool hasProdsFromFirstRHS (const Symbol sym) const
 
const bool hasProdsFromSingleRHS (const Symbol sym) const
 
const bool hasProdsFromSecondRHS (const Symbol sym) const
 
const Productions & getProdsFromSingleRHS (const Symbol sym) const
 
const Productions & getProdsFromFirstRHS (const Symbol sym) const
 
const Productions & getProdsFromSecondRHS (const Symbol sym) const
 
const Symbol & getLHSSymbol (const Production &prod) const
 
const Symbol & getFirstRHSSymbol (const Production &prod) const
 
const Symbol & getSecondRHSSymbol (const Production &prod) const
 
void dump () const
 
void dump (std::string fileName) const
 
const u32_t num_generator ()
 
- Public Member Functions inherited from SVF::GrammarBase
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 bool classof (const CFGrammar *)
 Methods for support type inquiry through isa, cast, and dyn_cast:
 
static bool classof (const GrammarBase *node)
 
- Static Public Member Functions inherited from SVF::GrammarBase
static Kind getAttributedKind (Attribute attribute, Kind kind)
 
static Kind getVariabledKind (VariableAttribute variableAttribute, Kind kind)
 

Private Attributes

SymbolSet< Production > epsilonProds
 
SymbolMap< Symbol, Productions > singleRHSToProds
 
SymbolMap< Symbol, Productions > firstRHSToProds
 
SymbolMap< Symbol, Productions > secondRHSToProds
 
u32_t newTerminalSubscript
 

Additional Inherited Members

- Public Types inherited from SVF::GrammarBase
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< Symbol > Production
 
typedef SymbolSet< Production > Productions
 
- Protected Attributes inherited from SVF::GrammarBase
Kind startKind
 
- Static Protected Attributes inherited from SVF::GrammarBase
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)
 

Detailed Description

Definition at line 294 of file CFGrammar.h.

Constructor & Destructor Documentation

◆ CFGrammar()

CFGrammar::CFGrammar ( )

Definition at line 343 of file CFGrammar.cpp.

344{
346}
u32_t newTerminalSubscript
Definition CFGrammar.h:402

Member Function Documentation

◆ classof() [1/2]

static bool SVF::CFGrammar::classof ( const CFGrammar *  )
inlinestatic

Methods for support type inquiry through isa, cast, and dyn_cast:

Definition at line 302 of file CFGrammar.h.

303 {
304 return true;
305 }

◆ classof() [2/2]

static bool SVF::CFGrammar::classof ( const GrammarBase *  node)
inlinestatic

Definition at line 307 of file CFGrammar.h.

308 {
309 return true;
310 }

◆ dump() [1/2]

void CFGrammar::dump ( ) const

Definition at line 348 of file CFGrammar.cpp.

349{
350 dump("Normailized_Grammar.txt");
351}
void dump() const

◆ dump() [2/2]

void CFGrammar::dump ( std::string  fileName) const

Definition at line 353 of file CFGrammar.cpp.

354{
355 std::ofstream gramFile(fileName);
356 gramFile << "Start Kind:\n";
357 gramFile << '\t' << kindToStr(startKind) << '(' << startKind << ')' << ' ' << "\n\n";
358
359 gramFile << "Epsilon Production:\n";
360 std::vector<std::string> strV;
361 for (auto pro: this->epsilonProds)
362 {
363 std::stringstream ss;
364 for (auto sym : pro)
365 {
366 if (sym == pro[1])
367 {
368 ss << "-> ";
369 }
370 ss << symToStrDump(sym) << '(' << sym.kind << ')' << ' ';
371 }
372 strV.insert(strV.begin(), ss.str());
373 }
374 std::sort(strV.begin(), strV.end());
375 for (auto pro: strV)
376 {
377 gramFile << '\t';
378 gramFile << pro;
379 gramFile << '\n';
380 }
381 gramFile << '\n';
382
383 gramFile << "Single Production:\n";
384 strV = {};
385 for (auto symProPair: singleRHSToProds)
386 {
387 for (auto pro: symProPair.second)
388 {
389 std::stringstream ss;
390 int i = 0;
391 for (auto sym : pro)
392 {
393 i++;
394 if (i == 2)
395 {
396 ss << "-> ";
397 }
398 ss << symToStrDump(sym) << '(' << sym.kind << ')' << ' ';
399 }
400 strV.insert(strV.begin(), ss.str());
401 }
402 }
403 std::sort(strV.begin(), strV.end());
404 for (auto pro: strV)
405 {
406 gramFile << '\t';
407 gramFile << pro;
408 gramFile << '\n';
409 }
410 gramFile << '\n';
411
412 gramFile << "Binary Production:\n";
413 strV = {};
414 for (auto symProPair: firstRHSToProds)
415 {
416 for (auto pro: symProPair.second)
417 {
418 std::stringstream ss;
419 int i = 0;
420 for (auto sym : pro)
421 {
422 i++;
423
424 if (i == 2)
425 {
426 ss << "-> ";
427 }
428 ss << symToStrDump(sym) << '(' << sym.kind << ')' << ' ';
429 }
430 strV.insert(strV.begin(), ss.str());
431 }
432 }
433 std::sort(strV.begin(), strV.end());
434 for (auto pro: strV)
435 {
436 gramFile << '\t';
437 gramFile << pro;
438 gramFile << '\n';
439 }
440 gramFile << '\n';
441
442 gramFile.close();
443}
SymbolMap< Symbol, Productions > firstRHSToProds
Definition CFGrammar.h:400
SymbolSet< Production > epsilonProds
Definition CFGrammar.h:398
SymbolMap< Symbol, Productions > singleRHSToProds
Definition CFGrammar.h:399
std::string symToStrDump(Symbol sym) const
std::string kindToStr(Kind kind) const
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76

◆ getEpsilonProds()

Productions & SVF::CFGrammar::getEpsilonProds ( )
inline

Definition at line 312 of file CFGrammar.h.

313 {
314 return epsilonProds;
315 }

◆ getFirstRHSSymbol()

const Symbol & SVF::CFGrammar::getFirstRHSSymbol ( const Production &  prod) const
inline

Definition at line 377 of file CFGrammar.h.

378 {
379 return prod.at(1);
380 }

◆ getFirstRHSToProds()

SymbolMap< Symbol, Productions > & SVF::CFGrammar::getFirstRHSToProds ( )
inline

Definition at line 322 of file CFGrammar.h.

323 {
324 return firstRHSToProds;
325 }

◆ getLHSSymbol()

const Symbol & SVF::CFGrammar::getLHSSymbol ( const Production &  prod) const
inline

Definition at line 372 of file CFGrammar.h.

373 {
374 return prod.at(0);
375 }

◆ getProdsFromFirstRHS()

const Productions & SVF::CFGrammar::getProdsFromFirstRHS ( const Symbol  sym) const
inline

Definition at line 357 of file CFGrammar.h.

358 {
359 auto it = firstRHSToProds.find(sym);
360 assert(it!=firstRHSToProds.end() && "production (X -> sym Y ) not found for sym!!");
361 return it->second;
362 }

◆ getProdsFromSecondRHS()

const Productions & SVF::CFGrammar::getProdsFromSecondRHS ( const Symbol  sym) const
inline

Definition at line 364 of file CFGrammar.h.

365 {
366 auto it = secondRHSToProds.find(sym);
367 assert(it!=secondRHSToProds.end() && "production (X -> Y sym) not found for sym!!");
368 return it->second;
369 }
SymbolMap< Symbol, Productions > secondRHSToProds
Definition CFGrammar.h:401

◆ getProdsFromSingleRHS()

const Productions & SVF::CFGrammar::getProdsFromSingleRHS ( const Symbol  sym) const
inline

Definition at line 350 of file CFGrammar.h.

351 {
352 auto it = singleRHSToProds.find(sym);
353 assert(it!=singleRHSToProds.end() && "production (X -> sym) not found for sym!!");
354 return it->second;
355 }

◆ getSecondRHSSymbol()

const Symbol & SVF::CFGrammar::getSecondRHSSymbol ( const Production &  prod) const
inline

Definition at line 382 of file CFGrammar.h.

383 {
384 return prod.at(2);
385 }

◆ getSecondRHSToProds()

SymbolMap< Symbol, Productions > & SVF::CFGrammar::getSecondRHSToProds ( )
inline

Definition at line 327 of file CFGrammar.h.

328 {
329 return secondRHSToProds;
330 }

◆ getSingleRHSToProds()

SymbolMap< Symbol, Productions > & SVF::CFGrammar::getSingleRHSToProds ( )
inline

Definition at line 317 of file CFGrammar.h.

318 {
319 return singleRHSToProds;
320 }

◆ hasProdsFromFirstRHS()

const bool SVF::CFGrammar::hasProdsFromFirstRHS ( const Symbol  sym) const
inline

Definition at line 332 of file CFGrammar.h.

333 {
334 auto it = firstRHSToProds.find(sym);
335 return it!=firstRHSToProds.end();
336 }

◆ hasProdsFromSecondRHS()

const bool SVF::CFGrammar::hasProdsFromSecondRHS ( const Symbol  sym) const
inline

Definition at line 344 of file CFGrammar.h.

345 {
346 auto it = secondRHSToProds.find(sym);
347 return it!=secondRHSToProds.end();
348 }

◆ hasProdsFromSingleRHS()

const bool SVF::CFGrammar::hasProdsFromSingleRHS ( const Symbol  sym) const
inline

Definition at line 338 of file CFGrammar.h.

339 {
340 auto it = singleRHSToProds.find(sym);
341 return it!=singleRHSToProds.end();
342 }

◆ num_generator()

const u32_t SVF::CFGrammar::num_generator ( )
inline

Definition at line 392 of file CFGrammar.h.

393 {
394 return newTerminalSubscript++;
395 }

Member Data Documentation

◆ epsilonProds

SymbolSet<Production> SVF::CFGrammar::epsilonProds
private

Definition at line 398 of file CFGrammar.h.

◆ firstRHSToProds

SymbolMap<Symbol, Productions> SVF::CFGrammar::firstRHSToProds
private

Definition at line 400 of file CFGrammar.h.

◆ newTerminalSubscript

u32_t SVF::CFGrammar::newTerminalSubscript
private

Definition at line 402 of file CFGrammar.h.

◆ secondRHSToProds

SymbolMap<Symbol, Productions> SVF::CFGrammar::secondRHSToProds
private

Definition at line 401 of file CFGrammar.h.

◆ singleRHSToProds

SymbolMap<Symbol, Productions> SVF::CFGrammar::singleRHSToProds
private

Definition at line 399 of file CFGrammar.h.


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