文件定义中的错误

时间:2011-03-12 20:18:48

标签: c

您好 这是我第一次阅读或写入文件 我在定义要读取的文件时遇到错误 帮助我

 /* global.h */

    #include <stdio.h>  /* include declarations for i/o routines */
    #include <ctype.h>  /* ... and for character test routines */
    #include <stdlib.h> /* ... and for some standard routines, such as exit */
    #include <string.h> /* ... and for string routines */

    #define BSIZE  128  /* buffer size */
    #define NONE   -1
    #define EOS    '\0'

    #define NUM    256
    #define DIV    257
    #define MOD    258
    #define ID     259
    #define DONE   260
    #define PLUS   243
    #define MINUS  255

     int tokenval = NONE;   /*  value of token attribute */  
     int lineno = 1;

    struct entry {  /*  form of symbol table entry  */
      char *lexptr; 
      int  token;    
    };

     struct entry symtable[];  /* symbol table  */

     void init();  /*  loads keywords into symtable  */
     void error(char* m);  /*  generates all error messages  */
     int lexan();  /*  lexical analyzer  */
     void parse();  /*  parses and translates expression list  */
     int insert(char *s, int tok);  /*  returns position of entry for s */
     int lookup(char *s);  /*  returns position of entry for s */
     void emit (int t, int tval);  /*  generates output  */
    /* init.c */

    struct entry keywords[] = {
      { "div", DIV },
      { "mod", MOD, },
      { "plus", PLUS },
      { "minus", MINUS},
      { 0,     0 }
    };

    void init()  /*  loads keywords into symtable  */
    {
      struct entry *p;
      for (p = keywords; p->token; p++)
        insert(p->lexptr, p->token);
    }
    /* symbol.c */


    #define STRMAX 999  /*  size of lexemes array  */
    #define SYMMAX 100  /*  size of symbol table */

    char lexemes[STRMAX];
    int  lastchar = - 1;  /*  last used position in lexemes   */
    struct entry symtable[SYMMAX];
    int lastentry = 0;    /*  last used position in symtable  */

    int lookup(char *s)         /*  returns position of entry for s */
    {
      int p;
      for (p = lastentry; p > 0; p = p - 1)
        if (strcmp(symtable[p].lexptr, s) == 0)
          return p;
      return 0;
    }

    int insert(char *s, int tok)    /*  returns position of entry for s */
    {
      int len;
      len = strlen(s);  /*  strlen computes length of s     */
      if (lastentry + 1 >= SYMMAX)
        error ("symbol table full");
      if (lastchar + len + 1 >= STRMAX)
        error ("lexemes array full");
      lastentry = lastentry + 1;
      symtable[lastentry].token = tok;
      symtable[lastentry].lexptr = &lexemes[lastchar + 1];
      lastchar = lastchar + len + 1;
      strcpy(symtable[lastentry].lexptr, s);
      return lastentry;
    }
    /* lexer.c */


    char lexbuf[BSIZE];


    int lexan ()  /*  lexical analyzer  */
    {

      int t;
      while(1) {
        t = fgetc (fs);
        if (t == ' ' || t == '\t')
          ;  /*  strip out white space  */
        else if (t == '\n')
          lineno = lineno + 1;
        else if (isdigit (t)) {  /*  t is a digit  */
          ungetc(t, fs);
          fscanf(fs,"%d", &tokenval);
          return NUM;
        }
        else if (isalpha(t)) {  /*  t is a letter */
          int p, b = 0;
          while (isalnum(t)) {  /* t is alphanumeric  */
            lexbuf [b] = t; 
            t = fgetchar (fs);
            b = b + 1;
            if (b >= BSIZE)
              error("compiler error");
          }
          lexbuf[b] = EOS;
          if (t != EOF)
            ungetc(t, fs);
          p = lookup (lexbuf);
          if (p == 0)
            p = insert (lexbuf, ID);
          tokenval = p;
          return symtable[p].token;
        }
        else if (t == EOF)
          return DONE;
        else {
          tokenval = NONE;
          return t;
        }
      }
    }

    /* emitter.c */
    void emit (int t, int tval)  /*  generates output  */
    {
      switch(t) {
      case '+' : case '-' : case '*' : case '/':
        fprintf(ft,"%c\n", t); break;
      case PLUS :
          fprintf(ft,"PLUS\n"); break;
      case MINUS :
          fprintf(ft,"MINUS\n"); break;

      case DIV:
        fprintf(ft,"DIV\n"); break; 
      case MOD:
        fprintf(ft,"MOD\n"); break;
      case NUM:
        fprintf(ft,"%d\n", tval); break;
      case ID:
        fprintf(ft,"%s\n", symtable[tval].lexptr); break; 
      default:     
        fprintf(ft,"token %d, tokenval %d\n", t, tval);
      }
    }
    /* parser.c -- without the optimizations */

    int lookahead;

    void match(int);
    void start(), list(), expr(), moreterms(), term(), morefactors(), factor();

    void parse()  /*  parses and translates expression list  */
    {
      lookahead = lexan();
      start();
    }

    void start ()
    {
      /* Just one production for start, so we don't need to check lookahead */
      list(); match(DONE);
    }

    void list()
    {
      if (lookahead == '(' || lookahead == ID || lookahead == NUM) {
        expr(); match(';'); list();
      }
      else {
        /* Empty */
      }
    }

    void expr ()
    {
      /* Just one production for expr, so we don't need to check lookahead */
      term(); moreterms();
    }

    void moreterms()
    {
      if (lookahead == '+') {
        match('+'); term(); emit('+', tokenval); moreterms();
      }
      else if (lookahead == '-') {
        match('-'); term(); emit('-', tokenval); moreterms();
      }
      else {
        /* Empty */
      }
    }

    void term ()
    {
      /* Just one production for term, so we don't need to check lookahead */
      factor(); morefactors();
    }

    void morefactors ()
    {
      if (lookahead == '*') {
        match('*'); factor(); emit('*', tokenval); morefactors();
      }
      else if (lookahead == '/') {
        match('/'); factor(); emit('/', tokenval); morefactors();
      }
      else if (lookahead == PLUS) {
        match(PLUS); factor(); emit(PLUS, tokenval); morefactors();
      }
else if (lookahead == MINUS) {
        match(MINUS); factor(); emit(MINUS, tokenval); morefactors();
      }
      else if (lookahead == DIV) {
        match(DIV); factor(); emit(DIV, tokenval); morefactors();
      }
      else if (lookahead == MOD) {
        match(MOD); factor(); emit(MOD, tokenval); morefactors();
      }
      else {
        /* Empty */
      }
    }

    void factor ()
    {
      if (lookahead == '(') {
        match('('); expr(); match(')');
      }
      else if (lookahead == ID) {
        int id_lexeme = tokenval;
        match(ID);
        emit(ID, id_lexeme);
      }
      else if (lookahead == NUM) {
        int num_value = tokenval;
        match(NUM);
        emit(NUM, num_value);
      }
      else
        error("syntax error in factor");
    }

    void match(int t)
    {
      if (lookahead == t)
        lookahead = lexan();
      else
        error ("syntax error in match");
    }
    /* error.c */

    void error(char* m)  /* generates all error messages  */
    {
      fprintf(stderr, "line %d: %s\n", lineno, m);
      exit(EXIT_FAILURE);  /*  unsuccessful termination  */
    }
    /* main.c */

    int main(void)
    {
        FILE *fs, *ft ;
        char ch ;
        fs = fopen ( "d:\\source.txt", "r" ) ;
            if ( fs == NULL )
                {    puts ( "Cannot open source file" ) ;
                exit(0 ) ;      
                }

            ft = fopen ( "d:\\out.txt","w" ) ; 
            if ( ft == NULL )        
                {               puts ( "Cannot open target file" ) ;
                  exit(0 ) ;       
                }       


      init();
      parse();
      fclose(ft);
      fclose(fs);
      exit(0);    /*  successful termination  */
    }

1 个答案:

答案 0 :(得分:0)

我可以通过在顶部添加此行来获取要编译的代码:

int tokenval = NONE;   /*  value of token attribute */  
int lineno = 1;
FILE *fs, *ft;         /* <--- ADDED */

我将其从main()删除了

int main(void)
{
    /* FILE *fs, *ft ; <-- REMOVED */
    char ch ;