Как я могу заставить мою программу Lexical Analyzer распечатывать больше, чем просто разделители? - PullRequest
0 голосов
/ 03 октября 2018

Я пишу лексический анализатор для чтения из файла и описания текста в виде идентификаторов, ключевых слов, разделителей или операторов.По какой-то причине я могу выводить только разделители, если только я не удалю или не закомментирую цикл while с оператором print для разделителей.Когда я удаляю это, программа распечатывает все остальное правильно, пропуская разделители.

  #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

int isKeyword(char buffer[]){
    char keywords[32][10] = {"auto","break","case","char","const","continue","default",
                            "do","double","Else","enum","Function","Float","for","goto",
                            "If","Integer","long","register","Return","short","signed",
                            "sizeof","static","struct","switch","typedef","union",
                            "DOWhile","void","Write","while"};
    int i, flag = 0;

    for(i = 0; i < 32; ++i){
        if(strcmp(keywords[i], buffer) == 0){
            flag = 1;
            break;
        }
    }

     int k, flag2 = 0;

    for (k = 0; k<32; ++k){
        if(strcmp(keywords[i], buffer) == 0){
        flag2 = 1;
            break;
        }
    }

    return flag;


    return flag2;
}

int main(){
    char ch, buffer2[15], operators[] = "+-*/%=";

    char ch2, buffer[15], seperators[] = "{}(),;";
    FILE *fp;

    int i,k,j=0;

    fp = fopen("input.txt","r");

    if(fp == NULL){
        printf("error while opening the file\n");
        exit(0);
    }

    while((ch = fgetc(fp)) != EOF){
           for(i = 0; i < 6; ++i){
               if(ch == operators[i])
                   printf("%c is operator\n", ch);

    while((ch2 = fgetc(fp)) != EOF){
      for(k = 0; k < 6; ++k){
           if(ch2 == seperators[k])
           printf("%c is seperator\n", ch2);
        }
           }

           if(isalnum(ch)){
               buffer[j++] = ch;
           }
           else if((ch == ' ' || ch == '\n') && (j != 0)){
                   buffer[j] = '\0';
                   j = 0;

                   if(isKeyword(buffer) == 1)
                       printf("%s is keyword\n", buffer);
                   else
                       printf("%s is indentifier\n", buffer);
           }

    }
 }   
    fclose(fp);

    return 0;
}

Кажется, проблема во втором цикле while, содержащем инструкции разделителя, но я не могу понять, какраспечатайте это вместе со всем остальным.

1 Ответ

0 голосов
/ 02 декабря 2018

Я думаю, что это может помочь. Нет причин создавать дополнительный символ ch или буфер при создании разделителей.Просто добавьте его в конец предыдущей строки.Я просто разделил его запятой. Это очистит ваш код и позволит вам сохранить разделители с остальным кодом цикла while.

#include <stdio.h>

#define KEY 32
#define BUFFER_SIZE 15

int isKeyword(char buffer[])
{
    char keywords[KEY][10] = { "auto","break","case","char","const","continue","default", "do","double","else","enum","extern","float","for","goto",
    "if","int","long","register","return","short","signed", "sizeof","static","struct","switch","typedef","union", "unsigned","void","volatile","while"};

    int i, flag = 0;

    for (i = 0; i < KEY; ++i)
    {
        if (strcmp(keywords[i], buffer) == 0)
        {
            flag = 1;
            break;
        }
    }
    return flag;
}

int main()
{
    char ch, buffer[BUFFER_SIZE], operators[] = "+-*/%=", separators[] = "(){}[]<>,";
    FILE *fp;
    int i, j = 0;
    fp = fopen("Text.txt", "r");

    while ((ch = fgetc(fp)) != EOF)
    {

        for (i = 0; i < 6; ++i)
        {
            if (ch == operators[i])
            {
                printf(" OPERATOR:     %c \n", ch);
            }
            else if (ch == separators[i])
                printf(" SEPARATOR:    %c \n", ch);
        }

        if (isalnum(ch))
        {
            buffer[j++] = ch;
        }
        else if ((ch == ' ' || ch == '\n') && (j != 0))
        {
            buffer[j] = '\0';
            j = 0;
            {
                if (isKeyword(buffer) == 1)
                    printf(" KEYWORD:      %s \n", buffer);
                else
                    printf(" IDENTIFIER:   %s \n", buffer);
            }
        }
    }

    fclose(fp);

    return 0;
}

enter image description here

...