view anagram/guisupport/ftpardc.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.
 *
 * ftpardc.cpp
 */

#include "arrays.h"
#include "bpe3.h"
#include "conflicttrc.h"
#include "data.h"
#include "dc.h"
#include "dict.h"
#include "items.h"
#include "ftpardc.h"
#include "q1a.h"
#include "stexpdc.h"
#include "tracedc.h"
#include "ws.h"

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


dc::MenuOption *FtParserDc::auxTable[] = {
  &dc::auxiliaryTraceOptionInstance,
  &dc::expansionRulesOptionInstance,
  &dc::keywordsOptionInstance,
  &dc::previousStatesOptionInstance,
  &dc::productionsOptionInstance,
  &dc::setElementsOptionInstance,
  &dc::stateDefinitionOptionInstance,
  &dc::stateExpansionOptionInstance,
  &dc::tokenUsageOptionInstance,
  NULL
};

dc::MenuOption *FtParserReductionDc::auxTable[] = {
  &dc::expansionRulesOptionInstance,
  &dc::productionsOptionInstance,
  &dc::setElementsOptionInstance,
  &dc::tokenUsageOptionInstance,
  NULL
};

int FtParserReductionDc::reduction_menu_tabs[] = { 0 };

dc::MenuOption *TokenMenuDc::auxTable[] = {
  &dc::expansionRulesOptionInstance,
  &dc::productionsOptionInstance,
  &dc::setElementsOptionInstance,
  &dc::tokenUsageOptionInstance,
  NULL
};

static int tokenMenuTabs[] = {6,15,0};
TokenMenuDc::TokenMenuDc(FtParser &p, unsigned ln)
  : parser(p)
{
  LOGSECTION("TokenMenuDc::TokenMenuDc");
  LOGV(ln);
  unsigned stackDepth = parser.stateStack.size();
  FtParser::State state;
  if (ln >= stackDepth) {
    state = parser.state;
  }
  else {
    state = parser.stateStack[ln];
  }
  int length = map_state_number[state.number].n_actions;
  state_number = state.number;
  LOGV(state.number);
  LOGV(length);
  tab_stops = tokenMenuTabs;
  des->d_size.y = length;

  des->c_loc_doc.y = positionCursor(state.number, state.token);
}

void TokenMenuDc::reset(unsigned sn) {
  LOGSECTION("TokenMenuDc::reset");
  state_number = sn;
  LOGV(state_number);
  int length = map_state_number[sn].n_actions;
  des->d_size.y = length;
}

int TokenMenuDc::positionCursor(unsigned sn, unsigned tn) {
  LOGSECTION("TokenMenuDc::positionCursor");
  LOGV(sn);
  LOGV(tn);
  LOGV(state_number);
  int length = map_state_number[sn].n_actions;
  unsigned *t_act = lstptr(map_state_number[sn], t_actions);
  int ln = 0;
  int defaultLine = 0;
  while (ln < length) {
    unsigned t = *t_act++;
    if (t == tn) {
      break;
    }
    if (t == 0) {
      defaultLine = ln;
    }
    ln++;
  }
  if (ln == length) {
    ln = defaultLine;
  }
  LOGV(tn) LCV(ln) LCV(defaultLine);
  return ln;
}

void TokenMenuDc::getLine(unsigned ln) const {
  LOGSECTION("TokenMenuDc::getLine");
  LOGV(ln);

  LOGV(parser.state.number);
  LOGV(state_number);
  state_number_map *sp = &map_state_number[state_number];
  int an, tn, pn;
  const char *as = NULL;

  an = lstptr(*sp, a_actions)[ln];
  tn = lstptr(*sp, t_actions)[ln];
  pn = lstptr(*sp, p_actions)[ln];

  LOGV(an);
  LOGV(tn);
  LOGV(pn);
  if (tn == 0) {
    if (an == pe_syn_error) {
      sss("No Default");
    }
    else {
      if ((ln == 0  && pn == 0) 
	  /*|| (ln == 1 && map_state_number[t->sn].actions[1] == noise_token)*/
	) {
	sss("Accept\t\t");
      }
      else if (an == pe_reduce_form || an == pe_simple_reduce) {
	ssprintf("****\t<< R%03d\tNone of the above--Default", pn);
      }
      else {
	sss("****\t\tNone of the above--Default");
      }
    }
  }
  else {
    ssprintf("T%03d\t", tn);
    switch (an) {
      case pe_go_to:
	as = ">> S%03d\t";
	break;
      case pe_reduce_form:
      case pe_simple_reduce:
      case pe_accept:
	as = "<< R%03d\t";
	break;
      case pe_shift_accept:
	as = "Accept\t";
	break;
      case pe_shift_reduce:
      case pe_shift_simple_reduce:
      case pe_syn_error:
      case pe_null_go_to:
      case pe_skip:
      case pe_skip_reduce:
	as = "\t";
    }
    apprintf(as, pn);
    atkn(tn);
  }
}

