/************ SET.h *************/
#ifndef SET_H #define SET_H
typedef struct snode {
int elem;
struct snode* next; } snode, *symset;
symset phi, declbegsys, statbegsys, facbegsys, relset;
symset createset(int data, .../* SYM_NULL */); void destroyset(symset s);
symset uniteset(symset s1, symset s2); int inset(int elem, symset s);
#endif
// EOF set.h
25
/************ SET.c *************/
#include
symset uniteset(symset s1, symset s2) {
symset s; snode* p;
s = p = (snode*) malloc(sizeof(snode)); while (s1 && s2) {
p->next = (snode*) malloc(sizeof(snode)); p = p->next;
if (s1->elem < s2->elem) {
p->elem = s1->elem; s1 = s1->next; } else {
p->elem = s2->elem; s2 = s2->next; } }
while (s1) {
p->next = (snode*) malloc(sizeof(snode)); p = p->next;
p->elem = s1->elem; s1 = s1->next; }
while (s2) {
p->next = (snode*) malloc(sizeof(snode)); p = p->next;
p->elem = s2->elem; s2 = s2->next;
26
}
p->next = NULL;
return s; } // uniteset
void setinsert(symset s, int elem) {
snode* p = s; snode* q;
while (p->next && p->next->elem < elem) {
p = p->next; }
q = (snode*) malloc(sizeof(snode)); q->elem = elem; q->next = p->next; p->next = q; } // setinsert
symset createset(int elem, .../* SYM_NULL */) {
va_list list; symset s;
s = (snode*) malloc(sizeof(snode)); s->next = NULL;
va_start(list, elem); while (elem) {
setinsert(s, elem);
elem = va_arg(list, int); }
va_end(list); return s; } // createset
void destroyset(symset s) {
snode* p;
27
while (s) {
p = s;
s = s->next; free(p); }
} // destroyset
int inset(int elem, symset s) {
s = s->next;
while (s && s->elem < elem) s = s->next;
if (s && s->elem == elem) return 1; else
return 0; } // inset
// EOF set.c
28
/************ PL0.c *************/
// pl0 compiler source code
#include
////////////////////////////////////////////////////////////////////// // print error message. void error(n) {
int i;
printf(\
for (i = 1; i <= cc - 1; i++) printf(\ printf(\
printf(\ err++; } // error
////////////////////////////////////////////////////////////////////// void getch(void) {
if (cc == ll) {
if (feof(infile)) {
printf(\ exit(1); }
ll = cc = 0;
printf(\
while (!feof(infile) && (ch = getc(infile))!='\\n') {
printf(\ line[++ll] = ch; } // while printf(\ line[++ll] = ' ';
29