gpt4 book ai didi

c - 如何让我的词法分析器程序打印出的不仅仅是分隔符?

转载 作者:行者123 更新时间:2023-11-30 16:27:52 26 4
gpt4 key购买 nike

我正在编写一个词法分析器来从文件中读取并将文本描述为标识符、关键字、分隔符或运算符。由于某种原因,我只能输出分隔符,除非我使用分隔符的 print 语句删除或注释掉 while 循环。当我删除它时,程序会正确打印出其他所有内容,跳过分隔符。

  #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 循环,但我似乎无法弄清楚如何将其与其他所有内容一起打印。

最佳答案

我认为这可能会有所帮助。在创建分隔符时,没有理由创建额外的 char 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

关于c - 如何让我的词法分析器程序打印出的不仅仅是分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52618517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com