C Board  

Go Back   C Board > General Programming Boards > C Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 12-18-2006, 09:12 AM   #1
Registered User
 
Join Date: Sep 2006
Posts: 9
recursion error

I do not understand why I receive the following error when I try to compile the code below:

% gcc -o myProg eval.c
eval.c:30: warning: conflicting types for built-in function 'exp'
eval.c:62: error: conflicting types for 'expression'
eval.c:36: error: previous declaration of 'expression' was here

Thanks in advance.




Code:
/* This program uses a form of recursion known as a recursive chain to
   evaluate whether a given string is a valid expression.  The definition
   of a valid expression is as follows:

   a valid expression is either a term + term or a term alone
   a valid term is either a factor * factor or a factor alone
   a valid factor is either a single letter or an expression in parentheses

   It is in the definition of a valid factor that the recursion is introduced.
   The main function will call the function expression, which in turn will
   begin the recursive chain by calling exp.  The need for expression is
   so be able to check for the end of the line upon concluding that an
   expression is valid.

   This program does not evaluate the expression under consideration.  It
   only ascertains whether the expression is or is not valid as defined by
   the rules of the "grammar".  White space between characters in the string
   causes the evaluation to fail.

  */

#include <stdio.h>

#define TRUE 1                  /* boolean true */
#define FALSE 0                 /* boolean false */

int exp(char [], int *) ;       /* global prototypes for recursion */
int term(char [], int *) ;      /* is input string a term */
int factor(char [], int *) ;    /* is input string a factor */

int main(void)
{
   int expression(char [], int *);  /* start/end evaluation here */

   char str[80] ;               /* hold candidate expression string */

   printf("Enter a string to be checked for validity ");  /* prompt */
   printf("as an expression\n--> ") ;                     /* user for */
   fgets(str, 80, stdin) ;                                /* string */
   if (expression(str, 0 ))             /* if str is a valid expresion */
      printf("%s is a valid expression.\n", str);       /* print OK */
   else
      printf ("%s is not a valid expression.\n", str) ; /* else exp no good */
}                                                       /* end main */


/* --------------------------- EXPRESSION ----------------------------------
   INPUT: the expression string and an index position
   OUTPUT:
   RETURNS: TRUE if the string represents a valid expression; FALSE otherwise
   ASSUMPTIONS:
   DESCRIPTION:
   This function is called from main and in turn calls the recursive
   function to see is the string is a valid expression.  Upon returning
   from the recursive calls, if we are also at the end of the string,
   then the input string is a valid expression
   ------------------------------------------------------------------------- */
int expression(char str[], int pos)
{
   if (exp(str,&pos)) {         /* call to check if valid expression */
      pos++;                    /* move to next character */
      if (str[pos] == '\n')     /* if end of string, then */
         return(TRUE);          /* expression is valid */
      else return(FALSE);       /* else extra stuff at end of string */
   } else                       /* else invalid expression */
      return(FALSE);            /* return negative indicator */
}                               /* end function exp */


/* ----------------------------- EXP ----------------------------------------
   INPUT: the string containing the expression under consideration, and
          the current index position
   OUTPUT: the index position is shifted by this function to the end of the
           expression under evaluation.
   RETURNS: TRUE if the string represents a valid expression; FALSE otherwise
   ASSUMPTIONS:
   DESCRIPTION:  This function, first called by expression(), verifies that
   the input string is (or is not) a valid expression by following the rules
   as outlined in the documentation above.  A valid expression is either a
   term+term or a term alone.

   To evaluate whether this is a valid expression, check first for a term.
   If a valid term is found, move to the next index position.  If the
   next char is a '+', then another valid term must follow.  If the next
   char is not a '+', then move the index back one space and return to
   the caller with TRUE.

   This function is the first in the recursive chain, since a term is a
   factor * factor or a factor alone, and a factor can be an expression.
   ------------------------------------------------------------------------- */
int exp(char str[], int *pos)
{
   int flag;                    /* boolean flag for validity */

   if (term(str,pos)) {         /* if a term is found */
      flag = TRUE;              /* set marker to true */
      (*pos)++;                 /* examine next position */
      if (str[*pos] == '+') {   /* check for plus sign */
         (*pos)++;              /* if there, skip over it */
         flag = term(str,pos);  /* and check for another term */
      } else                    /* if no plus sign, */
         (*pos)--;              /* move position pointer back to first term */
   } else flag = FALSE;         /* else not a valid term */
   return flag;                 /* return flag to caller */
}                               /* end function exp1 */


