view anagram/guisupport/ruletabdc.cpp @ 15:f5acaf0c8a29

Don't cast through "volatile int". Causes a gcc warning nowadays. XXX: should put something else back here to frighten the optimizer
author David A. Holland
date Tue, 31 May 2022 01:00:55 -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.
 *
 * ruletabdc.cpp
 */

#include "dc.h"
#include "items.h"
#include "q1a.h"
#include "q1glbl.h"
#include "ruletabdc.h"
#include "stacks.h"
#include "token.h"
#include "ut.h"
#include "wm1.h"
#include "ws.h"

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


rule_table_dc::localize::localize(unsigned ln) {
  LOGSECTION("rule_table_dc::localize::localize");
  int rn = 1;
  unsigned nc = ibnfn[1] + 1;
  int lc = 0;

  while (nc <= ln) {
    lc = nc;
    nc += ibnfn[++rn] + 1;
  }
  rule = rn;
  index = ln-lc;
  LOGV(ln) LCV(rule) LCV(index) LCV(lc) LCV(nc);
}

int rule_table_dc::expansion_rules_ok(unsigned ln) {
  localize x(ln);
  return build_item_list_ok(x.token());
}

dc_ref rule_table_dc::expansion_rules(unsigned ln) {
  localize x(ln);
  return build_item_list(x.token());
}


int rule_table_dc::productions_ok(unsigned ln) {
  localize x(ln);
  return productions_window_ok(x.token());
}

dc_ref rule_table_dc::productions(unsigned ln) {
  localize x(ln);
  return productions_window(x.token());
}

int rule_table_dc::usage_ok(unsigned ln) {
  localize x(ln);
  return token_usage_window_ok(x.token());
}

dc_ref rule_table_dc::usage(unsigned ln) {
  localize x(ln);
  return token_usage_window(x.token());
}

dc_ref rule_table_dc::rule_context(unsigned ln) {
  localize x(ln);
  return rule_context_window(x.rule);
}


static int rule_table_tabs[] = {7,0};

void rule_table_dc::getLine(unsigned ln) const {
  LOGSECTION("rule_table_dc::getLine");
  localize x(ln);
  unsigned nt = ibnfn[x.rule];
  LOGV(ln) LCV(nt);
  if (x.index < nt) {
    int tn = ibnfs[ibnfb[x.rule] + x.index];
    ssprintf("T%03d:\t", tn);
    atkn(tn);
    return;
  }
  sss("\t   -> ");
  append_item(x.rule, -1);
}

void rule_table_dc::synchCursor(unsigned ln) const {
  LOGSECTION("rule_table_dc::synchCursor");
  LOGV(ln);
  localize x(ln);
  if (x.rule) {
    set_rule_line(x.rule);
  }
}

rule_table_dc::rule_table_dc(void)
  : dc("Rule Table")
{
  int lc = 0;
  unsigned fn = 0;

  tab_stops = rule_table_tabs;
  columnHeadTitle = "Token\tProduction";
  while (fn++ < nforms) {
    lc += ibnfn[fn] + 1;
  }
  des->d_size.y = lc;
  des->d_size.x = rule_table_tabs[1] + item_length;
}