cplusplus2x.Examples/C++20/scanner/ETL/debug.cpp
Source: cplusplus2x.Examples/C++20/scanner/ETL/debug.cpp
#include "ir.hpp"
#include "types.hpp"
#include <fstream>
#include <iostream>
#include <sstream>
std::string htmlPage_Header = R"(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Debug Info</title>
<style>
table {
width: 50%;
margin: 50px auto;
border-collapse: collapse;
}
th, td {
border: 1px solid #000;
padding: 10px;
text-align: center;
background-color: #f2f2f2;
}
th {
background-color: #000000;
color: #f2f2f2;
}
.centert {
text-align: center;
}
</style>
</head>
<body>
)";
std::string htmlPage_Footer = R"(
</body>
</html>
)";
void outputDebugInfo(std::ostream &file, symbol::SymbolTable &table, const ir::IRCode &code) {
file << htmlPage_Header << "\n";
file << "<div class=\"centert\"><h1>Instruction Table</h1></div>\n";
file << "<table>\n";
file << "<tr><th>Index</th><th>Instruction</th>\n";
uint64_t index = 0;
for (const auto &i : code) {
file << "<tr><td>" << index << "</td><td>" << i.toString() << "</td></tr>\n";
index++;
}
file << "</table>\n";
file << "<div class=\"centert\"><h1>Symbol Table</h1></div>\n";
file << "<table>\n";
file << "<tr><th>Function</th><th>Symbol</th><th>Type</th></tr>\n";
std::string curFunction;
for (const auto &t : table.getTable()) {
curFunction = t.first;
for (const auto &s : t.second) {
file << "<tr><td>" << curFunction << "</td><td>" << s.first << "</td><td>" << ast::VarString.at(static_cast<int>(s.second.vtype)) << "</td></tr>\n";
}
}
file << "</table>\n";
file << htmlPage_Footer << "\n";
}