Создать адрес электронной почты из имен Compiler Design

Создание адресов электронной почты с именами форм

Вы дали файл, содержащий имена нескольких человек. Файл будет иметь ровно одно имя в каждой строке. Вам нужно создать адрес электронной почты, заканчивающийся @bitmesra.ac.in из этих имен. Правило создания адреса электронной почты определено ниже: Имя будет выражено в следующей форме: ............

Пусть F(s) обозначает первый символ строки s. Итак, идентификатор электронной почты будет F (строка 1)F (строка 2)........._ lastString@bitmesra.ac.in Некоторые имена и соответствующие им идентификаторы электронной почты перечислены ниже в качестве примера

Сачин Рамеш Тендулкар s_r_tendulkar@bitmesra.ac.in Рахул С Дравид r_s_dravid@bitmesra.ac.in

Вам нужно сгенерировать грамматику для этого.

примечание: там может быть несколько пробелов ч / б имен.

Мой код здесь

#include<cstdio>
#include<cstring>
#include<cctype>
int main()
{
char str1[100],str2[100];
char str3[] = "@bitmesra.ac.in";
while(gets(str1))
{
    int index,k=0;
    str2[k] = tolower(str1[0]);
    for(int i=1;i<strlen(str1);i++)
    {
        if(str1[i]==' ')
        {
            index = i;
            if(isalpha(str1[i+1]))
            {
                k++;
                str2[k] = '_';
                k++;
                str2[k] = tolower(str1[i+1]);
            }
        }
    }

    index= index + 2;
    for(int i=index;str1[i]!='\0';i++)
    {
        k++;
        str2[k] = tolower(str1[i]);
    }
    str2[++k] = '\0';
    strcat(str2,str3);
    printf("%s\n",str2);
}
return 0;
}

Как написать грамматику CFG Для этого.....

1 ответ

Как насчет чего-то вроде:

optnamelist:                  /* file can be empty */
    |    namelist             /* do nothing */

namelist: nameseq NL          /* process vector */
    |    namelist NL nameseq  /* process vector */

nameseq: name                 /* create vector and add element 1 */
    |    nameseq name         /* add element to vector */

Лексер должен позаботиться о пустых местах (есть их). Токен NL - это последовательность из одного или нескольких символов новой строки. Если вы добавите имена в конец вектора, вам придется обрабатывать их в обратном направлении. Ваш код подразумевает, что вы пишете это на языке C. Таким образом, вы можете использовать вектор фиксированного размера, например

#define MAX_NAMES   100   /* this will probably be enough :-) */
static int actpos;
static char *myVector[MAX_NAMES];

...
/* "create" vector */
memset(myVector, 0, MAX_NAMES * sizeof(char *));
actpos = 0;

...
/* add name to vector */
myVector[actpos] = strdup($1 /* or $2 */);
if (myVector[actpos) == NULL) ... /* out of memory */
actpos++;
if (actpos >= MAX_NAMES) ... /* name too long */

...
/* process vector */
for (i = actpos - 1; i > 0; --i) {
    /* add myVector[i][0] to e-mail address */
    free(myVector[i]);
}
/* add myVector[0] to e-mail address */
free(myVector[0]);
Другие вопросы по тегам