parse.c
上传用户:lengbin
上传日期:2010-03-31
资源大小:121k
文件大小:5k
开发平台:

C/C++

  1. /*----------------------------------------------------------------------
  2.   File    : parse.h
  3.   Contents: parser utilities
  4.   Author  : Christian Borgelt
  5.   History : 12.08.2004 file created
  6. ----------------------------------------------------------------------*/
  7. #include <string.h>
  8. #include <assert.h>
  9. #include "parse.h"
  10. /*----------------------------------------------------------------------
  11.   Constants
  12. ----------------------------------------------------------------------*/
  13. #ifdef GERMAN                     /* deutsche Texte */
  14. static const char *errmsgs[] = {  /* Fehlermeldungen */
  15.   /* E_CHREXP  -16 */  ""%c" erwartet statt %s",
  16.   /* E_STREXP  -17 */  ""%s" erwartet statt %s",
  17.   /* E_NUMEXP  -18 */  "Zahl erwartet statt %s",
  18.   /* E_ILLNUM  -19 */  "ungültige Zahl %s",
  19.   /* E_ATTEXP  -20 */  "Attribut erwartet statt %s",
  20.   /* E_UNKATT  -21 */  "unbekanntes Attribut %s",
  21.   /* E_DUPATT  -22 */  "doppeltes Attribut %s",
  22.   /* E_MISATT  -23 */  "Attribut %s fehlt",
  23.   /* E_ILLATT  -24 */  "ungültiges Attribut %s",
  24.   /* E_ATTYPE  -25 */  "Attribut %s hat falschen Typ",
  25.   /* E_VALEXP  -26 */  "Attributwert erwartet statt %s",
  26.   /* E_UNKVAL  -27 */  "unbekannter Attributwert %s",
  27.   /* E_DUPVAL  -28 */  "doppelter Attributwert %s",
  28.   /* E_MISVAL  -29 */  "fehlender Attributwert %s",
  29.   /* E_CLSEXP  -30 */  "Klassenattribut erwartet statt %s",
  30.   /* E_UNKCLS  -31 */  "unbekannte Klasse %s",
  31.   /* E_DUPCLS  -32 */  "doppelte Klasse %s",
  32.   /* E_MISCLS  -33 */  "Klasse %s fehlt",
  33.   /* E_CLSTYPE -34 */  "Klassenattribut %s hat falschen Typ",
  34.   /* E_CLSCNT  -35 */  "Klassenattribut %s hat zu wenige Werte",
  35.   /* E_DOMAIN  -36 */  "ungültiger Wertebereich %s",
  36.   /* E_PAREXP  -37 */  "Parameter erwartet statt %s",
  37.   /* E_ILLOP   -38 */  "ungültiger Vergleichsoperator %s",
  38.   /* E_ILLMAT  -39 */  "ungültige Kovarianzmatrix",
  39.   /* E_DUPCDL  -40 */  "doppelte Kandidatenliste für Attribut %sn",
  40.   /* E_RANGE   -41 */  "ungültiger Kandidatenbereich",
  41.   /* E_ILLCDD  -42 */  "ungültiger Kandidat %s",
  42.   /* E_ILLINK  -43 */  "ungültiger Verweis",
  43.   /* E_LYRCNT  -44 */  "ungültige Anzahl Schichten",
  44.   /* E_UNITCNT -45 */  "ungültige Anzahl Einheiten",
  45. };
  46. #else                             /* English texts */
  47. static const char *errmsgs[] = {  /* error messages */
  48.   /* E_CHREXP  -16 */  ""%c" expected instead of %s",
  49.   /* E_STREXP  -17 */  ""%s" expected instead of %s",
  50.   /* E_NUMEXP  -18 */  "number expected instead of %s",
  51.   /* E_ILLNUM  -19 */  "illegal number %s",
  52.   /* E_ATTEXP  -20 */  "attribute expected instead of %s",
  53.   /* E_UNKATT  -21 */  "unknown attribute %s",
  54.   /* E_DUPATT  -22 */  "duplicate attribute %s",
  55.   /* E_MISATT  -23 */  "missing attribute %s",
  56.   /* E_ILLATT  -24 */  "illegal attribute %s",
  57.   /* E_ATTYPE  -25 */  "attribute %s has wrong type",
  58.   /* E_VALEXP  -26 */  "attribute value expected instead of %s",
  59.   /* E_UNKVAL  -27 */  "unknown attribute value %s",
  60.   /* E_DUPVAL  -28 */  "duplicate attribute value %s",
  61.   /* E_MISVAL  -29 */  "missing attribute value %s",
  62.   /* E_CLSEXP  -30 */  "class value expected instead of %s",
  63.   /* E_UNKCLS  -31 */  "unknown class value %s",
  64.   /* E_DUPCLS  -32 */  "duplicate class value %s",
  65.   /* E_MISCLS  -33 */  "missing class value %s",
  66.   /* E_CLSTYPE -34 */  "class attribute %s has wrong type",
  67.   /* E_CLSCNT  -35 */  "class attribute %s has too few values",
  68.   /* E_DOMAIN  -36 */  "illegal attribute domain %s",
  69.   /* E_PAREXP  -37 */  "parameter expected instead of %s",
  70.   /* E_ILLOP   -38 */  "illegal comparison operator %s",
  71.   /* E_ILLMAT  -39 */  "illegal covariance matrix",
  72.   /* E_DUPCDL  -40 */  "duplicate candidate list for attribute %sn",
  73.   /* E_RANGE   -41 */  "illegal candidate range",
  74.   /* E_ILLCDD  -42 */  "illegal candidate %s",
  75.   /* E_ILLINK  -43 */  "illegal link",
  76.   /* E_LYRCNT  -44 */  "illegal number of layers",
  77.   /* E_UNITCNT -45 */  "illegal number of units",
  78. };
  79. #endif
  80. #define MSGCNT  (int)(sizeof(errmsgs)/sizeof(const char*))
  81. /*----------------------------------------------------------------------
  82.   Functions
  83. ----------------------------------------------------------------------*/
  84. void pa_init (SCAN *scan)       /* --- initialize parsing */
  85. { sc_errmsgs(scan, errmsgs, MSGCNT); }
  86. /*--------------------------------------------------------------------*/
  87. int pa_error (SCAN *scan, int code, int c, const char *s)
  88. {                               /* --- report a parse error */
  89.   char src[256], dst[1024];     /* buffers for string formating */
  90.   assert(scan);                 /* check the function arguments */
  91.   if (((code == E_DUPATT) || (code == E_MISATT)
  92.   ||   (code == E_DUPVAL) || (code == E_MISVAL)
  93.   ||   (code == E_DUPCLS) || (code == E_MISCLS)
  94.   ||   (code == E_ILLCDD)) && s)
  95.     sc_format(dst, s,   1);     /* if "missing ..." error message, */
  96.   else {                        /* format the given name */
  97.     strncpy(src, sc_value(scan), 255); src[255] = '';
  98.     sc_format(dst, src, 1);     /* if normal error message, */
  99.   }                             /* copy and format the token value */
  100.   if      (code == E_CHREXP) return sc_error(scan, code, c, dst);
  101.   else if (code == E_STREXP) return sc_error(scan, code, s, dst);
  102.   else                       return sc_error(scan, code,    dst);
  103. }  /* _paerr() */               /* print an error message */