view anagram/guisupport/profile.syn @ 21:1c9dac05d040

Add lint-style FALLTHROUGH annotations to fallthrough cases. (in the parse engine and thus the output code) Document this, because the old output causes warnings with gcc10.
author David A. Holland
date Mon, 13 Jun 2022 00:04:38 -0400
parents 13d2b8934445
children
line wrap: on
line source

{
/*
 * 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;
  }
}