Mercurial > ~dholland > hg > ag > index.cgi
diff tests/agcl/parsifal/rfc822a.syn @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/agcl/parsifal/rfc822a.syn Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,697 @@ +/* + Transcription of RFC822 grammar to AnaGram Syntax + Transcription copyright (c) Parsifal Software, 1997. All Rights Reserved. + See the file COPYING for license and usage terms. + + Grammar taken from RFC 822 + + The rules as given in RFC 822 have been retained as comments. + In a few cases obvious errors or questionable syntax was observed. + These are noted in // comments +*/ + +{ +#define GET_CONTEXT CONTEXT = PCB.pointer +} +[ + pointer input + ~case sensitive + grammar token = message + context type = unsigned char * + eof token = CRLF + sticky {atom, word, {linear_space}..., number} +] + + + +{ + /************************************************************** + * Input function to the parsing engine. + * + * It takse a pointer to a string and a ponter to a Request Object + * that will be populated + ***************************************************************/ +/*INT rfc822_parser(char *buffer, CRfc822Req *Request) + { + PCB.pointer = (unsigned char *)buffer; + pRequest = Request; + rfc822parse(); + return PCB.exit_flag; + + }*/ +} + + + + +/*************************************************************************** +* address = mailbox ; one addressee +* / group ; named list +****************************************************************************/ + address + -> mailbox + -> group + + +/*************************************************************************** +* addr-spec = local-part "@" domain ; global address +****************************************************************************/ +addr_spec + -> local_part,'@',domain + + +/*************************************************************************** +* ALPHA = <any ASCII alphabetic character> +* ; (101-132, 65.- 90.) +* ; (141-172, 97.-122.) +****************************************************************************/ +ALPHA = 'a-z' + 'A-Z' + + +/*************************************************************************** +* atom = 1*<any CHAR except specials, SPACE and CTLs> +****************************************************************************/ +atom + -> ATOM_CHAR + -> atom, ATOM_CHAR + +ATOM_CHAR = CHAR - atom_specials + +atom_specials = SPACE + CTL + specials + +/*************************************************************************** +* authentic = "From" ":" mailbox ; Single author +* / ( "Sender" ":" mailbox ; Actual submittor +* "From" ":" 1#mailbox) ; Multiple authors +* ; or not sender +****************************************************************************/ +authentic + -> "From",':',mailbox + -> '(',"Sender",':',mailbox, SPACE,"From",':',multiple_mailboxes,')' + +multiple_mailboxes + -> mailbox + -> multiple_mailboxes, SPACE?, mailbox + + +/*************************************************************************** +* CHAR = <any ASCII character> ; ( 0-177, 0.-127.) +****************************************************************************/ +CHAR = 0x00..0x7F + + +/*************************************************************************** +* comment = "(" *(ctext / quoted-pair / comment) ")" +****************************************************************************/ +comment + -> '(', comment_choice,')' + +comment_choice + -> ctext + -> quoted_pair + -> comment + + +/*************************************************************************** +* CR = <ASCII CR, carriage return> ; ( 15, 13.) +****************************************************************************/ +CR = 0x0D + + +/*************************************************************************** +* CRLF = CR LF +****************************************************************************/ +CRLF + -> "\r\n" //CR,LF + + +/*************************************************************************** +* ctext = <any CHAR excluding "(", ; => may be folded +* ")", "\" & CR, & including +* linear-white-space> +****************************************************************************/ +ctext + -> CHAR - ctext_specials + ->linear_white_space + +ctext_specials = '(' + ')' + '\\' + CR + + +/*************************************************************************** +* CTL = <any ASCII control ; ( 0- 37, 0.- 31.) +* character and DEL> ; ( 177, 127.) +****************************************************************************/ +CTL = 0x00..0x1F + 0x7F + + + +/*************************************************************************** +* date = 1*2DIGIT month 2DIGIT ; day month year +* ; e.g. 20 Jun 82 +****************************************************************************/ +date + -> day_numb,SPACE, month,SPACE, year + +day_numb + -> number + +year + -> number + +number + -> DIGIT + -> number, DIGIT + +/*************************************************************************** +* dates = orig-date ; Original +* [ resent-date ] ; Forwarded +****************************************************************************/ +dates + -> orig_date + -> orig_date, SPACE, resent_date + + +/*************************************************************************** +* date-time = [ day "," ] date time ; dd mm yy +* ; hh:mm:ss zzz +****************************************************************************/ +date_time + -> [ day, ','] , date, time + + +/*************************************************************************** +* day = "Mon" / "Tue" / "Wed" / "Thu" +* / "Fri" / "Sat" / "Sun" +****************************************************************************/ +day + -> "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun" + + + +/*************************************************************************** +* delimiters = specials / linear-white-space / comment +****************************************************************************/ +delimeters + -> specials + -> linear_white_space + -> comment + +/*************************************************************************** +* destination = "To" ":" 1#address ; Primary +* / "Resent-To" ":" 1#address +* / "cc" ":" 1#address ; Secondary +* / "Resent-cc" ":" 1#address +* / "bcc" ":" #address ; Blind carbon +* / "Resent-bcc" ":" #address +****************************************************************************/ +destination + -> "To",':',addresses + -> "Resent-To",':',addresses + -> "cc",':',addresses + -> "Recent-cc",':',addresses + -> "bcc",':', address? + -> "Resent-bcc",':', address? + +addresses + -> address + -> addresses,SPACE,address + +/*************************************************************************** +* DIGIT = <any ASCII decimal digit> ; ( 60- 71, 48.- 57.) +****************************************************************************/ +DIGIT = '0-9' + +/*************************************************************************** +* domain = sub-domain *("." sub-domain) +****************************************************************************/ +domain + -> multiple_sub_domains + +multiple_sub_domains + -> sub_domain + -> multiple_sub_domains,'.',sub_domain + +/*************************************************************************** +* domain-literal = "[" *(dtext / quoted-pair) "]" +****************************************************************************/ +domain_literal + -> '[', literal_fill..., ']' + +literal_fill + -> dtext + -> quoted_pair + + + +/*************************************************************************** +* domain-ref = atom ; symbolic reference +****************************************************************************/ +domain_ref + -> atom + + +/*************************************************************************** +* dtext = <any CHAR excluding "[", ; => may be folded +* "]", "\" & CR, & including +* linear-white-space> +****************************************************************************/ +dtext + -> CHAR - dtext_specials + -> linear_white_space + +//Added SPACE and TAB otherwise grammer would be ambiguous since they also appear in +//definition of liner_white_space + +dtext_specials = '[' + ']' + '\\'+ CR + SPACE + HTAB + +/*************************************************************************** +* extension-field = +* <Any field which is defined in a document +* published as a formal extension to this +* specification; none will have names beginning +* with the string "X-"> +****************************************************************************/ + + + + +/*************************************************************************** +* field = field-name ":" [ field-body ] CRLF +****************************************************************************/ +field + -> field_name, ':',[field_body],CRLF + + +/*************************************************************************** +* fields = dates ; Creation time, +* source ; author id & one +* 1*destination ; address required +* *optional-field ; others optional +****************************************************************************/ +fields + -> fields_makeup + -> fields, fields_makeup + +fields_makeup + -> dates + -> source + -> destination + -> optional_field + + +/*************************************************************************** +* field-body = field-body-contents +* [CRLF LWSP-char field-body] +****************************************************************************/ +field_body + -> field_body_contents, [CRLF,LWSP_char,field_body] + + +/*************************************************************************** +* field-body-contents = +* <the ASCII characters making up the field-body, as +* defined in the following sections, and consisting +* of combinations of atom, quoted-string, and +* specials tokens, or else consisting of texts> +****************************************************************************/ +field_body_contents + -> CHAR... + +/*************************************************************************** +* field-name = 1*<any CHAR, excluding CTLs, SPACE, and ":"> +****************************************************************************/ +field_name + -> (0x21..0x7E) - 0x3A + + +/*************************************************************************** +* group = phrase ":" [#mailbox] ";" +****************************************************************************/ +group + -> "phrase", ':', multiple_mailboxes,';' + + + +/*************************************************************************** +* hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT] +* ; 00:00:00 - 23:59:59 +****************************************************************************/ +hour + -> DIGIT,DIGIT,':',DIGIT,DIGIT,[':',DIGIT,DIGIT] + +/*************************************************************************** +* HTAB = <ASCII HT, horizontal-tab> ; ( 11, 9.) +****************************************************************************/ +HTAB = 0x09 + +/*************************************************************************** +* LF = <ASCII LF, linefeed> ; ( 12, 10.) +****************************************************************************/ +LF = 0x0A + +/*************************************************************************** +* linear-white-space = 1*([CRLF] LWSP-char) ; semantics = SPACE +* ; CRLF => folding +****************************************************************************/ +linear_white_space + -> {linear_space}... + +linear_space + -> CRLF,LWSP_char + -> LWSP_char + +/*************************************************************************** +* local-part = word *("." word) ; uninterpreted +* ; case-preserved +****************************************************************************/ +local_part + -> word,SPACE,{'.',word}... + + +/*************************************************************************** +* LWSP-char = SPACE / HTAB ; semantics = SPACE +****************************************************************************/ +LWSP_char = SPACE + HTAB + + +/*************************************************************************** +* mailbox = addr-spec ; simple address +* / phrase route-addr ; name & addr-spec +****************************************************************************/ +mailbox + -> addr_spec + -> "phrase",SPACE,route_addr + + +/*************************************************************************** +* message = fields *( CRLF *text ) ; Everything after +* ; first null line +* ; is message body +****************************************************************************/ +message + -> fields, {CRLF, text?}... + + +/*************************************************************************** +* month = "Jan" / "Feb" / "Mar" / "Apr" +* / "May" / "Jun" / "Jul" / "Aug" +* / "Sep" / "Oct" / "Nov" / "Dec" +****************************************************************************/ +month + -> "Jan" + -> "Feb" + -> "Mar" + -> "Apr" + -> "May" + -> "Jun" + -> "Jul" + -> "Aug" + -> "Sep" + -> "Oct" + -> "Nov" + -> "Dec" + + + + +/*************************************************************************** +* msg-id = "<" addr-spec ">" ; Unique message id +****************************************************************************/ +msg_id + -> '<',addr_spec,'>' + + + +/*************************************************************************** +* optional-field = +* / "Message-ID" ":" msg-id +* / "Resent-Message-ID" ":" msg-id +* / "In-Reply-To" ":" *(phrase / msg-id) +* / "References" ":" *(phrase / msg-id) +* / "Keywords" ":" #phrase +* / "Subject" ":" *text +* / "Comments" ":" *text +* / "Encrypted" ":" 1#2word +* / extension-field ; To be defined +* / user-defined-field ; May be pre-empted +****************************************************************************/ +optional_field + -> optional_fields + +optional_fields + -> "Message-ID" , ':', msg_id + + +/*************************************************************************** +* orig-date = "Date" ":" date-time +****************************************************************************/ +orig_date + -> "Date", ':', date_time + + +/*************************************************************************** +* originator = authentic ; authenticated addr +* [ "Reply-To" ":" 1#address] ) +****************************************************************************/ +originator + -> authentic, ["Reply-To", ':', addresses] + +/*************************************************************************** +* phrase = 1*word ; Sequence of words +****************************************************************************/ +phrase + -> word... + + + +/*************************************************************************** +* qtext = <any CHAR excepting <">, ; => may be folded +* "\" & CR, and including +* linear-white-space> +****************************************************************************/ +qtext + -> CHAR - qtext_specials + -> linear_white_space + +//Added SPACE and HTAB to reduce an ambiguous grammer conflict + +qtext_specials = '"' + '\\' + CR + SPACE + HTAB + + +/*************************************************************************** +* quoted-pair = "\" CHAR ; may quote any char +****************************************************************************/ +quoted_pair + -> '\\',CHAR + +/*************************************************************************** +* quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or +* ; quoted chars. +****************************************************************************/ +quoted_string + -> '"', QUOTED?...,'"' + +QUOTED + -> qtext + -> quoted_pair + + + +/*************************************************************************** +* received = "Received" ":" ; one per relay +* ["from" domain] ; sending host +* ["by" domain] ; receiving host +* ["via" atom] ; physical path +* *("with" atom) ; link/mail protocol +* ["id" msg-id] ; receiver msg id +* ["for" addr-spec] ; initial form +* ";" date-time ; time received +****************************************************************************/ +received +-> "Received",':',received_fields..., ';',rec_date_time + +received_fields + -> from,from_domain + -> "by",by_domain + -> "via",via_atom + -> "with",with_atom + -> "id",rec_msg_id + -> "for",for_addr_spec + + +from + -> "from" + +from_domain + -> domain + +by_domain + -> domain + +via_atom + -> atom + +with_atom + -> atom + +rec_msg_id + ->msg_id + +for_addr_spec + -> addr_spec + +rec_date_time + -> date_time + +/*************************************************************************** +* resent = resent-authentic +* [ "Resent-Reply-To" ":" 1#address] ) +****************************************************************************/ +resent + -> resent_authentic,["Resent-Reply-To", ':', addresses] + + +/*************************************************************************** +* resent-authentic = +* = "Resent-From" ":" mailbox +* / ( "Resent-Sender" ":" mailbox +* "Resent-From" ":" 1#mailbox ) +****************************************************************************/ +resent_authentic + -> "Resent-Sender",':',mailbox + -> "Resent-From",':',multiple_mailboxes + +/*************************************************************************** +* resent-date = "Resent-Date" ":" date-time +****************************************************************************/ +resent_date + -> "Resent-Date",':',date_time + + +/*************************************************************************** +* return = "Return-path" ":" route-addr ; return address +****************************************************************************/ +return + -> "Return-path",':',route_addr + +/*************************************************************************** +* route = 1#("@" domain) ":" ; path-relative +****************************************************************************/ +route + -> route_list,':' + +sub_route + -> '@',domain + +route_list + -> sub_route + -> route_list, sub_route + + + +/*************************************************************************** +* route-addr = "<" [route] addr-spec ">" +****************************************************************************/ +route_addr + -> '<',[route],addr_spec, '>' + + +/*************************************************************************** +* source = [ trace ] ; net traversals +* originator ; original mail +* [ resent ] ; forwarded +****************************************************************************/ +source + -> trace?,originator,resent? + + +/*************************************************************************** +* SPACE = <ASCII SP, space> ; ( 40, 32.) +****************************************************************************/ +SPACE = 0x20 + + +/*************************************************************************** +* specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted- +* / "," / ";" / ":" / "\" / <"> ; string, to use +* / "." / "[" / "]" ; within a word. +****************************************************************************/ +specials = '(' + ')' + '<' + '>' + '@' + ',' + ';' + ':' + '\\' + '"' + '.' + '[' + ']' + + +/*************************************************************************** +* sub-domain = domain-ref / domain-literal +****************************************************************************/ +sub_domain + -> domain_ref + -> domain_literal + +/*************************************************************************** +* text = <any CHAR, including bare ; => atoms, specials, +* CR & bare LF, but NOT ; comments and +* including CRLF> ; quoted-strings are +* ; NOT recognized. +****************************************************************************/ +text + -> text_char + +text_char + -> 0x00..0x7F + + +/*************************************************************************** +* time = hour zone ; ANSI and Military +****************************************************************************/ +time + -> hour, SPACE, zone + +/*************************************************************************** +* trace = return ; path to sender +* 1*received ; receipt tags +****************************************************************************/ +trace + -> return,SPACE,received... + +/*************************************************************************** + user-defined-field = + <Any field which has not been defined + in this specification or published as an + extension to this specification; names for + such fields must be unique and may be + pre-empted by published extensions> +****************************************************************************/ + + +/*************************************************************************** +* word = atom / quoted-string +****************************************************************************/ +word + -> atom + -> quoted_string + + +/*************************************************************************** +* zone = "UT" / "GMT" ; Universal Time +* ; North American : UT +* / "EST" / "EDT" ; Eastern: - 5/ - 4 +* / "CST" / "CDT" ; Central: - 6/ - 5 +* / "MST" / "MDT" ; Mountain: - 7/ - 6 +* / "PST" / "PDT" ; Pacific: - 8/ - 7 +* / 1ALPHA ; Military: Z = UT; +* <"> = <ASCII quote mark> ; ( 42, 34.) +****************************************************************************/ +zone + -> "UT" + -> "GMT" + -> "EST" + -> "EDT" + -> "CST" + -> "CDT" + -> "MST" + -> "MDT" + -> "PST" + -> "PDT" + -> ALPHA + -> 0x22 + +