📝 change eol to lf
This commit is contained in:
parent
6a155f56e5
commit
f9f2cf6d47
224
src/ast_dumper.h
224
src/ast_dumper.h
|
@ -1,112 +1,112 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ast_visitor.h"
|
#include "ast_visitor.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace nasal {
|
namespace nasal {
|
||||||
|
|
||||||
class ast_dumper: public ast_visitor {
|
class ast_dumper: public ast_visitor {
|
||||||
private:
|
private:
|
||||||
std::vector<std::string> indent;
|
std::vector<std::string> indent;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void push_indent() {
|
void push_indent() {
|
||||||
if (indent.size()) {
|
if (indent.size()) {
|
||||||
if (indent.back()=="├──") {
|
if (indent.back()=="├──") {
|
||||||
indent.back() = "│ ";
|
indent.back() = "│ ";
|
||||||
} else if (indent.back()=="└──") {
|
} else if (indent.back()=="└──") {
|
||||||
indent.back() = " ";
|
indent.back() = " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
indent.push_back("├──");
|
indent.push_back("├──");
|
||||||
}
|
}
|
||||||
|
|
||||||
void pop_indent() {
|
void pop_indent() {
|
||||||
indent.pop_back();
|
indent.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_last() {
|
void set_last() {
|
||||||
indent.back() = "└──";
|
indent.back() = "└──";
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_indent() {
|
void dump_indent() {
|
||||||
if (indent.size() && indent.back()=="│ ") {
|
if (indent.size() && indent.back()=="│ ") {
|
||||||
indent.back() = "├──";
|
indent.back() = "├──";
|
||||||
}
|
}
|
||||||
for(const auto& i : indent) {
|
for(const auto& i : indent) {
|
||||||
std::cout << i;
|
std::cout << i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string format_location(expr* node) {
|
std::string format_location(expr* node) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << " → [";
|
ss << " → [";
|
||||||
node->get_location().dump_begin(ss);
|
node->get_location().dump_begin(ss);
|
||||||
ss << "]\n";
|
ss << "]\n";
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool visit_use_stmt(use_stmt*) override;
|
bool visit_use_stmt(use_stmt*) override;
|
||||||
bool visit_null_expr(null_expr*) override;
|
bool visit_null_expr(null_expr*) override;
|
||||||
bool visit_nil_expr(nil_expr*) override;
|
bool visit_nil_expr(nil_expr*) override;
|
||||||
bool visit_number_literal(number_literal*) override;
|
bool visit_number_literal(number_literal*) override;
|
||||||
bool visit_string_literal(string_literal*) override;
|
bool visit_string_literal(string_literal*) override;
|
||||||
bool visit_identifier(identifier*) override;
|
bool visit_identifier(identifier*) override;
|
||||||
bool visit_bool_literal(bool_literal*) override;
|
bool visit_bool_literal(bool_literal*) override;
|
||||||
bool visit_vector_expr(vector_expr*) override;
|
bool visit_vector_expr(vector_expr*) override;
|
||||||
bool visit_hash_expr(hash_expr*) override;
|
bool visit_hash_expr(hash_expr*) override;
|
||||||
bool visit_hash_pair(hash_pair*) override;
|
bool visit_hash_pair(hash_pair*) override;
|
||||||
bool visit_function(function*) override;
|
bool visit_function(function*) override;
|
||||||
bool visit_code_block(code_block*) override;
|
bool visit_code_block(code_block*) override;
|
||||||
bool visit_parameter(parameter*) override;
|
bool visit_parameter(parameter*) override;
|
||||||
bool visit_ternary_operator(ternary_operator*) override;
|
bool visit_ternary_operator(ternary_operator*) override;
|
||||||
bool visit_binary_operator(binary_operator*) override;
|
bool visit_binary_operator(binary_operator*) override;
|
||||||
bool visit_unary_operator(unary_operator*) override;
|
bool visit_unary_operator(unary_operator*) override;
|
||||||
bool visit_call_expr(call_expr*) override;
|
bool visit_call_expr(call_expr*) override;
|
||||||
bool visit_call_hash(call_hash*) override;
|
bool visit_call_hash(call_hash*) override;
|
||||||
bool visit_call_vector(call_vector*) override;
|
bool visit_call_vector(call_vector*) override;
|
||||||
bool visit_call_function(call_function*) override;
|
bool visit_call_function(call_function*) override;
|
||||||
bool visit_slice_vector(slice_vector*) override;
|
bool visit_slice_vector(slice_vector*) override;
|
||||||
bool visit_definition_expr(definition_expr*) override;
|
bool visit_definition_expr(definition_expr*) override;
|
||||||
bool visit_assignment_expr(assignment_expr*) override;
|
bool visit_assignment_expr(assignment_expr*) override;
|
||||||
bool visit_multi_identifier(multi_identifier*) override;
|
bool visit_multi_identifier(multi_identifier*) override;
|
||||||
bool visit_tuple_expr(tuple_expr*) override;
|
bool visit_tuple_expr(tuple_expr*) override;
|
||||||
bool visit_multi_assign(multi_assign*) override;
|
bool visit_multi_assign(multi_assign*) override;
|
||||||
bool visit_while_expr(while_expr*) override;
|
bool visit_while_expr(while_expr*) override;
|
||||||
bool visit_for_expr(for_expr*) override;
|
bool visit_for_expr(for_expr*) override;
|
||||||
bool visit_iter_expr(iter_expr*) override;
|
bool visit_iter_expr(iter_expr*) override;
|
||||||
bool visit_forei_expr(forei_expr*) override;
|
bool visit_forei_expr(forei_expr*) override;
|
||||||
bool visit_condition_expr(condition_expr*) override;
|
bool visit_condition_expr(condition_expr*) override;
|
||||||
bool visit_if_expr(if_expr*) override;
|
bool visit_if_expr(if_expr*) override;
|
||||||
bool visit_continue_expr(continue_expr*) override;
|
bool visit_continue_expr(continue_expr*) override;
|
||||||
bool visit_break_expr(break_expr*) override;
|
bool visit_break_expr(break_expr*) override;
|
||||||
bool visit_return_expr(return_expr*) override;
|
bool visit_return_expr(return_expr*) override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void dump(code_block* root) {
|
void dump(code_block* root) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// store previous code page
|
// store previous code page
|
||||||
auto cp = GetConsoleOutputCP();
|
auto cp = GetConsoleOutputCP();
|
||||||
// allow 65001 code page
|
// allow 65001 code page
|
||||||
SetConsoleOutputCP(CP_UTF8);
|
SetConsoleOutputCP(CP_UTF8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
root->accept(this);
|
root->accept(this);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// restore previous code page
|
// restore previous code page
|
||||||
SetConsoleOutputCP(cp);
|
SetConsoleOutputCP(cp);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue