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

Last change on this file since 4207 was 4207, checked in by nmedfort, 5 years ago

Minor changes; moved printers to re and pablo folders.

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/pe_pabloe.h>
20#include <pablo/pe_advance.h>
21#include <pablo/pe_all.h>
22#include <pablo/pe_and.h>
23#include <pablo/pe_call.h>
24#include <pablo/pe_charclass.h>
25#include <pablo/pe_matchstar.h>
26#include <pablo/pe_not.h>
27#include <pablo/pe_or.h>
28#include <pablo/pe_scanthru.h>
29#include <pablo/pe_sel.h>
30#include <pablo/pe_var.h>
31#include <pablo/pe_xor.h>
32#include <pablo/ps_assign.h>
33#include <pablo/ps_if.h>
34#include <pablo/ps_while.h>
35#include <pablo/codegenstate.h>
36
37using namespace re;
38using namespace pablo;
39
40std::string StatementPrinter::PrintStmts(const CodeGenState & cg_state)
41{
42    std::string strOut = "[";
43
44    strOut = strOut.substr(0, strOut.length() - 1);
45    strOut += "],[";
46
47    strOut = Print_PB_PabloStmts(cg_state.stmtsl, strOut);
48
49    strOut = strOut.substr(0, strOut.length() - 1);
50    strOut += "],";
51
52    //Print the name of the variable that holds the match result for the overall expression so far.
53    strOut += "'" + cg_state.newsym + "'";
54
55    return strOut;
56}
57
58std::string StatementPrinter::Print_PB_PabloStmts(const List &stmts, std::string strOut) {
59    for (const auto stmt : stmts) {
60        strOut += ShowPabloS(stmt);
61    }
62    return strOut;
63}
64
65std::string StatementPrinter::Print_CC_PabloStmts(const List & stmts) {
66    std::string strOut = "Total Statements: " + std::to_string(stmts.size()) + "\n";
67    for (const auto stmt : stmts) {
68        strOut += ShowPabloS(stmt) + "\n";
69    }
70    return strOut;
71}
72
73std::string StatementPrinter::ShowPabloS(const PabloE * stmt)
74{
75    std::string retVal = "";
76
77    if (const Assign * an = dyn_cast<const Assign>(stmt))
78    {
79        retVal = "Assign('" + an->getM() + "', " + ShowPabloE(an->getExpr()) + "),";
80    }
81    else if (const If * ifstmt = dyn_cast<const If>(stmt))
82    {
83        retVal = "If(" + ShowPabloE(ifstmt->getExpr()) + ", " + Print_PB_PabloStmts(ifstmt->getPSList(), retVal) + ")";
84    }
85    else if (const While * whl = dyn_cast<const While>(stmt))
86    {
87        retVal = "While(" + ShowPabloE(whl->getExpr()) + ", " + Print_PB_PabloStmts(whl->getPSList(), retVal) + ")";
88    }
89    else retVal = "UNKNOWN_STATEMENT_TYPE!!!";
90    return retVal;
91}
92
93std::string StatementPrinter::ShowPabloE(const PabloE *expr)
94{
95    std::string retVal = "";
96
97    if (const All * all = dyn_cast<const All>(expr))
98    {
99        retVal = "All " + std::to_string(all->getValue()) + " ";
100    }
101    else if (const Call * pablo_call = dyn_cast<const Call>(expr))
102    {
103        retVal = "Call '" + pablo_call->getCallee() + "'";
104    }
105    else if (const Var * pablo_var = dyn_cast<const Var>(expr))
106    {
107        retVal = "Var '" + pablo_var->getVar() + "' ";
108    }
109    else if (const And * pablo_and = dyn_cast<const And>(expr))
110    {
111        retVal = "And(" + ShowPabloE(pablo_and->getExpr1()) +", " + ShowPabloE(pablo_and->getExpr2()) + ")";
112    }
113    else if (const Or * pablo_or = dyn_cast<const Or>(expr))
114    {
115        retVal = "Or(" + ShowPabloE(pablo_or->getExpr1()) + ", " + ShowPabloE(pablo_or->getExpr2()) + ")";
116    }
117    else if (const Sel * pablo_sel = dyn_cast<const Sel>(expr))
118    {
119        retVal = "((" + ShowPabloE(pablo_sel->getIf_expr()) + "And " + ShowPabloE(pablo_sel->getT_expr()) +
120                ")|(Not(" + ShowPabloE(pablo_sel->getIf_expr()) + ") And " + ShowPabloE(pablo_sel->getF_expr()) + ")";
121    }
122    else if (const Not * pablo_not = dyn_cast<const Not>(expr))
123    {
124        retVal = "Not (" + ShowPabloE(pablo_not->getExpr()) + ")";
125    }
126    else if (const CharClass * cc = dyn_cast<const CharClass>(expr))
127    {
128        retVal = "CharClass '" + cc->getCharClass() + "'";
129    }
130    else if (const Advance * adv = dyn_cast<const Advance>(expr))
131    {
132        retVal = "Advance(" + ShowPabloE(adv->getExpr()) + ")";
133    }
134    else if (const MatchStar * mstar = dyn_cast<const MatchStar>(expr))
135    {
136        retVal = "MatchStar (" + ShowPabloE(mstar->getExpr1()) + ", " + ShowPabloE(mstar->getExpr2()) + ")";
137    }
138    else if (const ScanThru * sthru = dyn_cast<const ScanThru>(expr))
139    {
140        retVal = "ScanThru (" + ShowPabloE(sthru->getScanFrom()) + ", " + ShowPabloE(sthru->getScanThru()) + ")";
141    }
142    else retVal = "UNKNOWN_Pablo_EXPRESSION_TYPE!!!";
143
144    return retVal;
145}
146
147
Note: See TracBrowser for help on using the repository browser.