Antlr Lexer 语法规则

Antlr Lexer Grammar rules

我正在尝试编写 antlr 词法分析器语法规则来验证电子邮件地址我已经得到了大部分工作但是我无法验证字符“。”不会连续出现。例如,我的代码通过了示例 localpart..domainpart@xyz.com ,它不应该通过。 我尝试了几种正则表达式,但似乎没有什么效果很好。有人可以在这里帮助我吗,我刚刚开始学习这个,所以我不太了解。这是我到目前为止所拥有的。

fragment LOCALCHARS_first_last : [a-zA-Z0-9-_~!$&'()*+,;=:]; //local part must not include character '.' 
fragment LOCALCHARS : [a-zA-Z0-9-_~!$&'.()*+,;=:]+;
fragment LOCALPART:  LOCALCHARS_first_last LOCALCHARS LOCALCHARS_first_last; //'.' cannot be first or last character
fragment DOMAINPART: [a-zA-Z0-9-.]+;
fragment EMAIL: LOCALPART '@' DOMAINPART;

CHECKEMAIL: (EMAIL) {
   System.out.println("valid email: "+getText());
};

说明

当您定义片段 fragment EXAMPLE : [a-z.]+ 时,您可以匹配它的字符串,例如:abca.b.c,也可以匹配重复的字符串,例如:aaa....

解决方案

您需要将点 . 视为分隔符,它将电子邮件的本地 and/or 域子部分分开。

fragment LOCAL_SUBPART : [a-zA-Z0-9-_~!$&\'()*+,;=:]+;
fragment DOMAIN_SUBPART : [a-zA-Z0-9-]+;

EMAIL: LOCAL_SUBPART ('.' LOCAL_SUBPART)* '@' DOMAIN_SUBPART ('.' DOMAIN_SUBPART)*;