home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 488.lha / Bool_Parser / Boolean.c < prev    next >
C/C++ Source or Header  |  1991-03-05  |  4KB  |  226 lines

  1. #include <stdlib.h>
  2. #include <ctype.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. #define DELIMITER       1
  8. #define VARIABLE        2
  9. #define INTEGER_LITERAL 3
  10. #define TRUE            1
  11. #define FALSE           0
  12.  
  13. char Current_Token[80],*Expression;
  14. int Token_Type;
  15.  
  16. void Eval_1(int *Answer), Eval_2(int *Answer), Eval_3(int *Answer);
  17. void Eval_4(int *Answer), Eval_5(int *Answer), Eval_6(int *Answer);
  18. void ParseError(int Error);
  19. int Get_Token(void);
  20. int Equal(char *S1,char *S2);
  21.  
  22.  
  23. main (argc,argv)
  24.  
  25. int argc;
  26. char **argv;
  27.  
  28. {
  29.    int i,answer;
  30.  
  31.    for(i=2;i<=argc;i++)
  32.    {
  33.       Expression = argv[i-1];
  34.       Eval_1(&answer);
  35.       printf("\n%s =  %d\n",argv[i-1],answer);
  36.    }
  37. }
  38.  
  39. int Equal(S1,S2)
  40.  
  41. char *S1,*S2;
  42.  
  43. {
  44.    return(!strcmp(S1,S2));
  45. }
  46.  
  47. void Eval_1(Answer)
  48.  
  49. int *Answer;
  50.  
  51. {
  52.    if (Get_Token()) Eval_2(Answer);
  53.    else ParseError(2);
  54. }
  55.  
  56. /* Token In Current_Token, Exp Ptr to next item */
  57.  
  58. void Eval_2(Answer)
  59.  
  60. int *Answer;
  61.  
  62. {
  63.    int Temp,OldAnswer;
  64.    char Op[80],*OldPosition;
  65.  
  66.    Eval_3(Answer);
  67.  
  68.    OldAnswer = *Answer;
  69.    OldPosition = Expression;
  70.  
  71.    do
  72.    {  if (Get_Token())
  73.       {
  74.          strcpy(Op,Current_Token);
  75.          if (Equal(Op,"|"))
  76.          {
  77.         if (Get_Token())
  78.         {
  79.            Eval_3(&Temp);
  80.                printf("Doing: %d || %d\n",*Answer,Temp);
  81.            OldAnswer = *Answer = Temp || *Answer;
  82.            OldPosition = Expression;
  83.         }
  84.          }
  85.          else
  86.          {
  87.             *Answer = OldAnswer;
  88.             Expression = OldPosition;
  89.          }
  90.       }
  91.       else Op[0] = '\0';
  92.    }
  93.    while (Equal(Op,"|") && *Expression);
  94. }
  95.  
  96. void Eval_3(Answer)
  97.  
  98. int *Answer;
  99.  
  100. {
  101.    int Temp,OldAnswer;
  102.    char Op[80],*OldPosition;
  103.  
  104.    Eval_4(Answer);
  105.  
  106.    OldAnswer = *Answer;
  107.    OldPosition = Expression;
  108.  
  109.    do
  110.    {
  111.       if (Get_Token())
  112.       {
  113.          strcpy(Op,Current_Token);
  114.          if (Equal(Op,"&"))
  115.          {
  116.             if (Get_Token())
  117.         {
  118.            Eval_4(&Temp);
  119.                printf("Doing: %d && %d\n",*Answer,Temp);
  120.            OldAnswer = *Answer = Temp && *Answer;
  121.            OldPosition = Expression;
  122.         }
  123.          }
  124.          else
  125.          {
  126.             Expression = OldPosition;
  127.             *Answer = OldAnswer;
  128.          }
  129.       }
  130.       else Op[0] = '\0';
  131.    }
  132.    while (Equal(Op,"&") && *Expression);
  133. }
  134.  
  135. void Eval_4(Answer)
  136.  
  137. int *Answer;
  138.  
  139. {
  140.    if (Equal(Current_Token,"-"))
  141.    {
  142.       if (Get_Token())
  143.       {
  144.      Eval_5(Answer);
  145.      if (*Answer == 0) *Answer = 1;
  146.      else *Answer = 0;
  147.       }
  148.       else ParseError(3);
  149.    }
  150.    else Eval_5(Answer);
  151. }
  152.  
  153. void Eval_5(Answer)
  154.  
  155. int *Answer;
  156.  
  157. {
  158.    if (Equal(Current_Token,"("))
  159.    {
  160.       Get_Token();
  161.       Eval_2(Answer);
  162.       if (!Equal(Current_Token,")")) ParseError(1);
  163.       printf("The Current Token: %s",Current_Token);
  164.       Get_Token();
  165.    }
  166.    else Eval_6(Answer);
  167. }
  168.  
  169. void Eval_6(Answer)
  170.  
  171. int *Answer;
  172.  
  173. {
  174.    if (Token_Type == INTEGER_LITERAL) *Answer = atoi(Current_Token);
  175. }
  176.  
  177. int Get_Token()
  178.  
  179. {
  180.  
  181.    char *Temp;
  182.  
  183.    Temp = Current_Token;
  184.  
  185.    if (*Expression)
  186.    {
  187.       if (isalpha(*Expression))
  188.       {
  189.      Token_Type = VARIABLE;
  190.      while(isalpha(*Expression)) *Temp++ = *Expression++;
  191.       }
  192.       else if (isdigit(*Expression))
  193.       {
  194.          Token_Type = INTEGER_LITERAL;
  195.          while(isdigit(*Expression)) *Temp++ = *Expression++;
  196.       }
  197.       else if (strchr("&|-()",*Expression))
  198.       {
  199.          *Temp++ = *Expression++;
  200.      Token_Type = DELIMITER;
  201.       }
  202.       else
  203.       {
  204.          return(0);
  205.       }
  206.  
  207.       *Temp = '\0';
  208.       return(1);
  209.  
  210.    }
  211.    return(0);
  212. }
  213.  
  214. void ParseError(int Error)
  215. {
  216.    static char *e[] = {
  217.              "Syntax Error",
  218.              "Unbalanced Paranthesis",
  219.              "No Expression Present"
  220.              "No Operand For Unary Minus"
  221.              "Incomplete Expression"
  222.              "Invalid Argument Type"
  223.               };
  224.    printf("Error: %s",e[Error]);
  225. }
  226.