diff anagram/agcore/ftpar.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/ftpar.h	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,193 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * ftpar.h
+ */
+
+#ifndef FTPAR_H
+#define FTPAR_H
+
+class Token; // from token.h
+struct tsd; // from tsd.h
+#include "agarray.h"
+#include "agsignal.h"
+#include "agstack.h"
+#include "cint.h"
+
+
+extern AgArray<unsigned> traceCounts;
+
+int precedes(cint a, cint b);
+
+
+class FtParser {
+public:
+  enum ProcessState {
+    ready,
+    running,
+    finished,
+    syntaxError,
+    unexpectedEndOfFile,
+    selectionRequired,
+    selectionError
+  };
+
+  class State {
+  public:
+    friend class FtParser;
+    friend class FtParserDc;
+    friend class FtParserReductionDc;
+    friend class FileTraceWindow;
+    friend class GTView;
+    friend class GTWindow;
+    friend class TokenMenuDc;
+
+    int number;
+    int line, column, charPos;
+    const unsigned char *pointer;
+    unsigned token;
+
+  public:
+    State(char *p)
+      : number(0)
+      , line(0)
+      , column(0)
+      , charPos(0)
+      , pointer((const unsigned char*) p)
+      , token(0)
+    {}
+    State()
+      : number(0)
+      , line(0)
+      , column(0)
+      , charPos(0)
+      , pointer(0)
+      , token(0)
+    {}
+    State(unsigned sn, unsigned tn)
+      : number(sn)
+      , line(0)
+      , column(0)
+      , charPos(0)
+      , pointer(0)
+      , token(tn)
+    {}
+
+    cint position() { return cint(charPos,line); }
+    int operator < (const State &s) const { return number < s.number; }
+  };
+
+  struct Transaction {
+    int count;
+    State state;
+
+    Transaction() : count(0) {}
+    Transaction(int c, State s) : count(c), state(s) {}
+    int operator < (const Transaction &t) const { return count < t.count; }
+  };
+
+  struct StackChanged {
+    int newSize;
+    StackChanged() : newSize(0) {}
+    StackChanged(int n) : newSize(n) {}
+  };
+
+  AgString text;
+  State state;
+  State reductionState;
+
+  tsd *initialStack;
+
+  AgStack<State> stateStack;
+  AgStack<State> auxStack;
+  AgStack<Transaction> transStack;
+  const unsigned char *lookAhead;
+  const unsigned char *endPointer;
+  unsigned inputToken;
+  int nNullShifts;
+  ProcessState processState;
+  static const char *processStateText[];
+
+  unsigned actionParameter;
+
+  int ruleLength;
+  int ruleToReduce;
+  int reductionIndex;
+  int reductionSelection;
+
+  //DcRef<FtParserDc> displayControl;
+  struct BroadcastStackChanged : public Broadcaster<StackChanged> {
+    FtParser &parser;
+    BroadcastStackChanged(FtParser &p) : parser(p) {}
+    void operator () (unsigned n) const {
+      broadcast(FtParser::StackChanged(n));
+    }
+  };
+
+  BroadcastStackChanged stackChanged;
+  //DcRef<rule_stack_dc> ruleControl;
+  //tsd *itemStack;
+
+  int testingKeyword;
+
+  void track(void);
+  void dispatchReductionToken();
+
+  void shiftTerminal();
+  void shiftTerminalAndAccept(void);
+  void shiftTerminalAndReduce();
+  void reduce(void);
+  void skip(void);
+  void shiftNull(void);
+  void error();
+  void accept();
+
+  int shiftNonterminalAndReduce();
+  int shiftNonterminal();
+  int shiftNonterminalAndAccept();
+
+  static void (FtParser::*terminalAction[11])();
+  static int  (FtParser::*nonterminalAction[4])();
+
+  Token keyToken(void);
+  void getToken();
+  unsigned inspectToken();
+  void completeReduction(int reductionToken);
+  void completeReduction();
+  int  validToken(unsigned, unsigned);
+  int  validSelection(unsigned, unsigned);
+  void requestSelection(int actionParameter);
+
+public:
+  FtParser &parseTo(unsigned char *target);
+  FtParser &parseTo(cint *target);
+  FtParser &parse(const char *fragment);
+  FtParser &prime(const char *fragment);
+  FtParser &parse();
+  void parseAction();
+  void stepToken(unsigned);
+  void parseToken(unsigned);
+
+  FtParser &step();
+  FtParser &step(char *fragment);
+  FtParser &reset();
+  cint location() { return cint(state.charPos, state.line); }
+  cint displayLocation() { return cint(state.column, state.line); }
+
+  FtParser &ignoreKeyword(int k) {
+    testingKeyword = k;
+    return *this;
+  }
+
+  tsd *x1x_new();
+
+  FtParser(AgString t);
+  FtParser();
+  FtParser(tsd *initialStack_);
+  ~FtParser();
+};
+
+
+#endif /* FTPAR_H */