Jan 28, 2016 23:51
DIGIT_CHARS = (48..57)+;
TAG_CHARS = (33 | 35..36 | 38..39 | 44..91 | 93..122 | 124..126)+;
ATOM_CHARS = (33 | 35..36 | 38..39 | 42 | 44..61 | 63..90 | 92 | 94..122 | 124..126)+;
SP = ' ';
CR = '\r';
LF = '\n';
CRLF = (CR ? LF);
BRACKET = ('(' | ')' | '[' | ']' | '<' | '>') @BRACKETS;
WSP = (SP | BRACKET) +;
TAG = TAG_CHARS >TAG_START @PUSH_TAG_DATA %TAG_END;
ATOM = (ATOM_CHARS+) >ATOM_START @PUSH_DATA %ATOM_END;
QUOTED_CHAR = 1..9 | 11..12 | 14..33 | 35..91 | 93..127;
DQUOTE = 92;
QUOTED_SPECIALS = 34 | 92;
STRING_CHARS = QUOTED_CHAR | (DQUOTE QUOTED_SPECIALS);
STRING = '"' >STRING_START STRING_CHARS** @STRING_CHAR '"' %STRING_END;
LITERAL = '{' DIGIT_CHARS >LITERAL_START @LITERAL_DATA '+'? @LITERAL_PLUS_END '}' CRLF @LITERAL_END;
TERM = ATOM | STRING | LITERAL;
TERMS = (TERM (WSP TERM)*);
CMD = (65..90 | 97..122)+;
COMMAND = (("UID"i %CMD_UID SP)? CMD);
COMMANDS = TAG WSP+ COMMAND ( CRLF | (WSP+ TERMS WSP* CRLF) ) @CRLF_END;
main := COMMANDS $!SYNTAX_ERROR;
рабочее,
imap