从名称编译器设计创建电子邮件地址

时间:2014-01-28 09:14:44

标签: flex4 yacc lex context-free-grammar compiler-construction

创建电子邮件地址表单名称

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

设F(s)表示字符串s的第一个字符。 所以,电子邮件ID将是F(字符串1) F(字符串2) ........._ lastString@bitmesra.ac.in 下面列出了一些名称及其相应的电子邮件ID

Sachin Ramesh Tendulkar s_r_tendulkar@bitmesra.ac.in Rahul S Dravid r_s_dravid@bitmesra.ac.in

你需要为此生成一个语法。

注意:b / w名称可能有多个空格。

我的代码在这里

#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 个答案:

答案 0 :(得分: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]);