Example #1
0
cst_node cst_canonize(cst_node node)
{
  int c1,c2;
  cst_node newnode;
  i64 l, r;
  i64 i, depth;
  CSA *csa;

  newnode = node;

  csa = node.csa;
  l = node.l;  r = node.r;
  depth = node.depth;

  for (i=0; i<depth; i++) {
    l = csa->psi(csa, l);
    r = csa->psi(csa, r);
  }

  while (1) {
    c1 = csa->head(csa, l);
    c2 = csa->head(csa, r);
    if (c1 != c2) break;
    l = csa->psi(csa, l);
    r = csa->psi(csa, r);
    depth++;
  }
  
  newnode.depth = depth;
  return newnode;
}
Example #2
0
File: cst.c Project: mrG7/hpg-libs
cst_node cst_firstchild(cst_node node)
{
  int c;
  i64 l;
  i64 i, depth;
  CSA *csa;
  cst_node newnode;

  csa = node.csa;
  l = node.l;
  depth = node.depth;

  for (i=0; i<depth; i++) {
    l = csa->psi(csa, l);
  }

  c = csa->head(csa, l);
  if (c == -1) {
    newnode.csa = csa;
    newnode.depth = depth+1;
    newnode.depth2 = depth+1;
    newnode.l = newnode.r = node.l;
    return newnode;
  } else {
    return cst_child(node, csa->AtoC[c]);
  }
}
Example #3
0
cst_node cst_nextchild(cst_node node, cst_node child)
{
  int c;
  i64 l, r;
  i64 i, depth;
  CSA *csa;
  cst_node newnode;

  csa = node.csa;
  l = child.r+1;
  depth = node.depth;

  if (l > node.r) {
    newnode.depth = -1;
    newnode.l = 1;
    newnode.r = 0;
    return newnode;
  }

  for (i=0; i<depth; i++) {
    l = csa->psi(csa, l);
  }

  c = csa->head(csa, l);
  if (c == -1) {
    newnode.csa = csa;
    newnode.depth = depth+1;
    newnode.l = newnode.r = node.l;
    return newnode;
  } else {
    return cst_child(node, csa->AtoC[c]);
  }
}
Example #4
0
static VALUE
rb_csa_head(VALUE self, VALUE oi)
{
    CSA *sa = csa_ptr(self);
    i64 i, n;
    int c;

    i = FIX2LONG(oi);
    n = sa->n;

    if (i < 0 || i > n) {    // error
      return Qnil;
    }

    c = sa->head(sa, i);

    return INT2FIX(c);
}
Example #5
0
int cst_isunary(cst_node node)
{
  int c1,c2;
  i64 l, r;
  i64 i, depth;
  CSA *csa;

  csa = node.csa;
  l = node.l;  r = node.r;
  depth = node.depth;

  for (i=0; i<depth; i++) {
    l = csa->psi(csa, l);
    r = csa->psi(csa, r);
  }

  c1 = csa->head(csa, l);
  c2 = csa->head(csa, r);

  return (c1 == c2);
}