|
#include <stdio.h> #include <ctype.h> #include <string.h> #include "demo.h"
char token[20];
int lookup(char *token) { for (int i = 0; i < 11; i++) { if (strcmp(token, KEY_WORDS[i]) == 0) { return i+1; } }
return 0; }
char getletter(FILE *fp) { return tolower(fgetc(fp)); }
void out(FILE *fp, int c, char *value) { fprintf(fp, "%d,%s/n", c, value); }
void report_error(FILE *fp, char ch) { fprintf(fp, "There must be some error./n"); fprintf(fp, "%c.../n", ch); fprintf(fp, "^/n"); }
void scanner(FILE *infile, FILE *outfile) { char ch; int i, c; do { do { ch = getletter(infile); } while(isspace(ch)); if (isalpha(ch)) { token[0] = ch; ch = getletter(infile); i = 1; while (isalnum(ch)) { token[i] = ch; i++; ch = getletter(infile); } token[i] = '/0'; fseek(infile, -1, 1); c = lookup(token); if (c == 0) { out(outfile, ID, token); } else { out(outfile, c, " "); } } else { if (isdigit(ch)) { token[0] = ch; ch = getletter(infile); i = 1; while (isdigit(ch)) { token[i] = ch; i++; ch = getletter(infile); } token[i] = '/0'; fseek(infile, -1, 1); out(outfile, INT, token); } else { switch(ch) { case '<': { ch = getletter(infile); if (ch == '=') { out(outfile, LE, " "); } else if (ch == '>') { out(outfile, NE, " "); } else { fseek(infile, -1, 1); out(outfile, LT, " "); } break; } case '=': { out(outfile, EQ, " "); break; } case '>': { ch = getletter(infile); if (ch == '=') { out(outfile, GE, " "); } else { fseek(infile, -1, 1); out(outfile, GT, " "); } break; } case ':': { ch = getletter(infile); if (ch == '=') { out(outfile, FU, " "); } else { fseek(infile, -1, 1); out(outfile, MAO, " "); } break; } case '/': { ch = getletter(infile); if (ch == '*') { out(outfile, ZHU, " "); } else { fseek(infile, -1, 1); out(outfile, XIE, " "); } break; } case '+': { out(outfile, JIA, " "); break; } case '-': { out(outfile, JIAN, " "); break; } case '*': { out(outfile, CHEN, " "); break; } case ';': { out(outfile, FEN, " "); break; } case '(': { out(outfile, ZUO, " "); break; } case ')': { out(outfile, YOU, " "); break; } default: { if (ch != EOF) { report_error(outfile, ch); } break; } } } } } while(ch != EOF);
return; }
void main() { FILE *in, *out;
in = fopen("pascal.txt", "r"); out = fopen("result.txt", "w");
scanner(in, out); fprintf(out, "0,#");
fclose(in); fclose(out);
printf("Finished!/n"); }
|