source: icGREP/icgrep-devel/icgrep/pablo/printer_pablos.cpp @ 4247

Last change on this file since 4247 was 4247, checked in by cameron, 5 years ago

All -> Zeroes, Ones

File size: 4.5 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include "printer_pablos.h"
8
9
10//Regular Expressions
11#include <re/re_re.h>
12#include <re/re_cc.h>
13#include <re/re_start.h>
14#include <re/re_end.h>
15#include <re/re_seq.h>
16#include <re/re_name.h>
17
18//Pablo Expressions
19#include <pablo/pabloAST.h>
20#include <pablo/pe_advance.h>
21#include <pablo/pe_and.h>
22#include <pablo/pe_call.h>
23#include <pablo/pe_charclass.h>
24#include <pablo/pe_matchstar.h>
25#include <pablo/pe_not.h>
26#include <pablo/pe_or.h>
27#include <pablo/pe_scanthru.h>
28#include <pablo/pe_sel.h>
29#include <pablo/pe_var.h>
30#include <pablo/pe_xor.h>
31#include <pablo/ps_assign.h>
32#include <pablo/ps_if.h>
33#include <pablo/ps_while.h>
34#include <pablo/pe_zeroes.h>
35#include <pablo/pe_ones.h>
36#include <pablo/codegenstate.h>
37
38using namespace re;
39using namespace pablo;
40
41std::string StatementPrinter::PrintStmts(const PabloBlock & cg_state)
42{
43    std::string strOut = "[";
44
45    strOut = strOut.substr(0, strOut.length() - 1);
46    strOut += "],[";
47
48    strOut = Print_PB_PabloStmts(cg_state.expressions(), strOut);
49
50    strOut = strOut.substr(0, strOut.length() - 1);
51    strOut += "]";
52
53    return strOut;
54}
55
56std::string StatementPrinter::Print_PB_PabloStmts(const ExpressionList & stmts, std::string strOut) {
57    for (const auto stmt : stmts) {
58        strOut += ShowPabloS(stmt);
59    }
60    return strOut;
61}
62
63std::string StatementPrinter::Print_CC_PabloStmts(const pablo::ExpressionList &stmts) {
64    std::string strOut = "Total Statements: " + std::to_string(stmts.size()) + "\n";
65    for (const auto stmt : stmts) {
66        strOut += ShowPabloS(stmt) + "\n";
67    }
68    return strOut;
69}
70
71std::string StatementPrinter::ShowPabloS(const PabloAST * stmt)
72{
73    std::string retVal = "";
74
75    if (const Assign * an = dyn_cast<const Assign>(stmt))
76    {
77        retVal = "Assign('" + an->getName() + "', " + ShowPabloAST(an->getExpr()) + "),";
78    }
79    else if (const If * ifstmt = dyn_cast<const If>(stmt))
80    {
81        retVal = "If(" + ShowPabloAST(ifstmt->getCondition()) + ", " + Print_PB_PabloStmts(ifstmt->getBody(), retVal) + ")";
82    }
83    else if (const While * whl = dyn_cast<const While>(stmt))
84    {
85        retVal = "While(" + ShowPabloAST(whl->getCondition()) + ", " + Print_PB_PabloStmts(whl->getBody(), retVal) + ")";
86    }
87    else retVal = "UNKNOWN_STATEMENT_TYPE!!!";
88    return retVal;
89}
90
91std::string StatementPrinter::ShowPabloAST(const PabloAST *expr)
92{
93    std::string retVal = "";
94
95    if (isa<const Zeroes>(expr))
96    {
97        retVal = "Zeroes";
98    }
99    else if (isa<const Ones>(expr))
100    {
101        retVal = "Ones";
102    }
103    else if (const Call * pablo_call = dyn_cast<const Call>(expr))
104    {
105        retVal = "Call '" + pablo_call->getCallee() + "'";
106    }
107    else if (const Var * pablo_var = dyn_cast<const Var>(expr))
108    {
109        retVal = "Var '" + pablo_var->getName() + "' ";
110    }
111    else if (const And * pablo_and = dyn_cast<const And>(expr))
112    {
113        retVal = "And(" + ShowPabloAST(pablo_and->getExpr1()) +", " + ShowPabloAST(pablo_and->getExpr2()) + ")";
114    }
115    else if (const Or * pablo_or = dyn_cast<const Or>(expr))
116    {
117        retVal = "Or(" + ShowPabloAST(pablo_or->getExpr1()) + ", " + ShowPabloAST(pablo_or->getExpr2()) + ")";
118    }
119    else if (const Sel * pablo_sel = dyn_cast<const Sel>(expr))
120    {
121        retVal = "((" + ShowPabloAST(pablo_sel->getCondition()) + "And " + ShowPabloAST(pablo_sel->getTrueExpr()) +
122                ")|(Not(" + ShowPabloAST(pablo_sel->getCondition()) + ") And " + ShowPabloAST(pablo_sel->getFalseExpr()) + ")";
123    }
124    else if (const Not * pablo_not = dyn_cast<const Not>(expr))
125    {
126        retVal = "Not (" + ShowPabloAST(pablo_not->getExpr()) + ")";
127    }
128    else if (const CharClass * cc = dyn_cast<const CharClass>(expr))
129    {
130        retVal = "CharClass '" + cc->getCharClass() + "'";
131    }
132    else if (const Advance * adv = dyn_cast<const Advance>(expr))
133    {
134        retVal = "Advance(" + ShowPabloAST(adv->getExpr()) + ")";
135    }
136    else if (const MatchStar * mstar = dyn_cast<const MatchStar>(expr))
137    {
138        retVal = "MatchStar (" + ShowPabloAST(mstar->getExpr1()) + ", " + ShowPabloAST(mstar->getExpr2()) + ")";
139    }
140    else if (const ScanThru * sthru = dyn_cast<const ScanThru>(expr))
141    {
142        retVal = "ScanThru (" + ShowPabloAST(sthru->getScanFrom()) + ", " + ShowPabloAST(sthru->getScanThru()) + ")";
143    }
144    else retVal = "UNKNOWN_Pablo_EXPRESSION_TYPE!!!";
145
146    return retVal;
147}
148
149
Note: See TracBrowser for help on using the repository browser.