static void test_chars() { CC_Class *cc[CC_BITS], *cc_input, *temp, *all; ATerm input, output; int i; input = ATparse("char-class([0,range(9,10),12,23,range(30,50),range(128,256)])"); cc_input = CC_ClassFromTerm(input); temp = CC_makeClassEmpty(); CC_addATermClass(temp, input); assert(CC_isEqual(temp, cc_input)); CC_free(temp); temp = CC_makeClassEmpty(); assert(CC_isEmpty(temp)); for (i=0; i<CC_BITS; i++) { cc[i] = CC_ClassFromInt(i); if (i == CC_EOF) { assert(CC_isEOF(cc[i])); } else { assert(!CC_isEOF(cc[i])); } CC_union(temp, cc[i], temp); assert(!CC_isEOF(temp)); } all = CC_makeClassAllChars(); assert(!CC_isEmpty(all)); assert(CC_isEqual(temp, all)); CC_difference(temp, all, temp); assert(CC_isEmpty(temp)); CC_copy(all, temp); CC_difference(temp, cc_input, temp); CC_complement(temp, temp); assert(CC_isEqual(temp, cc_input)); CC_copy(all, temp); CC_difference(temp, cc_input, temp); CC_union(temp, cc_input, temp); assert(CC_isEqual(temp, all)); CC_copy(all, temp); CC_intersection(temp, cc_input, temp); assert(CC_isEqual(temp, cc_input)); assert(CC_isSubset(cc_input, all)); output = CC_ClassToTerm(cc_input); /* ATwarning("input = %t\noutput = %t\n", input, output); assert(ATisEqual(output, input)); */ }
CC_Class *first_no_epsilon(PT_Symbols symbols) { CC_Class *result; result = CC_makeClassEmpty(); first(result, symbols); CC_removeChar(result, CC_EPSILON); return result; }
CC_Class *get_first_set(PT_Symbol symbol, ATbool create) { long index; int old_size; /* Associate a unique integer with a symbol. */ index = internSymbol(symbol); if (index >= max_first_sets) { old_size = max_first_sets; max_first_sets *= 2; first_sets = (CC_Class **)realloc(first_sets, max_first_sets*sizeof(CC_Class *)); if (!first_sets) { ATerror("out of memory in get_first_set %d\n", max_first_sets); } memset(&first_sets[old_size], 0, old_size*sizeof(CC_Class *)); } if (create && first_sets[index] == NULL) { first_sets[index] = CC_makeClassEmpty(); } return first_sets[index]; }