2014-01-28 5 views
0

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

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

Пусть F (s) обозначает первый символ строки s , Таким образом, адрес электронной почты будет F (строка 1) F (строка 2) ........._ [email protected] Ниже перечислены некоторые имена и их соответствующие идентификаторы электронной почты в качестве примера

Sachin Рамеш Tendulkar [email protected] Рахул S Dravid [email protected]

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

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

Мой код здесь

#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]);