home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume26 / pico / part01 / expr.y < prev    next >
Text File  |  1991-12-14  |  4KB  |  202 lines

  1. %{
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <stdio.h>
  5. #include "pico.h"
  6.  
  7. static int yylex(void);
  8. static void yyerror(char *);
  9.  
  10. static lastnum;
  11. static char lastname[1024];
  12. %}
  13.  
  14. %union {
  15.     Tree *node;
  16.     int num;
  17. }
  18.  
  19. %term ANDAND OROR EQ NE LE GE LL RR ICON NAME
  20. %type <node> cmd expr ss or xor and eq rel shift
  21. %type <node> plus times factor coord
  22. %type <num> file
  23.  
  24. %%
  25.  
  26. pico    : /* empty */        { tree = NULL; YYACCEPT; }
  27.     | '\n'            { tree = NULL; YYACCEPT; }
  28.     | error '\n'        { tree = NULL; YYABORT; }
  29.     | cmd '\n'        { tree = $1; YYACCEPT; }
  30.  
  31. cmd    : expr
  32.     | 'w' NAME        { $$ = mkun(Write,lastname); }
  33.     | 'r' NAME        { $$ = mkun(Read,lastname); }
  34.     | 'f'            { $$ = mkempty(Files); }
  35.     | 'u'            { $$ = mkempty(Undo); }
  36.     | 'q'            { $$ = mkempty(Quit); }
  37.  
  38. expr    : ss
  39.     | ss '?' expr ':' expr    { $$ = mkCond($1,$3,$5); }
  40.  
  41. ss    : or
  42.     | ss ANDAND or        { $$ = mk(Andalso,$1,$3); }
  43.     | ss OROR or        { $$ = mk(Orelse,$1,$3); }
  44.  
  45. or    : xor
  46.     | or '|' xor        { $$ = mk(Or,$1,$3); }
  47.  
  48. xor    : and
  49.     | xor '^' and        { $$ = mk(Xor,$1,$3); }
  50.  
  51. and    : eq
  52.     | and '&' eq        { $$ = mk(And,$1,$3); }
  53.  
  54. eq    : rel
  55.     | eq EQ rel        { $$ = mk(Eq,$1,$3); }
  56.     | eq NE rel        { $$ = mk(Ne,$1,$3); }
  57.  
  58. rel    : shift
  59.     | rel '<' shift        { $$ = mk(Lt,$1,$3); }
  60.     | rel '>' shift        { $$ = mk(Gt,$1,$3); }
  61.     | rel LE shift        { $$ = mk(Ge,$1,$3); }
  62.     | rel GE shift        { $$ = mk(Le,$1,$3); }
  63.  
  64. shift    : plus
  65.     | shift LL plus        { $$ = mk(Ll,$1,$3); }
  66.     | shift RR plus        { $$ = mk(Rr,$1,$3); }
  67.  
  68.  
  69. plus    : times
  70.     | plus '+' times    { $$ = mk(Add,$1,$3); }
  71.     | plus '-' times    { $$ = mk(Sub,$1,$3); }
  72.  
  73. times    : factor
  74.     | times '*' factor    { $$ = mk(Mult,$1,$3); }
  75.     | times '/' factor    { $$ = mk(Div,$1,$3); }
  76.     | times '%' factor    { $$ = mk(Mod,$1,$3); }
  77.  
  78. factor    : 'x'            { $$ = mkempty(Xcoord); }
  79.     | 'y'            { $$ = mkempty(Ycoord); }
  80.     | ICON            { $$ = mkNum(lastnum); }
  81.     | '+' factor        { $$ = $2; }
  82.     | '-' factor        { $$ = mkun(Neg,$2); }
  83.     | '!' factor        { $$ = mkun(Bang,$2); }
  84.     | '~' factor        { $$ = mkun(Not,$2); }
  85.     | file coord        { $$ = mkCoord($1,$2); }
  86.     | '(' expr ')'        { $$ = $2; }
  87.  
  88. file    : NAME            { $$ = findfile(lastname); }
  89.     | '$' ICON        { $$ = lastnum + 1; }
  90.  
  91. coord    : /* nada */        { $$ = NULL; }
  92.     | '[' expr ',' expr ']' { $$ = mk(Add,$2,mk(Mult,$4,mkNum(DEF_Y))); }
  93. %%
  94.  
  95. static int yylex() {
  96.     char *l;
  97.     int c;
  98.     while ((c = getchar()) == ' ' || c == '\t')
  99.         ;
  100.     switch (c) {
  101.     case EOF:
  102.         saw_eof = 1;
  103.         return 0;
  104.     case '\n':
  105.     case '?': case ':':
  106.     case '-': case '+':
  107.     case '*': case '/': case '%':
  108.     case '~': case '^':
  109.     case '(': case ')':
  110.     case '[': case ']':
  111.     case ',': case '$':
  112.         return c;
  113.     case '&':
  114.         if ((c = getchar()) == '&')
  115.             return ANDAND;
  116.         ungetc(c,stdin);
  117.         return '&';
  118.     case '|':
  119.         if ((c = getchar()) == '|')
  120.             return OROR;
  121.         ungetc(c,stdin);
  122.         return '|';
  123.     case '>':
  124.         if ((c = getchar()) == '>')
  125.             return RR;
  126.         else if (c == '=')
  127.             return GE;
  128.         ungetc(c,stdin);
  129.         return '>';
  130.     case '<':
  131.         if ((c = getchar()) == '<')
  132.             return LL;
  133.         else if (c == '=')
  134.             return LE;
  135.         ungetc(c,stdin);
  136.         return '<';
  137.     case '=':
  138.         if ((c = getchar()) == '=')
  139.             return EQ;
  140.         ungetc(c,stdin);
  141.         return '=';
  142.     case '!':
  143.         if ((c = getchar()) == '=')
  144.             return NE;
  145.         ungetc(c,stdin);
  146.         return '!';
  147.     case '\"':
  148.         l = lastname;
  149.         while ((c = getchar()) != '\"' && c != '\n' && c != EOF)
  150.             *l++ = c;
  151.         if (c != '\"')
  152.             ungetc(c,stdin);
  153.         *l = '\0';
  154.         return NAME;
  155.     default:
  156.         if (isdigit(c)) {
  157.             lastnum = c - '0';
  158.             while (isdigit(c = getchar()))
  159.                 lastnum = (lastnum * 10) + (c - '0');
  160.             ungetc(c,stdin);
  161.             return ICON;
  162.         } else {
  163.             l = lastname;
  164.             while (1) {
  165.                 *l++ = c;
  166.                 switch (c = getchar()) {
  167.                 case EOF: case ' ': case '\t': case '\n':
  168.                 case '?': case ':': case '-': case '+':
  169.                 case '*': case '/': case '%':
  170.                 case '~': case '^': case '(': case ')':
  171.                 case '<': case '>': case '[': case ']':
  172.                 case '&': case '|': case '=': case '!':
  173.                 case '\"': case ',':
  174.                     ungetc(c,stdin);
  175.                     if (l == lastname + 1)
  176.                         switch (*lastname) {
  177.                         case 'x': case 'y': case 'u':
  178.                         case 'f': case 'q': case 'w':
  179.                         case 'r':
  180.                             return *lastname;
  181.                         case 'X':
  182.                             lastnum = DEF_X;
  183.                             return ICON;
  184.                         case 'Y':
  185.                             lastnum = DEF_Y;
  186.                             return ICON;
  187.                         case 'Z':
  188.                             lastnum = 255;
  189.                             return ICON;
  190.                         }
  191.                     *l = '\0';
  192.                     return NAME;
  193.                 }
  194.             }
  195.         }
  196.     }
  197. }
  198.  
  199. static void yyerror(char *err) {
  200.     fprintf(stderr, "%s\n", err);
  201. }
  202.