blob: 467e5ec427cfca197bdd3e54b367e30f41a10b57 [file] [log] [blame]
/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
* Use of this file is governed by the BSD 3-clause license that
* can be found in the LICENSE.txt file in the project root.
*/
#include "tree/Trees.h"
#include "misc/Interval.h"
#include "Parser.h"
#include "atn/ATN.h"
#include "atn/ATNState.h"
#include "tree/ParseTreeVisitor.h"
#include "RuleContext.h"
using namespace antlr4;
using namespace antlr4::atn;
RuleContext::RuleContext() {
InitializeInstanceFields();
}
RuleContext::RuleContext(RuleContext *parent_, size_t invokingState_) {
InitializeInstanceFields();
this->parent = parent_;
this->invokingState = invokingState_;
}
int RuleContext::depth() {
int n = 1;
RuleContext *p = this;
while (true) {
if (p->parent == nullptr)
break;
p = static_cast<RuleContext *>(p->parent);
n++;
}
return n;
}
bool RuleContext::isEmpty() {
return invokingState == ATNState::INVALID_STATE_NUMBER;
}
misc::Interval RuleContext::getSourceInterval() {
return misc::Interval::INVALID;
}
std::string RuleContext::getText() {
if (children.empty()) {
return "";
}
std::stringstream ss;
for (size_t i = 0; i < children.size(); i++) {
ParseTree *tree = children[i];
if (tree != nullptr)
ss << tree->getText();
}
return ss.str();
}
size_t RuleContext::getRuleIndex() const {
return INVALID_INDEX;
}
size_t RuleContext::getAltNumber() const {
return atn::ATN::INVALID_ALT_NUMBER;
}
void RuleContext::setAltNumber(size_t /*altNumber*/) {
}
antlrcpp::Any RuleContext::accept(tree::ParseTreeVisitor *visitor) {
return visitor->visitChildren(this);
}
std::string RuleContext::toStringTree(Parser *recog, bool pretty) {
return tree::Trees::toStringTree(this, recog, pretty);
}
std::string RuleContext::toStringTree(std::vector<std::string> &ruleNames, bool pretty) {
return tree::Trees::toStringTree(this, ruleNames, pretty);
}
std::string RuleContext::toStringTree(bool pretty) {
return toStringTree(nullptr, pretty);
}
std::string RuleContext::toString(const std::vector<std::string> &ruleNames) {
return toString(ruleNames, nullptr);
}
std::string RuleContext::toString(const std::vector<std::string> &ruleNames, RuleContext *stop) {
std::stringstream ss;
RuleContext *currentParent = this;
ss << "[";
while (currentParent != stop) {
if (ruleNames.empty()) {
if (!currentParent->isEmpty()) {
ss << currentParent->invokingState;
}
} else {
size_t ruleIndex = currentParent->getRuleIndex();
std::string ruleName = (ruleIndex < ruleNames.size()) ? ruleNames[ruleIndex] : std::to_string(ruleIndex);
ss << ruleName;
}
if (currentParent->parent == nullptr) // No parent anymore.
break;
currentParent = static_cast<RuleContext *>(currentParent->parent);
if (!ruleNames.empty() || !currentParent->isEmpty()) {
ss << " ";
}
}
ss << "]";
return ss.str();
}
std::string RuleContext::toString() {
return toString(nullptr);
}
std::string RuleContext::toString(Recognizer *recog) {
return toString(recog, &ParserRuleContext::EMPTY);
}
std::string RuleContext::toString(Recognizer *recog, RuleContext *stop) {
if (recog == nullptr)
return toString(std::vector<std::string>(), stop); // Don't use an initializer {} here or we end up calling ourselve recursivly.
return toString(recog->getRuleNames(), stop);
}
void RuleContext::InitializeInstanceFields() {
invokingState = INVALID_INDEX;
}