Я реализую лексер для простого языка программирования в c, в основном что-то, что читает токены и идентифицирует их как символы, числа, зарезервированные слова и т. д. Я сделал эту часть и работаю, но у меня проблемы с предыдущим шагом он лексизирует ввод. А именно я должен сначала найти любые комментарии во входном программном коде и заменить символы комментариев (которые одинаковы в c) и все, что между ними, пробелом. Однако, когда я попытался сделать это, это выглядело очень странно. Я почти уверен, что это потому, что я давно не использовал c, и я, вероятно, запутался в том, как он обрабатывает память или что-то в этом роде, поэтому любая помощь будет оценена по достоинству.
Также я знаю, что в c есть встроенная функциональность токена, но мне не разрешено использовать ее здесь, если кто-нибудь предложит исправление, которое ее использует.
//function to remove comments from input code
void makeClean(char *clean)
{
int i = 0;
while (clean[i] != '\0' && i < 500)
{
if (clean[i] == '/' && clean[i + 1] == '*')
{
while ((!(clean[i] == '*' && clean[i + 1] == '/')) && i < 500)
{
clean[i] = ' ';
i++;
}
clean[i] = ' ';
clean[i + 1] = ' ';
i++;
}
i++;
}
}
//main
int main(int argc, char **argv)
{
char input[500];
//char *clean = input;
int i = 0;
char flag1[9];
char flag2[9];
char temp[500];
while (argv[1][i] != '\0')
{
input[i] = argv[1][i];
i++;
}
char *clean = input;
//getting possible flags
for (i = 0; i < 17; i++)
{
if (i < 8)
flag1[i] = input[i];
if (i > 8)
flag2[i - 9] = input[i];
}
flag1[9] = '\0';
flag2[9] = '\0';
//flag checks
if (strcmp(flag1,"--source") == 0 || strcmp(flag2,"--source") == 0)
printf("source code:\n------------\n%s\n\n",input);
if (strcmp(flag1,"--clean") == 0 || strcmp(flag2,"--clean") == 0)
{
makeClean(clean);
printf("source code without comments:\n-----------------------------\n%s\n\n",clean);
}
//outputting tokens and types
printf("tokens:\n-------\n\n");
lex(clean);
return 0;
}
cpp
, как это делает C…? - person BRPocock   schedule 18.11.2016i
и как выглядит ваш буфер, когда вы закрашиваете"x/*y*/z"
. Почти уверен, что вы «забегаете вперед». - person BRPocock   schedule 18.11.2016