/* ------------------------------- TERM ---------------------------------------
   INPUT: the string containing the expression under consideration, and
          the current index position
   OUTPUT: the index position is shifted by this function to the end of the
           term under evaluation.
   RETURNS: TRUE if the substring starting at index pos contains a valid term;
            FALSE otherwise
   ASSUMPTIONS:
   DESCRIPTION: Check if the input is a valid term, starting at index location
   'pos'.  The function stops when it has found a valid term or when it
   ascertains that the term is not valid.  A valid term is either a
   factor*factor or a factor alone.

   First check whether there is a valid factor.  If yes, check if the next
   char is a '*'.  If it is, then another valid factor must follow.  If
   it is not, move pos back one spot and return to the caller.

   This function is called from the function exp() as the second part of the
   recursive chain.
   -------------------------------------------------------------------------- */
int term(char str[], int *pos)
{
   int flag;                    /* boolean flag for validity */

   if (factor(str,pos)) {       /* if a factor is found */
      flag = TRUE;              /* set marker to true */
      (*pos)++;                 /* examine next position */
      if (str[*pos] == '*') {   /* if a * found */
         (*pos)++;              /* skip over it */
         flag = factor(str,pos);/* and check for another factor */
      } else                    /* else no * symbol, so point back to */
         (*pos)--;              /* previous factor */
   } else flag = FALSE;         /* else not a valid factor */
   return flag;                 /* return flag to caller */
}                               /* end function term */


/* --------------------------- FACTOR -----------------------------------------
   INPUT: the string containing the expression under consideration, and
          the current index position
   OUTPUT: the index position is shifted by this function to the end of the
           factor under evaluation.
   RETURNS: TRUE if the substring starting at index pos contains a valid
            factor; FALSE otherwise
   ASSUMPTIONS:
   DESCRIPTION: his function checks for a valid factor starting at the
   position pointed at by pos.  Note that a factor is either a letter alone
   or an expression enclosed in parentheses.  This last part of the
   definition of a valid factor is what makes the entire definition
   recursive.

   First check if the current substring is a single letter.  If yes,
   return true.  If not, the only other legal character is '('.  If
   found, then there must be a valid expression next, followed by a
   ')'.
   ------------------------------------------------------------------------- */
int factor(char str[], int *pos)
{
   int flag;                                    /* boolean flag for validity */

   if (str[*pos] >= 'A' && str[*pos] <= 'Z')    /* if a valid letter */
      return(TRUE);                             /* return positive flag */
   else if (str[*pos] == '(') {                 /* else if a ( char */
      (*pos)++;                                 /* skip over it */
      flag = exp(str,pos);                      /* and look for expression */
      (*pos)++;                                 /* move to next space */
      if (flag && str[*pos] == ')')             /* verify matching ) */
         return(TRUE);                          /* if ok, return flag */
      else return(FALSE);                       /* else non-matching () */
   } else
      return(FALSE);                            /* else non-factor */
}                                               /* end function factor */
cchallenged is offline   Reply With Quote
Old 12-18-2006, 09:15 AM   #2
CSharpener
 
vart's Avatar
 
Join Date: Oct 2006
Posts: 5,556
int expression(char [], int *);
int expression(char str[], int pos)

is not the same

exp there is standard function with such a name, I think - change the name of your function
__________________
If I have eight hours for cutting wood, I spend six sharpening my axe.
vart is offline   Reply With Quote
Old 12-18-2006, 09:15 AM   #3
The larch
 
Join Date: May 2006
Posts: 3,333
exp is a math.h library function. Try renaming your exp.
anon is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Getting an error with OpenGL: collect2: ld returned 1 exit status Lorgon Jortle C++ Programming 6 05-08-2009 08:18 PM
An error is driving me nuts! ulillillia C Programming 5 04-04-2009 09:15 PM
Making C DLL using MSVC++ 2005 chico1st C Programming 26 05-28-2008 01:17 PM
We Got _DEBUG Errors Tonto Windows Programming 5 12-22-2006 05:45 PM
Couple C questions :) Divx C Programming 5 01-28-2003 01:10 AM


All times are GMT -6. The time now is 12:02 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22