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 */