git @ Cat's Eye Technologies beta-Juliet / master src / symstr.h
master

Tree @master (Download .tar.gz)

symstr.h @masterraw · history · blame

/*
 * symstr.h
 * Symbol string structures and prototypes for 2Iota.
 * $Id: symstr.h 518 2010-04-28 17:48:38Z cpressey $
 */

#ifndef __SYMSTR_H
#define __SYMSTR_H

#include "symbol.h"

struct symstr {
	struct symstr_component	*head;
	struct symstr_component	*tail;
};

struct symstr_component {
	struct symstr_component	*next;
	struct symstr_component	*prev;
	struct symbol		*sym;		/* may be lit or param */
	struct symbol		*alphasym;	/* indicates a binding:
						   alphasym MUST be
						   SYM_TYPE_ALPHABET */
	int			 many;		/* indicates '+' rep OK */
	int			 op;		/* for param in subst, the op */
	struct symstr		*fmode;		/* failure mode alternative */
};

#define	SYMSTR_OP_NOP			 0	/* No operation */
#define	SYMSTR_OP_SUCC			 1	/* Successor */
#define	SYMSTR_OP_PRED			 2	/* Predecessor */
#define	SYMSTR_OP_NEXT			 3	/* Next in alphabet */
#define	SYMSTR_OP_PREV			 4	/* Previous in alphabet */

#define	SYMSTR_BIND_OK			 0
#define	SYMSTR_BIND_LITERAL_MISMATCH	 1
#define	SYMSTR_BIND_STRING_TOO_SHORT	 2
#define	SYMSTR_BIND_PATTERN_TOO_SHORT	 3
#define	SYMSTR_BIND_BAD_STRING		 4
#define	SYMSTR_BIND_BAD_PATTERN		 5
#define	SYMSTR_BIND_OUTSIDE_ALPHABET	 6
#define	SYMSTR_BIND_NOT_IMPLEMENTED	 7

extern const char *		 symstr_bind_result[];

/* housekeeping */
struct symstr		*symstr_new(void);
struct symstr		*symstr_create(struct symbol_table *, char *);
struct symstr		*symstr_dup(struct symstr *);
void			 symstr_free(struct symstr *);
struct symstr_component	*symstr_component_new(struct symbol *, struct symbol *,
					      int, int);
void			 symstr_component_free(struct symstr_component *);

/* building */
struct symstr_component	*symstr_append(struct symstr *, struct symbol *,
					struct symbol *, int, int);
struct symstr_component	*symstr_prepend(struct symstr *, struct symbol *,
					struct symbol *, int, int);
void			 symstr_append_symstr(struct symstr *,
					      struct symstr *);
void			 symstr_remove(struct symstr *, struct symstr_component *);

/* checking */
int			 symstr_is_literal(struct symstr *);
int			 symstr_eq(struct symstr *, struct symstr *);

/* specificity */
void			 symstr_specificity(struct symstr *, int *, int *);

/* substitution & binding */
struct symstr		*symstr_substitute(struct symstr *,
					   struct symbol_table *);
void			 symstr_component_substitute(struct symstr_component *,
						     struct symstr *,
						     struct symstr *);
int			 symstr_bind(struct symstr *, struct symstr *,
					struct symbol_table *);

/* alphabetical / Peano arithmetic */
struct symstr		*symstr_succ(struct symstr *, struct alphabet *, int *);
struct symstr		*symstr_pred(struct symstr *, struct alphabet *, int *);
struct symstr		*symstr_prev(struct symstr *, struct alphabet *, int *);
struct symstr		*symstr_next(struct symstr *, struct alphabet *, int *);

/* dumping and debugging */
void			 symstr_dump(struct symstr *);
void			 symstr_components_dump(struct symstr_component *);
void			 symstr_component_dump(struct symstr_component *);

#endif /* !__SYMSTR_H */