home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 488.lha / Bool_Parser / Truth.c < prev    next >
C/C++ Source or Header  |  1991-03-05  |  5KB  |  294 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. struct Var_Type {   int Used,Value; } Var[26];
  16. struct Map_Type {   char Name; int Index; } Map[26];
  17.  
  18. void Eval_1(int *Answer), Eval_2(int *Answer), Eval_3(int *Answer);
  19. void Eval_4(int *Answer), Eval_5(int *Answer), Eval_6(int *Answer);
  20. void ParseError(int Error);
  21. int Get_Token(void);
  22. int Equal(char *S1,char *S2);
  23.  
  24. int Equal(S1,S2)
  25.  
  26. char *S1,*S2;
  27.  
  28. {
  29.    return(!strcmp(S1,S2));
  30. }
  31.  
  32. void Eval_1(Answer)
  33.  
  34. int *Answer;
  35.  
  36. {
  37.    if (Get_Token()) Eval_2(Answer);
  38.    else ParseError(2);
  39. }
  40.  
  41. /* Token In Current_Token, Exp Ptr to next item */
  42.  
  43. void Eval_2(Answer)
  44.  
  45. int *Answer;
  46.  
  47. {
  48.    int Temp,OldAnswer;
  49.    char Op[80],*OldPosition;
  50.  
  51.    Eval_3(Answer);
  52.  
  53.    OldAnswer = *Answer;
  54.    OldPosition = Expression;
  55.  
  56.    do
  57.    {  if (Get_Token())
  58.       {
  59.          strcpy(Op,Current_Token);
  60.          if (Equal(Op,"|"))
  61.          {
  62.         if (Get_Token())
  63.         {
  64.            Eval_3(&Temp);
  65.            OldAnswer = *Answer = Temp || *Answer;
  66.            OldPosition = Expression;
  67.         }
  68.          }
  69.          else
  70.          {
  71.             *Answer = OldAnswer;
  72.             Expression = OldPosition;
  73.          }
  74.       }
  75.       else Op[0] = '\0';
  76.    }
  77.    while (Equal(Op,"|") && *Expression);
  78. }
  79.  
  80. void Eval_3(Answer)
  81.  
  82. int *Answer;
  83.  
  84. {
  85.    int Temp,OldAnswer;
  86.    char Op[80],*OldPosition;
  87.  
  88.    Eval_4(Answer);
  89.  
  90.    OldAnswer = *Answer;
  91.    OldPosition = Expression;
  92.  
  93.    do
  94.    {
  95.       if (Get_Token())
  96.       {
  97.          strcpy(Op,Current_Token);
  98.          if (Equal(Op,"&"))
  99.          {
  100.             if (Get_Token())
  101.         {
  102.            Eval_4(&Temp);
  103.            OldAnswer = *Answer = Temp && *Answer;
  104.            OldPosition = Expression;
  105.         }
  106.          }
  107.          else
  108.          {
  109.             Expression = OldPosition;
  110.             *Answer = OldAnswer;
  111.          }
  112.       }
  113.       else Op[0] = '\0';
  114.    }
  115.    while (Equal(Op,"&") && *Expression);
  116. }
  117.  
  118. void Eval_4(Answer)
  119.  
  120. int *Answer;
  121.  
  122. {
  123.    if (Equal(Current_Token,"-"))
  124.    {
  125.       if (Get_Token())
  126.       {
  127.      Eval_5(Answer);
  128.      if (*Answer == 0) *Answer = 1;
  129.      else *Answer = 0;
  130.       }
  131.       else ParseError(3);
  132.    }
  133.    else Eval_5(Answer);
  134. }
  135.  
  136. void Eval_5(Answer)
  137.  
  138. int *Answer;
  139.  
  140. {
  141.    if (Equal(Current_Token,"("))
  142.    {
  143.       Get_Token();
  144.       Eval_2(Answer);
  145.       if (!Equal(Current_Token,")")) ParseError(1);
  146.       Get_Token();
  147.    }
  148.    else Eval_6(Answer);
  149. }
  150.  
  151. void Eval_6(Answer)
  152.  
  153. int *Answer;
  154.  
  155. {
  156.    if (Token_Type == INTEGER_LITERAL) *Answer = atoi(Current_Token);
  157.    else if (Token_Type == VARIABLE) *Answer = Var[Current_Token[0] - 'A'].Value;
  158. }
  159.  
  160. int Get_Token()
  161.  
  162. {
  163.  
  164.    char *Temp;
  165.  
  166.    Temp = Current_Token;
  167.  
  168.    if (*Expression)
  169.    {
  170.       if (isalpha(*Expression))
  171.       {
  172.      Token_Type = VARIABLE;
  173.      while(isalpha(*Expression)) *Temp++ = *Expression++;
  174.       }
  175.       else if (isdigit(*Expression))
  176.       {
  177.          Token_Type = INTEGER_LITERAL;
  178.          while(isdigit(*Expression)) *Temp++ = *Expression++;
  179.       }
  180.       else if (strchr("&|-()",*Expression))
  181.       {
  182.          *Temp++ = *Expression++;
  183.      Token_Type = DELIMITER;
  184.       }
  185.       else
  186.       {
  187.          return(0);
  188.       }
  189.  
  190.       *Temp = '\0';
  191.       return(1);
  192.  
  193.    }
  194.    return(0);
  195. }
  196.  
  197. void ParseError(int Error)
  198. {
  199.    static char *e[] = {
  200.              "Syntax Error",
  201.              "Unbalanced Paranthesis",
  202.              "No Expression Present"
  203.              "No Operand For Unary Minus"
  204.              "Incomplete Expression"
  205.              "Invalid Argument Type"
  206.               };
  207.    printf("Error: %s",e[Error]);
  208. }
  209.  
  210. void Init_Vars()
  211. {
  212.    int i;
  213.    for (i=0;i<26;Var[i++].Used = 0);
  214. }
  215.  
  216. int Get_Vars(Exp)
  217.  
  218. char *Exp;
  219.  
  220. {
  221.    int Sum,i;
  222.    Sum = 0;
  223.  
  224.    while (*Exp)
  225.    {
  226.       if (isalpha(*Exp))
  227.       {
  228.      if (islower(*Exp)) *Exp = toupper(*Exp);
  229.          Var[*Exp-'A'].Used = 1;
  230.       }
  231.       Exp++;
  232.    }
  233.    for (i=0;i<26;Sum+=Var[i++].Used);
  234.    return (Sum);
  235. }
  236.  
  237. void Map_Vars()
  238.  
  239. {
  240.    int M,i;
  241.  
  242.    M = 0;
  243.    for (i = 0; i<26; i++)
  244.    {
  245.       if (Var[i].Used)
  246.       {
  247.      Map[M].Name = (i + 'A');
  248.      Map[M++].Index = i;
  249.       }
  250.    }
  251. }
  252.  
  253. void Set_Vars(State,Num_Vars)
  254.  
  255. int State,Num_Vars;
  256.  
  257. {
  258.    int i,Mask;
  259.    for (i=0;i<Num_Vars;i++)
  260.    {
  261.       Mask = (1<<(Num_Vars-1))>>i;
  262.       if ((Mask|State) == State) Var[Map[i].Index].Value = 1;
  263.       else Var[Map[i].Index].Value = 0;
  264.    }
  265. }
  266.  
  267. main (argc,argv)
  268.  
  269. int argc;
  270. char **argv;
  271.  
  272. {
  273.    int i,j,k,l,answer,Num_Vars;
  274.  
  275.    for(i=2;i<=argc;i++)
  276.    {
  277.       Init_Vars();
  278.       Num_Vars = Get_Vars(argv[i-1]);
  279.       Map_Vars();
  280.       printf("\n\n");
  281.       for(k=0;k<Num_Vars;printf("%c",Map[k++].Name));
  282.       printf(" Value\n--------------------------------\n");
  283.       for (j=0;j<(1<<(Num_Vars));j++)
  284.       {
  285.          Expression = argv[i-1];
  286.      Set_Vars(j,Num_Vars);
  287.      for(l=0;l<Num_Vars;l++) printf("%d",Var[Map[l].Index].Value);
  288.          Eval_1(&answer);
  289.          printf(" %d\n",answer);
  290.       }
  291.    }
  292. }
  293.  
  294.