Создать адрес электронной почты из имен 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]);