unsigned TokenMenuDc::token(unsigned ln){
  LOGSECTION("TokenMenuDc::token");
  LOGV(ln);
  LOGV(parser.state.number);
  LOGV(state_number);
  return lstptr(map_state_number[state_number], t_actions)[ln];
}

int TokenMenuDc::expansion_rules_ok(unsigned ln) {
  LOGSECTION("TokenMenuDc::expansion_rules_ok");
  LOGV(ln);
  return build_item_list_ok(token(ln));
}

dc_ref TokenMenuDc::expansion_rules(unsigned ln) {
  return build_item_list(token(ln));
}

int TokenMenuDc::productions_ok(unsigned ln) {
  LOGSECTION("TokenMenuDc::productions_ok");
  return productions_window_ok(token(ln));
}

dc_ref TokenMenuDc::productions(unsigned ln) {
  return productions_window(token(ln));
}

int TokenMenuDc::set_elements_ok(unsigned ln) {
  LOGSECTION("TokenMenuDc::set_elements_ok");
  return token_set_window_ok(token(ln));
}

dc_ref TokenMenuDc::set_elements(unsigned ln) {
  LOGSECTION("TokenMenuDc::set_elements_ok");
  return token_set_window(token(ln));
}

int TokenMenuDc::usage_ok(unsigned ln) {
  LOGSECTION("TokenMenuDc::usage_ok");
  return token_usage_window_ok(token(ln));
}

dc_ref TokenMenuDc::usage(unsigned ln) {
  return token_usage_window(token(ln));
}


static int ftr_stack_tabs[] = {3,10,16,0};
//static int ftr_stack_tabs[] = {3,10,24,0};

FtParserDc::FtParserDc(FtParser &p)
  : parser(p)
{
  LOGSECTION("FtParserDc::FtParserDc");
  LOGV(parser.stateStack.size());
  int stackDepth = parser.stateStack.size();
  des->d_size = cint(token_name_length+ftr_stack_tabs[2],stackDepth + 1);
  //des->c_size = cursor_bar_size;
  tab_stops = ftr_stack_tabs;
  connect(this, &FtParserDc::updateSize, parser.stackChanged);
}

void FtParserDc::updateSize(const FtParser::StackChanged &msg) {
  LOGSECTION("FtParserDc::updateSize");
  LOGV(msg.newSize) LCV(des->d_size.y);
  des->d_size.y = msg.newSize;
}

void FtParserDc::getLine(unsigned ln) const {
  LOGSECTION("FtParserDc::getLine");
  LOGV(ln);
  FtParser::State *state;
  LOGV(parser.processState);
  LOGV(parser.reductionIndex);
  LOGV(parser.stateStack.size());
  unsigned token = 0;
  if (ln >= parser.stateStack.size()) {
    if (parser.processState == parser.selectionRequired &&
	ln == parser.reductionIndex)
    {
      state = &parser.reductionState;
      token = state->token;
    }
    else {
      state = &parser.state;
      //token = parser.inputToken;
      token = parser.state.token;
    }
  }
  else {
    state = &parser.stateStack[ln];
    token = state->token;
  }
  ssprintf("%2d\tS%03d:\t", ln, state->number);
  LOGV(token);
  if (token) {
    apprintf("T%03d\t",token);
    atkn(token);
  }
  LOGV(string_base);
}

dc_ref FtParserDc::tokenMenu(int ln) {
  LOGSECTION("FtParserDc::tokenMenu");
  LOGV(ln);
  return new TokenMenuDc(parser, ln);
}

unsigned FtParserDc::state(unsigned ln) {
  int sn = parser.state.number;

  if (ln < parser.stateStack.size()) {
    sn = parser.stateStack[ln].number;
  }
  return sn;
}

unsigned FtParserDc::token(unsigned ln) {
  LOGSECTION("FtParserDc::token");
  unsigned tn = parser.state.token;
  LOGV(ln);
  LOGV(parser.stateStack.size());
  if (ln < parser.stateStack.size()) {
    tn = parser.stateStack[ln].token;
  }
  LOGV(tn);
  return tn;
}

