Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/agcore/rule.h @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children | 607e3be6bad8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/agcore/rule.h Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,142 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * rule.h + */ + +#ifndef RULE_H +#define RULE_H + +class AgStringDictionary; // from agdict.h +#include "agstring.h" +#include "register.h" + + +struct RuleDescriptor; // below +class Token; // from token.h (included below) + +extern AgStringDictionary cVariableList; + +class Rule : public ObjectRegister<RuleDescriptor> { +public: + Rule();// {} + Rule(int x); + Rule(const Rule &t); + Token &token(int) const; + + static Rule create(); + static void reset(); + static const int first; + + class Map; + friend class Map; + + class Map { + public: + RuleDescriptor &operator [] (unsigned x); + }; +}; + +class CastDescriptor { +public: + AgString name; + int wrapper : 1; + + CastDescriptor(); + CastDescriptor(const char *s); + int operator < (const CastDescriptor &c) const { return name < c.name; } + char *pointer() { return name.pointer(); } +}; + +class Cast : public KeyedObjectRegister<CastDescriptor> { +public: + Cast(); + Cast(const int x); + Cast(const char *); + Cast(const AgString); + + static const int first; + + static void reset(); + static Cast create(); + + AgString &name() { return descriptor->name; } + int operator < (const Cast x) const; + + static Cast voidCast; + static Cast intCast; + static Cast longCast; + static int nWrappers; + + void requireWrapper(); + int wrapperRequired(); +}; + +#include "token.h" + +class RuleElement { +public: + Token token; + int cVariable; + + RuleElement() {} + RuleElement(const Token &t, int x); + int operator < (const RuleElement) const; +}; + +struct RuleDescriptor { + Token prim_tkn; + unsigned line, col; + unsigned proc_name; + AgArray<RuleElement> elementList; + AgArray<RuleElement> hostElementList; // for immmediate actions only + unsigned + non_vanishing_length, + op_bias; + unsigned precedence_level; + unsigned not_unique_reduction : 1; + unsigned error_mask: 1; + unsigned left_associative: 1; + unsigned right_associative: 1; + unsigned fast_loop: 1; + unsigned immediate_proc: 1; + unsigned lexical: 1; + unsigned nonLexical: 1; + unsigned reductionRequired: 1; + + unsigned length() { return elementList.size(); } + RuleDescriptor(); + int operator < (const RuleDescriptor &d) const { + return elementList < d.elementList; + } + Token &token(int); +}; + +extern Rule::Map map_form_number; + +struct VpRuleDescriptor { + AgArray<RuleElement> elementList; + unsigned procedureName; + + VpRuleDescriptor(); + VpRuleDescriptor(AgStack<RuleElement> &, int pn); + int operator < (const VpRuleDescriptor x) const; +}; + +class VpRule : public KeyedObjectRegister<VpRuleDescriptor> { +public: + VpRule(); + VpRule(const int x); + VpRule(const VpRule &x); + VpRule(AgStack<RuleElement> &, int pn); + + static const int first; + + static void reset(); + static VpRule create(); +}; + + +#endif /* RULE_H */