diff anagram/agcore/csexp.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/anagram/agcore/csexp.h	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,318 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * csexp.h
+ */
+
+#ifndef CSEXP_H
+#define CSEXP_H
+
+#include <stdlib.h>
+#include "port.h"
+
+class AgString; // from agstring.h
+#include "bitmap.h"
+#include "minmax.h"
+
+//#define INCLUDE_LOGGING
+//#include "log.h"
+
+
+unsigned char agToUpper(unsigned char);
+
+class CharSetExpression;
+  class CharRange;
+  class CodeRange;
+  class IndividualChar;
+  class IndividualCode;
+  class NamedCharSet;
+  class CharSetUnion;
+  class CharSetIntersection;
+  class CharSetDifference;
+  class CharSetComplement;
+
+class CharSetExpression {
+protected:
+  enum Precedence {
+    additive=1,
+    multiplicative,
+    unary,
+    atomic
+  };
+
+  Precedence precedence;
+
+  class TranslateTable {
+  private:
+    int *table;
+  public:
+    TranslateTable() : table(new int[256]) {
+      for (int i = 0; i < 256; i++) {
+	table[i] = i;
+      }
+    }
+    ~TranslateTable() {
+      delete [] table;
+    }
+    int &operator [] (unsigned const x) {
+      return table[x];
+    }
+  };
+
+  static TranslateTable translateTable;
+
+public:
+  enum Type {
+    notDefined = 1,
+    charRange,
+    codeRange,
+    individualChar,
+    individualCode,
+    namedCharSet,
+    charSetUnion,
+    charSetIntersection,
+    charSetDifference,
+    charSetComplement,
+  };
+
+  Type type;
+
+  void *operator new (size_t n) { return malloc(n); }
+  void operator delete(void *p) { free(p); }
+
+  static void checkMinimum(int f);
+
+  CharSetExpression(Precedence p, Type t) : precedence(p), type(t) {}
+  CharSetExpression(Type t) : precedence(atomic), type(t) {}
+  CharSetExpression() : precedence(atomic), type(notDefined) {}
+  virtual ~CharSetExpression() {}
+
+  virtual int operator == (const CharSetExpression &) const {
+    //LOGSECTION("CharSetExpression::operator==(CharSetExpression &)");
+    return 0;
+  }
+
+  virtual int operator != (const CharSetExpression &x) const {
+    return !(*this == x);
+  }
+
+  //virtual int operator > (const CharSetExpression &x) const = 0;
+
+  virtual int operator < (const CharSetExpression &x) const {
+    return type < x.type;
+  }
+
+  virtual AgString asString() const = 0;
+  AgString asString(Precedence p) const;
+
+  virtual int recursive(int) { return 0; }
+  virtual int nameNode() { return 0; }
+  virtual int char_node() { return 0; }
+
+  virtual CharBitmap bitmap() const = 0;
+  virtual void checkRange() {}
+  virtual int sameType(const CharSetExpression &x) const {
+    return type == x.type;
+  }
+};
+
+class CharRange : public CharSetExpression {
+private:
+  int first;
+  int last;
+  CharRange(const CharRange &) : CharSetExpression() {}
+public:
+  CharRange(int f, int l)
+    : CharSetExpression(charRange), first(min(f, l)), last(max(f, l))
+  {
+    //LOGSECTION("CharRange");
+    //LOGV(first) LCV(last);
+    checkRange();
+  }
+  ~CharRange() {}
+
+  //virtual int operator == (const CharRange &x) const;
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual CharBitmap bitmap() const;
+  virtual void checkRange();
+};
+
+class CodeRange : public CharSetExpression {
+private:
+  int first;
+  int last;
+  CodeRange(const CharRange &) : CharSetExpression() {}
+public:
+  CodeRange(int f, int l)
+    : CharSetExpression(codeRange), first(min(f, l)), last(max(f, l))
+  {
+    //LOGSECTION("CodeRange");
+    //LOGV(first) LCV(last);
+    checkRange();
+    checkMinimum(f);
+  }
+  ~CodeRange() {}
+
+  //virtual int operator == (const CodeRange &x) const;
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual CharBitmap bitmap() const;
+  virtual void checkRange();
+};
+
+class IndividualChar : public CharSetExpression {
+private:
+  IndividualChar(const IndividualChar &) : CharSetExpression() {}
+public:
+  int asciiValue;
+
+  IndividualChar(int c) : CharSetExpression(individualChar), asciiValue(c) {
+    //LOGSECTION("IndividualChar");
+    //LOGV(asciiValue);
+    checkRange();
+  }
+  ~IndividualChar() {}
+
+  //virtual int operator == (const IndividualChar &x) const;
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual CharBitmap bitmap() const;
+  virtual void checkRange();
+};
+
+class IndividualCode : public CharSetExpression {
+private:
+  IndividualCode(const IndividualCode &) : CharSetExpression() {}
+public:
+  int value;
+
+  IndividualCode(int c) : CharSetExpression(individualCode), value(c) {
+    //LOGSECTION("IndividualCode");
+    //LOGV(value);
+    checkRange();
+    checkMinimum(value);
+  }
+  ~IndividualCode() {}
+
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual int char_node() { return 1; }
+  virtual CharBitmap bitmap() const;
+  virtual void checkRange();
+};
+
+class NamedCharSet : public CharSetExpression {
+private:
+  NamedCharSet(const NamedCharSet &) : CharSetExpression() {}
+public:
+  int name;
+
+  NamedCharSet(int n) : CharSetExpression(namedCharSet), name(n) {
+    //LOGSECTION("NamedCharSet");
+    //LOGV(dict_str(tkn_dict, name));
+  }
+  ~NamedCharSet() {}
+
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual int recursive(int n) { return n == name; }
+  virtual int nameNode() { return 1; }
+  virtual CharBitmap bitmap() const;
+};
+
+class CharSetUnion : public CharSetExpression {
+private:
+  CharSetExpression *left, *right;
+  CharSetUnion(const CharSetUnion &) : CharSetExpression() {}
+public:
+  CharSetUnion(CharSetExpression *l, CharSetExpression *r)
+    : CharSetExpression(additive, charSetUnion), left(l), right(r)
+  {
+    //LOGSECTION("CharSetUnion");
+  }
+  ~CharSetUnion() { delete left; delete right; }
+
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual int recursive(int n) {
+    return left->recursive(n) || right->recursive(n);
+  }
+  virtual CharBitmap bitmap() const;
+  virtual void checkRange();
+};
+
+class CharSetIntersection : public CharSetExpression {
+private:
+  CharSetExpression *left, *right;
+  CharSetIntersection(const CharSetIntersection &) : CharSetExpression() {}
+public:
+  CharSetIntersection(CharSetExpression *l, CharSetExpression *r)
+    : CharSetExpression(multiplicative, charSetIntersection), left(l), right(r)
+  {
+    //LOGSECTION("CharSetIntersection");
+  }
+  ~CharSetIntersection() {delete left; delete right;}
+
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual CharBitmap bitmap() const;
+  virtual int recursive(int n) {
+    return left->recursive(n) || right->recursive(n);
+  }
+  virtual void checkRange();
+};
+
+class CharSetDifference : public CharSetExpression {
+private:
+  CharSetExpression *left, *right;
+  CharSetDifference(const CharSetDifference &) : CharSetExpression() {}
+public:
+  CharSetDifference(CharSetExpression *l, CharSetExpression *r)
+    : CharSetExpression(additive, charSetDifference), left(l), right(r)
+  {
+    //LOGSECTION("CharSetDifference");
+  }
+  ~CharSetDifference() {delete left; delete right;}
+
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual CharBitmap bitmap() const;
+  virtual int recursive(int n) {
+    return left->recursive(n) || right->recursive(n);
+  }
+  virtual void checkRange();
+};
+
+class CharSetComplement : public CharSetExpression {
+private:
+  CharSetExpression *operand;
+  CharSetComplement(const CharSetComplement &) : CharSetExpression() {}
+public:
+  CharSetComplement(CharSetExpression *o)
+    : CharSetExpression(unary, charSetComplement), operand(o)
+  {
+    //LOGSECTION("CharSetComplement");
+  }
+  ~CharSetComplement() {delete operand;}
+
+  virtual int operator == (const CharSetExpression &x) const;
+  virtual int operator < (const CharSetExpression &x) const;
+  virtual AgString asString() const;
+  virtual CharBitmap bitmap() const;
+  virtual int recursive(int n) { return operand->recursive(n); }
+  virtual void checkRange();
+};
+
+
+#endif /* CSEXP_H */