diff anagram/guisupport/profile.syn @ 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/guisupport/profile.syn	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,162 @@
+{
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
+ * Copyright 2006 David A. Holland. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * profile.syn - parse the "profile" (Windows registry entry / .AnaGram file)
+ */
+
+#include "port.h"
+
+#include "agcstack.h"
+#include "cint.h"
+#include "ctrlpanel.hpp"
+#include "dspar.hpp"
+#include "profile-defs.h"
+#include "version.h"
+
+//#define INCLUDE_LOGGING
+#include "log.h"
+}
+
+registry data $
+ -> registry entry?..., "endInitializationData"?, eof
+
+eof = 0
+
+sep = '/' + '-'
+name char = ~eof - '\n' - '\r' - '=' - '.'
+file name char = ~eof - '\n' -'\r'
+digit = '0-9'
+letter = 'a-z' + 'A-Z'
+byte = 0..255
+
+[
+  test file mask = "*.prf"
+  //pointer input
+  event driven
+  parser name = parseRegEntry
+  parser file name = "#.cpp"
+  line numbers path = "regent.syn"
+]
+
+(void) registry entry
+ -> qualified registry entry
+ -> pure registry entry
+
+(void) qualified registry entry
+ -> accepted qualifier, pure registry entry
+ -> unaccepted qualifier, file name char..., '\n'
+
+(void) pure registry entry
+ -> ag201 registry entry
+//-> ag240 registry entry  // none yet
+
+(void) ag201 registry entry
+ -> "Color:", name, '=', color pair:p, '\n' = 
+	ColorDialog::initColor(charStack.popString(), p);
+ -> "Font:", field id:id, '=',
+     font flags:f, integer:p, '.',
+     name, '\n'                             =
+	FontDialog::initFont(id, f,p, charStack.popString());
+ -> "Autobuild=", integer:i, '\n'           = controlPanel->autobuildFlag = i;
+ -> "ShowStatistics=", integer:i, '\n'      = controlPanel->showStatsFlag = i;
+ -> "ShowSyntax=", integer:i, '\n'          = controlPanel->showSyntaxFlag = i;
+ -> "StayOnTop=", integer:i, '\n'           = controlPanel->stayOnTopFlag = i;
+ -> "cpLoc=", point:p,'\n'                  = controlPanelLocation = p;
+ -> "sfRect=", rectangle:r,'\n'             = syntaxFileRect = r;
+ -> "Version=", integer:i,'\n'              = lastVersion = i;
+ -> "RecentFile:", file name,'\n'          =
+{
+  LOGSECTION("RecentFile");
+  LOGV(controlPanel->recentFiles.size());
+  //controlPanel->recentFiles << charStack.popString();
+  controlPanel->recentFiles.push(charStack.popString());
+  LOGV(controlPanel->recentFiles.size());
+}
+
+(void) accepted qualifier, unaccepted qualifier
+ -> '(', qual expr:t, ')' = { if (!t) CHANGE_REDUCTION(unaccepted_qualifier); }
+
+(int) qual expr
+ -> integer:v1                  = (INTVERSION == v1);
+ -> integer:v1, '-'             = (INTVERSION >= v1);
+ -> integer:v1, '-', integer:v2 = (INTVERSION >= v1 && INTVERSION <= v2);
+
+(int) font flags
+ ->                        = 0;
+ -> font flags:f, 'B'      = f|FontSpec::bold;
+ -> font flags:f, 'I'      = f|FontSpec::italic;
+ -> font flags:f, 'S'      = f|FontSpec::strikeout;
+ -> font flags:f, 'U'      = f|FontSpec::underscore;
+
+name
+ -> name char:c                  = charStack.discardData().push(c);
+ -> name, name char:c            = charStack.push(c);
+
+(int) field id
+ -> name                         = FontDialog::idField(charStack.popString());
+
+(int) integer
+ -> digit:d                      = d - '0';
+ -> integer:i, digit:d           = 10*i + d - '0';
+
+(int) signed integer
+ -> integer
+ -> '-', integer:i               = -i;
+
+(int) hex integer
+ -> hex digit:d                  = d;
+ -> hex integer:i, hex digit:d   = 16*i + d;
+
+(int) hex digit
+ -> digit:d                      = d-'0';
+ -> 'a-f' + 'A-F':d              = (d&7) + 9;
+
+(cint) color pair
+ -> '(', hex integer:f, ',', hex integer:g, ')'   = cint(f, g);
+
+(IPoint) point
+ -> '(', signed integer:f, ',', signed integer:g, ')'   = IPoint(f, g);
+
+(IRectangle) rectangle
+ -> '(', integer:a,',', integer:b,',', integer:c,',', integer:d, ')' =
+	IRectangle(a, b, c, d);
+
+
+file name
+ -> file name char:c                = charStack.discardData().push(c);
+ -> file name, file name char:c     = charStack.push(c);
+
+{
+
+  int lastVersion = 200;
+
+  static AgCharStack charStack;
+
+#ifndef SYNTAX_ERROR
+#define SYNTAX_ERROR {\
+  char buf[500];\
+  sprintf(buf,"%s, line %d, column %d\n", \
+  (PCB).error_message, (PCB).line, (PCB).column);\
+  LOGV(buf);\
+}
+#endif
+
+  int initializeFrom(const char *pointer) {
+    LOGSECTION("initializeFrom");
+
+    if (pointer == 0) {
+      return 1;
+    }
+    init_parseRegEntry();
+    do {
+      PCB.input_code = (unsigned char) *pointer;
+      parseRegEntry();
+    }
+    while (*pointer++ && PCB.exit_flag == AG_RUNNING_CODE);
+    return PCB.exit_flag != AG_SUCCESS_CODE;
+  }
+}