<commit_before>#include "llox/ast-printer.h"

using namespace llox;

std::string AstPrinter::print(Expr *expr) {
  expr->accept(*this);
  return representation;
}

void AstPrinter::visit(AssignExpr *expr) {
  parenthesize("= " + expr->name->lexeme, expr->value.get());
}

void AstPrinter::visit(BinaryExpr *expr) {
  parenthesize(expr->op->lexeme, expr->left.get(), expr->right.get());
}

void AstPrinter::visit(CallExpr *expr) {}

void AstPrinter::visit(GetExpr *expr) {}

void AstPrinter::visit(GroupingExpr *expr) {
  parenthesize("group", expr->expression.get());
}

void AstPrinter::visit(BoolLiteralExpr *expr) {
  representation.append(std::to_string(expr->value));
}

void AstPrinter::visit(NilLiteralExpr *expr) { representation.append("nil"); }

void AstPrinter::visit(NumberLiteralExpr *expr) {
  representation.append(std::to_string(expr->value));
}

void AstPrinter::visit(StringLiteralExpr *expr) {
  representation.append(expr->value);
}

void AstPrinter::visit(LogicalExpr *expr) {
  parenthesize(expr->op->lexeme, expr->left.get(), expr->right.get());
}

void AstPrinter::visit(SetExpr *expr) {}

void AstPrinter::visit(SuperExpr *expr) {}

void AstPrinter::visit(ThisExpr *expr) {}

void AstPrinter::visit(UnaryExpr *expr) {
  parenthesize(expr->op->lexeme, expr->right.get());
}

void AstPrinter::visit(VariableExpr *expr) {}

template <typename... ExprT>
std::string AstPrinter::parenthesize(const std::string &name, ExprT... exprs) {
  std::vector<Expr *> exprvec = {exprs...};

  representation.append("(").append(name);

  for (Expr *expr : exprvec) {
    representation.append(" ");
    expr->accept(*this);
  }

  representation.append(")");

  return representation;
}
<commit_msg>[ast-printer] Print variable expressions.<commit_after>#include "llox/ast-printer.h"

using namespace llox;

std::string AstPrinter::print(Expr *expr) {
  expr->accept(*this);
  return representation;
}

void AstPrinter::visit(AssignExpr *expr) {
  parenthesize("= " + expr->name->lexeme, expr->value.get());
}

void AstPrinter::visit(BinaryExpr *expr) {
  parenthesize(expr->op->lexeme, expr->left.get(), expr->right.get());
}

void AstPrinter::visit(CallExpr *expr) {}

void AstPrinter::visit(GetExpr *expr) {}

void AstPrinter::visit(GroupingExpr *expr) {
  parenthesize("group", expr->expression.get());
}

void AstPrinter::visit(BoolLiteralExpr *expr) {
  representation.append(std::to_string(expr->value));
}

void AstPrinter::visit(NilLiteralExpr *expr) { representation.append("nil"); }

void AstPrinter::visit(NumberLiteralExpr *expr) {
  representation.append(std::to_string(expr->value));
}

void AstPrinter::visit(StringLiteralExpr *expr) {
  representation.append(expr->value);
}

void AstPrinter::visit(LogicalExpr *expr) {
  parenthesize(expr->op->lexeme, expr->left.get(), expr->right.get());
}

void AstPrinter::visit(SetExpr *expr) {}

void AstPrinter::visit(SuperExpr *expr) {}

void AstPrinter::visit(ThisExpr *expr) {}

void AstPrinter::visit(UnaryExpr *expr) {
  parenthesize(expr->op->lexeme, expr->right.get());
}

void AstPrinter::visit(VariableExpr *expr) {
  representation.append(expr->name->lexeme);
}

template <typename... ExprT>
std::string AstPrinter::parenthesize(const std::string &name, ExprT... exprs) {
  std::vector<Expr *> exprvec = {exprs...};

  representation.append("(").append(name);

  for (Expr *expr : exprvec) {
    representation.append(" ");
    expr->accept(*this);
  }

  representation.append(")");

  return representation;
}

{'fraction_non_alphanumeric': 0.1811926605504587, 'fraction_numerical': 0.0, 'mean_word_length': 6.077079107505071, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3175219', 'n_tokens_mistral': 1178, 'n_tokens_neox': 1168, 'n_words': 194}