source: icGREP/icgrep-devel/icgrep/printer_pablos.cpp @ 4199

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

First stage of refactoring PabloE classes.

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