Antlr Lexer语法规则

时间:2016-11-24 04:28:49

标签: antlr4 lexer

我正在尝试编写antlr lexer语法规则来验证电子邮件地址我已经完成了大部分工作但是我无法验证字符'。'没有连续出现。例如,我的代码传递了示例,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());
};

1 个答案:

答案 0 :(得分:0)

说明

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

解决方案

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

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

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