unsigned FtParserReductionDc::token(unsigned ln) {
  unsigned tn = ibnfs[ibnfb[rule_number] + ln];

  return tn;
}

dc_ref FtParserDc::aux_trace(unsigned) {
  LOGSECTION("FtParserDc::aux_trace(unsigned)");
  tsd *ts = init_tsd(2);
  int k = 0;
  dc_ref window;
  int ssx = parser.stateStack.size();

  while (k < ssx) {
    int sn = parser.stateStack[k].number;
    int tn = parser.stateStack[k++].token;
    at(ts, sn, tn);
  }
  if (parser.processState == FtParser::selectionRequired) {
    at(ts, parser.reductionState.number, (int) parser.reductionState.token);
  }
/*
  else if (parser.processState == FtParser::syntaxError) {
    at(ts, parser.reductionState.number, 0);
  }
  else {
    at(ts, parser.state.number, parser.state.token);
  }
*/
  else {
    at(ts, parser.state.number, 0);
  }
  window = new trace_window_dc("Auxiliary Trace", ts);
  delete_tsd(ts);
  return window;
}

dc_ref FtParserDc::expansion_rules(unsigned ln) {
  return build_item_list(token(ln));
}

int FtParserDc::expansion_rules_ok(unsigned ln) {
  LOGSECTION("FtParserDc::expansion_rules_ok");
  return build_item_list_ok(token(ln));
}

dc_ref FtParserReductionDc::expansion_rules(unsigned ln) {
  return build_item_list(token(ln));
}

int FtParserReductionDc::expansion_rules_ok(unsigned ln) {
  return build_item_list_ok(token(ln));
}

int FtParserDc::keywords_ok(unsigned ln) {
  LOGSECTION("FtParserDc::keywords_ok");
  return keywords_window_ok(state(ln));
}

dc_ref FtParserDc::keywords(unsigned ln) {
  return keywords_window(state(ln));
}

dc_ref FtParserDc::previous_states(unsigned ln) {
  LOGSECTION("FtParserDc::previous_states");
  return previous_states_window(state(ln));
}

int FtParserDc::productions_ok(unsigned ln) {
  LOGSECTION("FtParserDc::productions_ok");
  return productions_window_ok(token(ln));
}

int FtParserDc::previous_states_ok(unsigned ln) {
  LOGSECTION("FtParserDc::previous_states_ok");
  return ln != 0;
}

dc_ref FtParserDc::productions(unsigned ln) {
  return productions_window(token(ln));
}

int FtParserReductionDc::productions_ok(unsigned ln) {
  return productions_window_ok(token(ln));
}

dc_ref FtParserReductionDc::productions(unsigned ln) {
  return productions_window(token(ln));
}

/*
dc_ref FtParserDc::rule_stack(unsigned ln) {
  LOGSECTION("FtParserDc::rule_stack");
  LOGV(ln);

  parser.itemStack = parser.x1x_new();
  return dc_ref(new rule_stack_dc(parser.itemStack,ln, head_title));
}
*/

int FtParserDc::set_elements_ok(unsigned ln) {
  return token_set_window_ok(token(ln));
}

dc_ref FtParserDc::set_elements(unsigned ln) {
  return token_set_window(token(ln));
}

int FtParserReductionDc::set_elements_ok(unsigned ln) {
  return token_set_window_ok(token(ln));
}

dc_ref FtParserReductionDc::set_elements(unsigned ln) {
  return token_set_window(token(ln));
}

dc_ref FtParserDc::state_definition(unsigned ln) {
  return conflict_state_window(state(ln));
}

dc_ref FtParserDc::state_expansion(unsigned ln) {
  return state_expansion_window(state(ln));
}

int FtParserDc::usage_ok(unsigned ln) {
  return token_usage_window_ok(token(ln));
}

dc_ref FtParserDc::usage(unsigned ln) {
  return token_usage_window(token(ln));
}

int FtParserReductionDc::usage_ok(unsigned ln) {
  return token_usage_window_ok(token(ln));
}

dc_ref FtParserReductionDc::usage(unsigned ln) {
  return token_usage_window(token(ln));
}

#ifdef __IBMCPP__

#pragma define(DcRef<FtParserDc>)
#pragma define(DcRef<FtParserReductionDc>)
#pragma define(DcRef<rule_stack_dc>)
#pragma define(DcRef<TokenMenuDc>)

#endif