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 ()
 
ProductionsgetEpsilonProds ()
 
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 ProductionsgetProdsFromSingleRHS (const Symbol sym) const
 
const ProductionsgetProdsFromFirstRHS (const Symbol sym) const
 
const ProductionsgetProdsFromSecondRHS (const Symbol sym) const
 
const SymbolgetLHSSymbol (const Production &prod) const
 
const SymbolgetFirstRHSSymbol (const Production &prod) const
 
const SymbolgetSecondRHSSymbol (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< ProductionepsilonProds
 
SymbolMap< Symbol, ProductionssingleRHSToProds
 
SymbolMap< Symbol, ProductionsfirstRHSToProds
 
SymbolMap< Symbol, ProductionssecondRHSToProds
 
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< SymbolProduction
 
typedef SymbolSet< ProductionProductions
 
- 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: