diff anagram/guisupport/stexpdc.cpp @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/anagram/guisupport/stexpdc.cpp	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,243 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * stexpdc.cpp
+ */
+
+#include "dc.h"
+#include "dict.h"
+#include "items.h"
+#include "q1glbl.h"
+#include "q5.h"
+#include "rule.h"
+#include "stexpdc.h"
+#include "stacks.h"
+#include "token.h"
+#include "ut.h"
+#include "wm1.h"
+#include "ws.h"
+
+
+static int chain_element(int t, int f) {
+  //unsigned *fp;
+  int n;
+  Token token = t;
+  //if (x4(t,f) == 0) return 0;
+  if (!token.isExpansionRule(f)) return 0;
+  //fp = lstptr(map_token_number[t], forms);
+  //n = map_token_number[t].n_forms;
+  //n = token->n_forms;
+  n = token->ruleList.size();
+  //while (n--) {
+  for (int i = 0; i < n; i++) {
+    //Rule fn = *fp++;
+    Rule fn = token.rule(i);
+    int tn;
+    if ((int) fn == f) return 1;
+    if (fn->length() == 0) continue;
+    if (xws(fn)) continue;
+    //tn = lstptr(map_form_number[fn], tokens)[0];
+    tn = Rule(fn).token(0);
+    if (chain_element(tn, f)) {
+      return 1;
+    }
+    fws();
+  }
+  return 0;
+}
+
+static tsd *expand_chain(int sn, int f) {
+  int *list = dict_str(isht_dict, sn);
+  int n = (*list++ - 1)/2;
+  int fn, fx, k = n;
+  tsd *sx = init_tsd(2);
+  iws();
+  while (k--) {
+    int tn;
+
+    fn = *list++;
+    fx = *list++;
+
+    if (fx >= map_form_number[fn].length()) {
+      continue;
+    }
+    //tn = lstptr(map_form_number[fn], tokens)[fx];
+    tn = Rule(fn).token(fx);
+    if (chain_element(tn, f) == 0) {
+      continue;
+    }
+    at(sx, fn, fx);
+    xws(f);
+    k = tis();
+    list = list_base;
+    while (k--) {
+      at(sx, *list++, 0);
+    }
+    rws();
+    break;
+  }
+  return sx;
+}
+
+dc_ref expansion_chain_window(int sn, int fn, int fx) {
+  dc_ref window;
+
+  if (fx || fn == 0) {
+    return dc_ref();
+  }
+
+  const AgString foot = AgString::format("S%03d:R%03d", sn, fn);
+  //window = find_on_screen("Expansion Chain", foot);
+  //if (window) return window;
+  return dc_ref(new expansion_chain_dc(sn, fn, foot));
+}
+
+expansion_chain_dc::expansion_chain_dc(unsigned sn, unsigned rn, AgString foot)
+: state_expansion_dc(sn, "Expansion Chain", foot)
+{
+  state_number = sn;
+  rule_number = rn;
+  delete_tsd(expansion);
+  expansion = expand_chain(sn, rn);
+  //des->c_size = cursor_bar_size;
+  des->d_size.y = expansion->nt;
+
+  //getWidth();
+  //resize_window();
+}
+
+dc_ref state_expansion_window(int sn) {
+  //dc_ref window;
+
+  //if (sn == 0) return dc_ref();
+  const AgString foot = AgString::format("S%03d", sn);
+  //window = find_on_screen("State Expansion", foot);
+  //if (window.exists()) return window;
+  return dc_ref(new state_expansion_dc(sn, "State Expansion", foot));
+}
+
+dc_ref state_expansion_dc::aux_trace(unsigned) {
+  return aux_trace_window(state_number);
+}
+
+int state_expansion_dc::expansion_chain_ok(unsigned ln) {
+  int fn, fx;
+  xtx(expansion, ln, &fn, &fx);
+  return fn && fx == 0;
+}
+
+dc_ref state_expansion_dc::expansion_chain(unsigned ln) {
+  int fn, fx;
+  xtx(expansion, ln, &fn, &fx);
+  return expansion_chain_window(state_number, fn, fx);
+}
+
+int state_expansion_dc::expansion_rules_ok(unsigned ln) {
+  return build_item_list_ok(token(ln));
+}
+
+dc_ref state_expansion_dc::expansion_rules(unsigned ln) {
+  return build_item_list(token(ln));
+}
+
+void state_expansion_dc::getLine(unsigned ln) const {
+  int rn, rx;
+  xtx(expansion, ln, &rn, &rx);
+  ics();
+  append_item(rn, rx);
+}
+
+void state_expansion_dc::synchCursor(unsigned ln) const {
+  int rn, rx;
+  xtx(expansion, ln, &rn, &rx);
+  if (rn) {
+    set_rule_line(rn);
+  }
+}
+
+int state_expansion_dc::previous_states_ok(unsigned) {
+  return previous_states_window_ok(state_number);
+}
+
+dc_ref state_expansion_dc::previous_states(unsigned) {
+  return previous_states_window(state_number);
+}
+
+int state_expansion_dc::productions_ok(unsigned ln) {
+  return productions_window_ok(token(ln));
+}
+
+dc_ref state_expansion_dc::productions(unsigned ln) {
+  return productions_window(token(ln));
+}
+
+int state_expansion_dc::reduction_states_ok(unsigned ln) {
+  int fn, fx;
+  xtx(expansion, ln, &fn, &fx);
+  return reduction_states_window_ok(fn, fx);
+}
+
+dc_ref state_expansion_dc::reduction_states(unsigned ln) {
+  int fn, fx;
+  xtx(expansion, ln, &fn, &fx);
+  return reduction_states_window(state_number, fn, fx);
+}
+
+dc_ref state_expansion_dc::rule_context(unsigned ln) {
+  int rn, rx;
+  xtx(expansion, ln, &rn, &rx);
+  return rule_context_window(rn);
+}
+
+int state_expansion_dc::set_elements_ok(unsigned ln) {
+  return token_set_window_ok(token(ln));
+}
+
+dc_ref state_expansion_dc::set_elements(unsigned ln) {
+  return token_set_window(token(ln));
+}
+
+state_expansion_dc::state_expansion_dc(unsigned sn,
+				       const AgString head,
+				       const AgString foot)
+  : dc(head, foot)
+  , expansion(expand_state(sn))
+{
+  state_number = sn;
+  //des->c_size = cursor_bar_size;
+  des->d_size.y = expansion->nt;
+
+  //getWidth();
+  //resize_window();
+}
+
+state_expansion_dc::~state_expansion_dc(void) {
+  //if (!clone() && (expansion != NULL)) delete_tsd(expansion);
+  if (expansion != NULL) {
+    delete_tsd(expansion);
+  }
+}
+
+unsigned state_expansion_dc::token(unsigned ln) {
+  int fn, fx;
+  xtx(expansion, ln, &fn, &fx);
+  if (fx >= map_form_number[fn].length()) {
+    return 0;
+  }
+  //return lstptr(map_form_number[fn], tokens)[fx];
+  return Rule(fn).token(fx);
+}
+
+int state_expansion_dc::usage_ok(unsigned ln) {
+  return token_usage_window_ok(token(ln));
+}
+
+dc_ref state_expansion_dc::usage(unsigned ln) {
+  return token_usage_window(token(ln));
+}
+
+
+
+