尝试使用Lex检查有效的电子邮件,而出现“未定义的定义”错误

时间:2019-12-14 10:30:57

标签: lex

我正在尝试使用Lex创建一个简单的程序,该程序检查给定的电子邮件地址是否有效。这是我实际上试图实现的方式:

声明部分

%{
#include <stdio.h>
#include <string>

int correct = 0;
string email;
void write_data(string email, int correct);

/* Alias section */
name      [a-zA-Z]
special    [-_%+-]
digit      [0-9]
domain     [a-z]\.[a-z]{2,5}
email      {name}+({digit} | {special})*@{domain}{1}
%}

规则部分

%%
{email}    {correct = 1;}
%%

程序部分

int main(int argc, char* argv[])
{
    if(argc == 2){
        yyin = fopen(argv[1], "r");
        email = yyin.getline();

        if(yyin == NULL){
            printf("Couldn't open %s file\n", argv[1]);
            exit(-1);
        }
    }

    else{
        yyin = stdin;
        email = yytext;
    }

    correct = 0;
    yylex();
    write_data(email, correct);

    return 0;
}

void write_data(string email, int correct)
{
    if(correct == 1)
        printf("Email %s is correct\n", correo);

    else   
        printf("Email %s is not correct\n", correo);
}

我正在尝试使用调用Lex工具

lex template.l

我收到以下错误:

  

template.h:40:未定义的定义{email}

我已经尝试了一段时间,但是我什至无法在其上运行Lex,所以我不知道有什么问题。

1 个答案:

答案 0 :(得分:-1)

我想对任何感兴趣的人弄清楚。您必须将别名放在第一个%{%} 部分之外。声明部分的结果如下:

%{
#include <stdio.h>
#include <string>

int correct = 0;
string email;
void write_data(string email, int correct);
%}

/* Alias section */
name      [a-zA-Z]
special    [-_%+-]
digit      [0-9]
domain     [a-z]\.[a-z]{2,5}
email      {name}+({digit} | {special})*@{domain}{1}