home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / xdme_1.84_src.lha / XDME / Util / Var / Yacc.y < prev   
Encoding:
Text File  |  1994-12-22  |  4.0 KB  |  188 lines

  1.  
  2.  
  3.  
  4. %{
  5. /* Achtung, dieser Parser vergeudet speicher in rauhen megen ...*/
  6.     /* 25-09-94 * rewritten */
  7.     /* 30-09-94 * shortened */
  8.  
  9.  
  10.  
  11. /*
  12.     > BISON -y -d Yacc.y
  13.     > Dcc y.tab.c -mD -c
  14. */
  15.  
  16.  
  17. #include <assert.h>
  18. #include <string.h>
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <stdarg.h>
  22. #include "node.h"
  23.  
  24. #include "y.tab.h"
  25.  
  26. #ifdef __SASC
  27. #define alloca malloc
  28. #else
  29. #include <alloca.h>
  30. #endif
  31.  
  32. #define PTR void *
  33.  
  34.  
  35.  
  36. int yyerror (const char *x);
  37. int yyparse (void);
  38. int yylex   (void);
  39. static void __yy_bcopy(char *, char *, int);
  40.  
  41. int errors = 0;
  42. extern int   lineno;
  43. extern char *filename;
  44. #define errorout(text) fprintf (stderr, "`%s',%d: %s\n", filename, lineno, text, ++errors)
  45.  
  46. %}
  47.  
  48. /* signs */
  49. %token RBRA    /* %{ */
  50. %token EBRA    /* %[ */
  51. %token RKET    /* %} */
  52. %token EKET    /* %[ */
  53. %token ASS    /* =  */
  54. %token SEMI    /* ;  */
  55. %token ADD    /* += */
  56.  
  57. %token SBRA    /* }  */ /* added 04-11-94 */
  58. %token SKET    /* {  */
  59. %token SSBRA    /* {{ */
  60. %token SSKET    /* }} */
  61. %token KOMMA    /* ,  */
  62.  
  63. /* qualifier */
  64. %token PROJECT
  65. %token GLOBAL
  66. %token CONST
  67. %token HIDDEN
  68. %token INTERNAL
  69. %token GENERIC
  70. %token TEMPORARY
  71.  
  72. /* fixed names */
  73. %token TYPES
  74. %token NEEDED
  75. %token GENTYPE
  76. %token DEFAULT
  77. %token HELP
  78.  
  79. /* free text */
  80. %token LABEL
  81. %token VALUE
  82.  
  83. /* LEX - communcation */
  84. %token NEWFILE
  85. %token BLOCKSTART
  86.  
  87. %start parts_list
  88.  
  89. %%
  90.  
  91. parts_list : BLOCKSTART assignment_list parts_list
  92.        |
  93.        ;
  94.  
  95. assignment_list : /*  */
  96.         | base_ass assignment_list
  97.         ;
  98.  
  99. base_ass : type base_ass
  100.      |    assignment
  101.      ;
  102.  
  103. type : CONST        { NODE_access (CA_CONST);   } /* benutzer kann nur lesen */
  104.      | HIDDEN        { NODE_access (CA_HIDDEN);  } /* benutzer kann nur schreiben */
  105.      | INTERNAL     { NODE_access (CA_INTERNAL);} /* dem benutzer nicht zugaenglich */
  106.  
  107.      | GENERIC        { NODE_spc    (CS_GENERIC);   } /* muss erzeugt werden */
  108.      | GLOBAL        { NODE_spc    (CS_GLOBAL);    } /* globales object */
  109.      | PROJECT        { NODE_spc    (CS_PROJECT);   } /* kann bei jedem project variieren */
  110.      | TEMPORARY    { NODE_spc    (CS_TEMPORARY); } /* kann unzugaenglich sein */
  111.  
  112.      | GENTYPE        { NODE_type ((PTR)$1);      } /* generischer Typ */
  113.      ;
  114.  
  115. assignment : lval {NODE_PUSH((PTR)$1, 1);} ASS {NODE_CLEAR();} body { NODE_POP(); } /* Assignment - vorhandenen Inhalt loeschen */
  116.        | lval {NODE_PUSH((PTR)$1, 1);} ADD                 body { NODE_POP(); } /* Append  */
  117.        | lval {NODE_PUSH((PTR)$1, 1);} SEMI                     { NODE_POP(); } /* Just name it ... */
  118.        | SEMI
  119.     /* | error { errorout ("Fehlerhaftes Assignment"); } SEMI */
  120.        ;
  121.  
  122. body : RBRA  assignment_list  RKET
  123.      | SBRA  assignment_list  SKET
  124.      | SSBRA  VALUE         SSKET { NODE_TEXT((PTR)$2); }
  125.      | EBRA   VALUE          EKET { NODE_TEXT((PTR)$2); }
  126.      | lval   SEMI           { NODE_TEXT((PTR)$1); }
  127.      | VALUE   /* "%% ...\n" */    { NODE_TEXT((PTR)$1); }
  128.   /* | error  { errorout ("Fehlerhafte Rechte Seite"); } SEMI */
  129.      ;
  130.  
  131. lval : DEFAULT { $$ = 0;  }
  132.      | TYPES   { $$ = 1;  }
  133.      | NEEDED  { $$ = 2;  }
  134.      | LABEL   { $$ = $1; } /* string ist von LEX.l dupliziert worden! */
  135.      | HELP    { $$ = $1; } /* string ist von LEX.l dupliziert worden! */
  136.   /* | error { errorout ("Fehlerhafte Linke Seite"); } SEMI */
  137.      ;
  138.  
  139. %%
  140.  
  141.  
  142.  
  143.  
  144.  
  145. int yyerror (const char *x)
  146. {
  147.     extern int lineno;
  148.     extern void NODE_TREE(void *, void *);
  149.  
  150.     fprintf (stderr, "%s\n (file `%s', line %ld)\n", x, filename, lineno);
  151.     {
  152.     char *comment = NULL;
  153.     switch (yychar) {
  154. #define tk(x)    case x: comment =  #x; break;
  155. #define tkl(x,n) case x: comment =   n; break;
  156.     tk( EOF )
  157.     tkl( RBRA, "openbracket" )
  158.     tkl( EBRA, "openbracket" )
  159.     tkl( RKET, "closebracket" )
  160.     tkl( EKET, "closebracket" )
  161.     tkl( ASS,  "assignmentoperator" )
  162.     tkl( SEMI, "semicolon" )
  163.     tkl( ADD,  "addoperator" )
  164.     tk( PROJECT )
  165.     tk( GLOBAL )
  166.     tk( CONST )
  167.     tk( HIDDEN )
  168.     tk( INTERNAL )
  169.     tk( GENERIC )
  170.     tk( TEMPORARY )
  171.     tk( GENTYPE )
  172.     tk( TYPES )
  173.     tk( NEEDED )
  174.     tk( DEFAULT )
  175.     tk( LABEL )
  176.     tk( VALUE )
  177.     tk( NEWFILE )
  178.     tk( BLOCKSTART )
  179.     } /* switch */
  180.     if (comment)
  181.         printf ("probably unexpected %s %s\n", comment, (yychar == LABEL)? yylval: "");
  182.     }
  183.     NODE_TREE(NULL, NULL);
  184.     // exit (-1);
  185.     return 0;
  186. } /* yyerror */
  187.  
  188.