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 >
Wrap
C/C++ Source or Header
|
1991-03-05
|
4KB
|
226 lines
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define DELIMITER 1
#define VARIABLE 2
#define INTEGER_LITERAL 3
#define TRUE 1
#define FALSE 0
char Current_Token[80],*Expression;
int Token_Type;
void Eval_1(int *Answer), Eval_2(int *Answer), Eval_3(int *Answer);
void Eval_4(int *Answer), Eval_5(int *Answer), Eval_6(int *Answer);
void ParseError(int Error);
int Get_Token(void);
int Equal(char *S1,char *S2);
main (argc,argv)
int argc;
char **argv;
{
int i,answer;
for(i=2;i<=argc;i++)
{
Expression = argv[i-1];
Eval_1(&answer);
printf("\n%s = %d\n",argv[i-1],answer);
}
}
int Equal(S1,S2)
char *S1,*S2;
{
return(!strcmp(S1,S2));
}
void Eval_1(Answer)
int *Answer;
{
if (Get_Token()) Eval_2(Answer);
else ParseError(2);
}
/* Token In Current_Token, Exp Ptr to next item */
void Eval_2(Answer)
int *Answer;
{
int Temp,OldAnswer;
char Op[80],*OldPosition;
Eval_3(Answer);
OldAnswer = *Answer;
OldPosition = Expression;
do
{ if (Get_Token())
{
strcpy(Op,Current_Token);
if (Equal(Op,"|"))
{
if (Get_Token())
{
Eval_3(&Temp);
printf("Doing: %d || %d\n",*Answer,Temp);
OldAnswer = *Answer = Temp || *Answer;
OldPosition = Expression;
}
}
else
{
*Answer = OldAnswer;
Expression = OldPosition;
}
}
else Op[0] = '\0';
}
while (Equal(Op,"|") && *Expression);
}
void Eval_3(Answer)
int *Answer;
{
int Temp,OldAnswer;
char Op[80],*OldPosition;
Eval_4(Answer);
OldAnswer = *Answer;
OldPosition = Expression;
do
{
if (Get_Token())
{
strcpy(Op,Current_Token);
if (Equal(Op,"&"))
{
if (Get_Token())
{
Eval_4(&Temp);
printf("Doing: %d && %d\n",*Answer,Temp);
OldAnswer = *Answer = Temp && *Answer;
OldPosition = Expression;
}
}
else
{
Expression = OldPosition;
*Answer = OldAnswer;
}
}
else Op[0] = '\0';
}
while (Equal(Op,"&") && *Expression);
}
void Eval_4(Answer)
int *Answer;
{
if (Equal(Current_Token,"-"))
{
if (Get_Token())
{
Eval_5(Answer);
if (*Answer == 0) *Answer = 1;
else *Answer = 0;
}
else ParseError(3);
}
else Eval_5(Answer);
}
void Eval_5(Answer)
int *Answer;
{
if (Equal(Current_Token,"("))
{
Get_Token();
Eval_2(Answer);
if (!Equal(Current_Token,")")) ParseError(1);
printf("The Current Token: %s",Current_Token);
Get_Token();
}
else Eval_6(Answer);
}
void Eval_6(Answer)
int *Answer;
{
if (Token_Type == INTEGER_LITERAL) *Answer = atoi(Current_Token);
}
int Get_Token()
{
char *Temp;
Temp = Current_Token;
if (*Expression)
{
if (isalpha(*Expression))
{
Token_Type = VARIABLE;
while(isalpha(*Expression)) *Temp++ = *Expression++;
}
else if (isdigit(*Expression))
{
Token_Type = INTEGER_LITERAL;
while(isdigit(*Expression)) *Temp++ = *Expression++;
}
else if (strchr("&|-()",*Expression))
{
*Temp++ = *Expression++;
Token_Type = DELIMITER;
}
else
{
return(0);
}
*Temp = '\0';
return(1);
}
return(0);
}
void ParseError(int Error)
{
static char *e[] = {
"Syntax Error",
"Unbalanced Paranthesis",
"No Expression Present"
"No Operand For Unary Minus"
"Incomplete Expression"
"Invalid Argument Type"
};
printf("Error: %s",e[Error]);
}