view anagram/agcore/error.cpp @ 21:1c9dac05d040

Add lint-style FALLTHROUGH annotations to fallthrough cases. (in the parse engine and thus the output code) Document this, because the old output causes warnings with gcc10.
author David A. Holland
date Mon, 13 Jun 2022 00:04:38 -0400
parents 13d2b8934445
children
line wrap: on
line source

/*
 * AnaGram, A System for Syntax Directed Programming
 * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
 * See the file COPYING for license and usage terms.
 *
 * error.cpp - Error reporting module
 */

#include "config.h"
#include "error.h"
#include "pgg24-defs.h"
#include "stacks.h"

//#define INCLUDE_LOGGING
#include "log.h"


AgString errorReportFile("");

int charRangeDiagnostic;
int negativeCharDiagnostic;
int eventDrivenDiagnostic;
int errorResynchDiagnostic;

AgStack<Error> errorList;

const char *Error::keyString[] = {"Warning", "Error"};

void reset_errors(void) {
  charRangeDiagnostic = 0;
  eventDrivenDiagnostic = 0;
  negativeCharDiagnostic = 0;
  errorResynchDiagnostic = 0;
}

void checkParams() {
  LOGSECTION("checkParams");
  if (!eventDrivenDiagnostic && event_driven && pointer_input) {
    eventDrivenDiagnostic = 1;
    log_error("Event driven parser cannot use pointer input");
  }
  if (!errorResynchDiagnostic && error_token && auto_resynch) {
    log_error("Both error token resynch and auto resynch specified");
    errorResynchDiagnostic = 1;
  }
}

/*
 * XXX. Sometime we need to go through and check up on all calls to
 * the next two versions of log_error(), distinguishing those where
 * a meaningful location can be fetched from the pgg24 PCB and 
 * those that should have no location.
 *
 * (Note: the direct Error constructor calls have been checked.)
 */

void log_error(const char *msg) {
  LOGSECTION("log_error(const char *)");
  errorList.push(Error(pgcb.line, pgcb.column, msg));
}

void log_error() {
  LOGSECTION("log_error()");
  LOGS(string_base);
  errorList.push(Error(pgcb.line, pgcb.column, string_base));
  rcs();
}

void log_error(int l, int c) {
  LOGSECTION("log_error(int,int)");
  LOGV(l) LCV(c) LV(string_base);
  errorList.push(Error(l, c, string_base));
  rcs();
}

/* 
 * XXX the equivalent of this function used to always report the last
 * line and column, not the first. But this function is for cases
 * where that's not appropriate, so how about arranging things so it
 * doesn't report any at all?
 */

Error::Error(AgString msg)
  : file(errorReportFile),
    line(1),
    column(1),
    key(warn),
    message(msg)
{
  LOGSECTION("Error::Error(AgString)");
  // Nothing here
}

Error::Error(int l, int c, AgString msg)
  : file(errorReportFile),
    line(l),
    column(c),
    key(warn),
    message(msg)
{
  LOGSECTION("Error::Error(int, int, AgString)");
  LOGV(line) LCV(column) LCV(msg.pointer());
  // Nothing here
}

Error::Error(int l, int c, AgString f, AgString msg)
  : file(f),
    line(l),
    column(c),
    key(warn),
    message(msg)
{
  // Nothing here
}