C
C This file is issued from the MODULEF library, but has been 
C subsequently modified
C
      SUBROUTINE FONSPE(MEXP,MSYM,MOPN,CFON,IFON,ICODE)
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C           S.P. FONSPE          (FONCTIONS INTERPRETEES)
C           -----------
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C BUT :
C     ANALYSER LA SPECIFICATION D UNE FONCTION
C
C PARAMETRES D ENTREE :
C     MEXP    : PILE DES EXPRESSIONS
C     MSYM    : TABLE DES SYMBOLES
C     MOPN    : PILE DES OPERANDES
C
C PARAMETRES DE SORTIE :
C     CFON    : IDENTIFICATEUR DE LA FONCTION
C     IFON    : INDICE DE LA FONC. (NECESSAIRE POUR L EXECUTER ENSUITE)
C     ICODE   : CODE DE RETOUR (VOIR LE S.P. FONERR)
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C PROGRAMMEUR : PATRICK LAUG ; INRIA (3) 954 90 20 POSTE 508
C ......................................................................
      INTEGER MEXP(*),MSYM(*),MOPN(*)
      CHARACTER*(*) CFON
      CHARACTER*256 CITEM
      COMMON /FONLC / LCI,LCR,LCL,LCC,LCD,LCOPN,LCOPT,LCSYM,LCEXP,LCIDN
      COMMON /FONLM / LMI,LMR,LML,LMC,LMD,LMOPN,LMOPT,LMSYM,LMEXP,LMIDN
      COMMON /FONNUM/ IDLIG,IFLIG,NITEMS,NBIDEN,IMPLIC
C
C DEBUT DE LA SPECIFICATION
      IFON  = LCEXP
      LCOPN = 0
  100 CALL FONSUI(CITEM,LITEM,NITEM)
C
C FIN OU <
      IF (NITEM.EQ.20 001 .OR. NITEM.EQ.42 006) THEN
         ICODE = -1
         RETURN
C
C MODE FORTRAN, INT, REAL, DBLE     (TYPE IMPLICITE DES CONSTANTES)
      ELSE IF (NITEM .EQ. 20 002) THEN
         CALL FONSUI(CITEM,LITEM,NITEM)
         IF (NITEM .EQ. 20 003) THEN
            IMPLIC = 0
         ELSE IF (NITEM .EQ. 41 003) THEN
            IMPLIC = 1
         ELSE IF (NITEM .EQ. 41 004) THEN
            IMPLIC = 2
         ELSE IF (NITEM .EQ. 41 005) THEN
            IMPLIC = 5
         ELSE
            ICODE = 6
            RETURN
         END IF
         CALL FONSUI(CITEM,LITEM,NITEM)
         IF (NITEM .NE. 40 001) THEN
            ICODE = 32
            RETURN
         END IF
         GOTO 100
C
C NOM DE LA FONCTION
      ELSE IF (NITEM .NE. 10 000) THEN
         ICODE = 19
         RETURN
      END IF
      CFON = CITEM(1:LITEM)
C
C PARENTHESE OUVRANTE OU EGAL
      CALL FONSUI(CITEM,LITEM,NITEM)
      IF (NITEM .EQ. 42 006) GOTO 900
      IF (NITEM .NE. 40 002) THEN
         ICODE = 20
         RETURN
      END IF
C
C PARENTHESE FERMANTE OU PREMIER PARAMETRE FORMEL
      CALL FONSUI(CITEM,LITEM,NITEM)
      IF (NITEM .EQ. 40 003) GOTO 500
      IF (NITEM .NE. 10 000) THEN
         ICODE = 21
         RETURN
      END IF
      NCSTE = 30 000 + (LMI-LMOPN) + 1
      CALL FONAIT(NCSTE + 2000 + LCOPN, MEXP, MOPN, ICODE)
      IF (ICODE.NE.0) RETURN
      CALL FONAID(CITEM(1:LITEM), I, ICODE)
      IF (ICODE.NE.0) RETURN
      MSYM(I) = 20 000 + LCEXP
C
C PARENTHESE FERMANTE OU VIRGULE
  300 CALL FONSUI(CITEM,LITEM,NITEM)
      IF (NITEM .EQ. 40 003) GOTO 500
      IF (NITEM .NE. 40 004) THEN
         ICODE = 23
         RETURN
      END IF
C
C PARAMETRE FORMEL
      CALL FONSUI(CITEM,LITEM,NITEM)
      IF (NITEM .NE. 10 000) THEN
         ICODE = 24
         RETURN
      END IF
      CALL FONAIT(NCSTE + 2000 + LCOPN, MEXP, MOPN, ICODE)
      IF (ICODE.NE.0) RETURN
      CALL FONAID(CITEM(1:LITEM), I, ICODE)
      IF (ICODE.NE.0) RETURN
      MSYM(I) = 20 000 + LCEXP
      GOTO 300
C
C EGAL
  500 CALL FONSUI(CITEM,LITEM,NITEM)
      IF (NITEM .NE. 42 006) THEN
         ICODE = 25
         RETURN
      END IF
  900 CALL FONAIT(50 001, MEXP, MOPN, ICODE)
      END
