RFC 2822 の Obsolete Date and Time を真面目に考え出すと気が狂う問題について

the 1 character military time zonesの問題がない世界でも気が狂う。

これ:

行頭の空白にも意味があるので脳内で削り取らないで読んでな。
1         Tue, 3 Nov 2015 05:42:56 -0800 (PST)

と、これ:

行頭の空白にも意味があるので脳内で削り取らないで読んでな。
 1         (here day-of-week! (
 2         Of course you know
 3         )
 4         )Tue(And this position is
 5         the end of day-of-week.(
 6         you know. (Or
 7         didn't you know
 8         ?))),
 9         (Hi! Begining of day. (And you?))3 (Here is (just) separator for day and month.)Nov (EOL)
10         (Two digits year is allowed. (But
11         not recommended,))15 (EOL, here.)
12         (begin hour!)05(end hour!):(begin minute!)42(end minute!):(begin second!)56(end second!) PST (Pacific
13         Standard Time)

が、「同じ意味である」ことを要求してるのが、Obsolete Date and Time を扱う場合。というかこれが RFC822 の仕様。解析処理が厳密に RFC2822 準拠を謳わなければならないならば、「Obsolete Date and Timeを拒絶してはならない」(However, when interpreting messages, these tokens MUST be honored as part of the legal syntax.)。

これがもし「拒絶してもいい」ならば、現行 RFC2822 での日付時刻形式の複雑さの限界はこの程度:

行頭の空白にも意味があるので脳内で削り取らないで読んでな。
1         Tue,
2         3 Nov
3         2015 05:42:56 -0800 (
4         PST (Pasific Standard Time, not Philippine Standard Time)
5         )

真面目に読めばわかることなのでイチイチ説明すんのもなんだなぁ、と思うし、ワタシも今はじめて学んだような具合なんで「えらそーに」てなことも思うんだけれども一応。

「FWS」というのが、「折り返し出来る空白文字」で、改行して行頭に空白文字を入れることで「折り返し」が出来る、というもの。各フィールドの区切りとしてこれは(時刻のコロンの前後を除き) RFC2822 での新仕様でも踏襲されてる。つまりほぼどこでも改行出来る。

「CWFS」というのが、FWS にさらに「コメント」を含むもので、()で囲むことでそれを指示する。入れ子も可能。コメント内での折り返しも可能。RFC822 時点では RFC2822 で「FWS」だったものが全部「CFWS」だった。だから2つ目の例が許される。(しかも2桁の年が許されていた。)

これさ、文字列処理を実は一番自由に書きやすい C 言語だとそんなに困んなかったりもするんだけどさ、スクリプト言語には結構酷なんだわな。ステートマシンの実装が必須になることも難易度上げるけれど、下手すりゃスクリプト言語が最も苦手とする「文字単位処理」をも強いられかねない(無論設計次第)。当たり前だけどちょっと時代を感じるというか。

それと、「どこででもコメントを許容する」という「人間への優しさ」が結果人間に厳しいものにしてしまった、というのは例によって例のごとく。本気で2番目みたいなの書いてたら、これはもう「機械にしか読めない」シロモノ。なんで「ここにはコメントが書ける/書けない」の選別をしなかったんだろうか、てことだ。だいたい日付時刻なんか、「全体」でしか見ないもんだろ、ひとさまは。コメントはそのまとまりの前後に置ければ十分じゃないか。時刻の各フィールドの前後にコメント入れるなんて、気がふれたとしか思えん。

つーか、基本機械しか解釈しないヘッダに、人間への優しさを込める意味がわからんよ。そんなもん MUA が優しさ発揮すればいいことじゃないか。

なかなかに何を考えておられたのかわからん仕様だ。そもそもな、人がそうする/しないなんか関係ないわけよ。仕様に書かれちゃったら実装するしかなくなっちゃうわけ。世界中で一度として通らないかもしれないフローを「実装」するわけですよ、エンジニアは。












ところで、これを Pygments の lexer としてフル実装するのは実は全然難しくはない。面倒だけど。何を考えてたかと言うと、Pygments の lexer から独立したところで汎用処理にするとしたら? と考えてた。けどやっぱ真面目なステートマシンを書かないとダメなのよ。(Pygments の RegexLexer を真似して作れば簡単だけどな。)

あと参考までに。Pygments ではなくて、AceEditorも設計が似てるみたいなんで、こちらでも簡単に書けると思う。多分。やってみたことないからわからんけど。