2014-01-28 24 views
0

创建电子邮件地址,电子邮件地址,表单名称创建一个从名称编译器设计

你给含有几个人的名称的文件。该文件每行只有一个名称。您需要从这些名称中创建以@ bitmesra.ac.in结尾的电子邮件地址。 创建电子邮件地址的规则定义如下:名称将以以下形式表示: ............

设F(s)表示字符串s的第一个字符。 因此,电子邮件ID将为F(字符串1)F(字符串2) ........._ [email protected] 以下列出了一些名称及其相应的电子邮件ID作为示例

萨钦拉梅什德家[email protected] 拉胡尔·德拉威小号[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写这个。所以你可以使用一个固定大小的Vector,例如

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