我正在尝试使用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,所以我不知道有什么问题。
答案 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}