diff examples/mpp/token.cpp @ 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/examples/mpp/token.cpp	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,110 @@
+/*
+ * AnaGram, a System for Syntax Directed Programming
+ * C Macro preprocessor
+ * Token handling module
+ *
+ * Copyright 1993 Parsifal Software. All Rights Reserved.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ */
+
+#include "token.h"
+
+
+// Constructor for token_accumulator
+
+token_accumulator::token_accumulator(int nc, int nx) {
+  cs = new token[nc];               // token storage
+  xs = new unsigned[nx];            // index storage (for levels)
+  csx = 0;                          // next free token
+  csmax = nc - 1;                   // leave room for termination eof
+  xsx = xsmax = nx;                 // pre-decrement, post-increment
+  xs[--xsx] = csx;                  // initial token string
+}
+
+
+// Destructor for token_accumulator
+
+token_accumulator::~token_accumulator() {
+  delete[] cs;
+  delete[] xs;
+}
+
+
+// Reset token_accumulator
+
+token_accumulator &reset(token_accumulator &t) {
+  t.csx = 0;
+  t.xsx = t.xsmax;
+  t.xs[--t.xsx] = t.csx;
+  return t;
+}
+
+// Push data on token_accumulator
+
+token_sink &token_accumulator::operator << (token *tp) {
+  while (tp->id != END_OF_FILE) *this << *tp++;
+  return *this;
+}
+
+
+// Pop data from token_accumulator
+
+token_accumulator &token_accumulator::operator >> (token &c) {
+  assert(csx > xs[xsx]);            // a token to pop
+  c = cs[--csx];                    // pop token
+  return *this;
+}
+
+
+// Access data in token_accumulator
+/*
+token &token_accumulator::operator [](unsigned i) {
+  assert(i < csx - xs[xsx]);        // index in bounds
+  return cs[csx - i - 1];           // identify token
+}
+*/
+
+// Concatenate token strings in token_accumulator
+
+token_accumulator &concat(token_accumulator &s) {
+  assert(s.xsx < s.xsmax - 1);        // at least two strings
+  s.xsx++;
+  return s;
+}
+
+
+// Make permanent copy of token string
+
+token *copy(token_accumulator &s) {
+  int n = s.csx - s.xs[s.xsx] + 1;
+  token *c = new token[n];
+  token null;
+  null.id = END_OF_FILE;
+  null.handle = 0;
+  s.cs[s.csx] = null;
+  memcpy(c, (token *) s, n*sizeof(token));
+  return c;
+}
+
+
+// Send token string to token translator
+
+token_sink &token_translator::operator << (token *tp) {
+  while (tp->id != END_OF_FILE) *this << *tp++;
+  return *this;
+}