// The classes Conf, LConf and ConfSet allow for the representation of a // configuration, configuration with a lookahead, and a configuration // set. The classes ConfList, LConfList and ConfSetList allow for lists // of corresponding items. class Conf; class ConfList : public list { public: Conf *find(ParNode *); }; // The configuration A -> B . C D is represented by a rule pointer to A, // and a dot pointer to C. While the former is not totally necessary, // it is present to prevent repeated computation. class Conf { public: static ConfList confs; int id; ParRule *rule; ParNode *dot; void show(FILE *); Conf(ParRule *r, ParNode *d) { rule = r; dot = d; Conf *item = this; confs.append(item); } }; class LConf; class LConfList : public list { public: LConf *find(Conf *); void replicate(); void append(const LConf *i); }; // A lookahead configuration consist of a pointer to the actual // configuration and a lookahead set. class LConf { public: static LConfList cogs; Conf *conf; void show(FILE *); list lookAhead; LConf(Conf *c) { conf = c; LConf *item = this; cogs.append(item); } }; // Finally, a configuration set is represented as a sequence of // lookahead configurations. A transition from a configuration set to // another is represented by a Move. class ConfSet; class Move; class MoveList : public list { public: ConfSet *findDest(ParRule *); }; // A Move instance is represented by the symbol causing the transition // and the destination state. class Move { public: ParRule *trigger; ConfSet *dest; void show(FILE *); Move(ParRule *r, ConfSet *d) { trigger = r; dest = d; } }; class ConfSetList : public list { public: ConfSet *find(LConfList *); }; // A configuration set is represented by the closure set and the list of // possible moves. class ConfSet { int _id; public: static ConfSetList confSets; static int NextId; int id() { return _id; } LConfList *closure; MoveList moves; ConfSet *destOf(ParRule *r) { return(moves.findDest(r)); } void findMoves(); void show(FILE *); ConfSet(LConfList *c) { _id = NextId++; closure = c; ConfSet *item = this; confSets.append(item); } };