[ruby-dev:9451] Re: ParseDate.parsedate( "2000-03-16T23:45:54+0900" )
From:
Tadayoshi Funaba <tadf@...>
Date:
2000-03-18 04:47:24 UTC
List:
ruby-dev #9451
ふなばです。
At 2000-03-18T12:38:13+0900 (2451621.65154JD),
matz@netlab.co.jp (Yukihiro Matsumoto) wrote:
matz> |すでに、この実装は限界に来ているのかもしれません。現在の仕様はともかく
matz> |(これも議論の余地はあると思いますが)、実装は見直す必要があるのではない
matz> |かと思います。
matz> 同感です。
どうも。
matz> |僕は、parsedate2 というものを書いたんですが、これは、まるで parsedate
matz> |と同じように使えます。こいつは、おおむね parsedate よりうまく働くので
matz> |は、と思っています。このふたつの parsedate を叩き台にして、もっとよい
matz> |実装を得られるかもしれません。
matz> parsedateとインタフェースは同じなんですよね。
matz> じゃあ、1.5では入れ換えちゃいましょうか。
matz> で、しばらくトラブルが起きなかったら1.4.5あたりで取り込むと。
おお。でも、こういう解決方法でよいのか、確信はないです。ですが、これま
で問題点を指摘されてながらも、ここまで来た経緯を考えると、ただ待ってて
も、どうにもなりそうにないので...。
1.5 では、少し直さないとダメですね (さらにちょっとバグってたし :)。
# ためしに、racc で書き直してみたら、それもちゃんと動いたが、-E つきで
# 翻訳するとエラーになってしまう。何故だろう...。
--- parsedate2.ry 1999/09/11 04:51:19 1.4
+++ parsedate2.ry 2000/03/18 02:42:52
@@ -1,3 +1,3 @@
%{
-# parsedate2.ry: Written by Tadayoshi Funaba 1999
+# parsedate2.ry: Written by Tadayoshi Funaba 1999, 2000
# $Id: parsedate2.ry,v 1.4 1999/09/11 04:51:19 tadf Exp tadf $
@@ -11,3 +11,3 @@
-repr : day | odaycom dat ;
+repr : | day | odaycom dat ;
@@ -57,3 +57,3 @@
{
- YYERROR unless /^[MTSH]$/ =~ _$1
+ raise 'YYERROR' unless /^[MTSH]$/ =~ _$1
store(:year, _$2.to_i +
@@ -133,3 +133,3 @@
else
- YYERROR
+ raise 'YYERROR'
end
@@ -138,3 +138,3 @@
-otee : | LETTERS { YYERROR unless _$1 == 'T' } ;
+otee : | LETTERS { raise 'YYERROR' unless _$1 == 'T' } ;
@@ -148,3 +148,3 @@
else
- YYERROR
+ raise 'YYERROR'
end
@@ -160,3 +160,3 @@
{
- YYERROR unless _$2 == 'DST'
+ raise 'YYERROR' unless _$2 == 'DST'
store(:zone, _$1 + ' ' + _$2)
@@ -197,3 +197,3 @@
- if /\A(\d+)(?:(?:th|st|nd|rd)\>)?/ =~ @str
+ if /\A(\d+)(?:(?:th|st|nd|rd)\b)?/ =~ @str
@str = $'
@@ -207,3 +207,3 @@
- if /\A([ap]\.?m\.?\>)/i =~ @str
+ if /\A([ap]\.?m\.?\b)/i =~ @str
@str = $'
@@ -254,3 +254,3 @@
par.clear
- begin par.yyparse(lex) rescue; end
+ begin par.yyparse(lex); rescue; end
par.values(cyear)
--- parsedate2.rb-1.4 Tue Sep 14 21:14:50 1999
+++ parsedate2.rb Sat Mar 18 12:50:31 2000
@@ -1,3 +1 @@
-# parsedate2.ry: Written by Tadayoshi Funaba 1999
-# $Id: parsedate2.ry,v 1.4 1999/09/11 04:51:19 tadf Exp $
class ParseDatePar
@@ -10,8 +8,8 @@
- DAY = 258
- DIGITS = 259
- MON = 260
- LETTERS = 261
- MERID = 262
-
+ DAY = 257
+ DIGITS = 258
+ MON = 259
+ LETTERS = 260
+ MERID = 261
+
## User declarations begin
@@ -48,35 +46,35 @@
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 1, 2, 3, 4, 5,
- 6, 7
+ 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
+ 7
]
YYPRHS = [ 0,
- 0, 2, 5, 7, 11, 13, 19, 25, 31, 33,
- 37, 39, 43, 44, 47, 49, 50, 52, 54, 56,
- 59, 62, 64, 66, 68, 70, 72, 79, 87, 93,
- 97, 103, 107, 114, 115, 118, 121, 122, 124, 127,
- 128, 130, 131, 133, 135, 138, 141, 143
- ]
- YYRHS = [ 17,
- 0, 16, 15, 0, 19, 0, 19, 18, 22, 0,
- 28, 0, 28, 18, 19, 18, 22, 0, 19, 18,
- 28, 18, 22, 0, 19, 18, 22, 18, 28, 0,
- 23, 0, 23, 18, 28, 0, 30, 0, 30, 18,
- 32, 0, 0, 17, 18, 0, 3, 0, 0, 8,
- 0, 20, 0, 21, 0, 4, 5, 0, 5, 4,
- 0, 4, 0, 24, 0, 25, 0, 26, 0, 27,
- 0, 4, 9, 4, 9, 4, 31, 0, 6, 4,
- 10, 4, 10, 4, 31, 0, 4, 9, 5, 9,
- 4, 0, 4, 11, 4, 0, 4, 11, 4, 11,
- 4, 0, 4, 7, 34, 0, 4, 12, 4, 29,
- 33, 34, 0, 0, 12, 4, 0, 4, 31, 0,
- 0, 6, 0, 4, 34, 0, 0, 7, 0, 0,
- 35, 0, 6, 0, 6, 6, 0, 36, 4, 0,
- 9, 0, 13, 0
+ 0, 1, 3, 6, 8, 12, 14, 20, 26, 32,
+ 34, 38, 40, 44, 45, 48, 50, 51, 53, 55,
+ 57, 60, 63, 65, 67, 69, 71, 73, 80, 88,
+ 94, 98, 104, 108, 115, 116, 119, 122, 123, 125,
+ 128, 129, 131, 132, 134, 136, 139, 142, 144
+ ]
+ YYRHS = [ -1,
+ 17, 0, 16, 15, 0, 19, 0, 19, 18, 22,
+ 0, 28, 0, 28, 18, 19, 18, 22, 0, 19,
+ 18, 28, 18, 22, 0, 19, 18, 22, 18, 28,
+ 0, 23, 0, 23, 18, 28, 0, 30, 0, 30,
+ 18, 32, 0, 0, 17, 18, 0, 3, 0, 0,
+ 8, 0, 20, 0, 21, 0, 4, 5, 0, 5,
+ 4, 0, 4, 0, 24, 0, 25, 0, 26, 0,
+ 27, 0, 4, 9, 4, 9, 4, 31, 0, 6,
+ 4, 10, 4, 10, 4, 31, 0, 4, 9, 5,
+ 9, 4, 0, 4, 11, 4, 0, 4, 11, 4,
+ 11, 4, 0, 4, 7, 34, 0, 4, 12, 4,
+ 29, 33, 34, 0, 0, 12, 4, 0, 4, 31,
+ 0, 0, 6, 0, 4, 34, 0, 0, 7, 0,
+ 0, 35, 0, 6, 0, 6, 6, 0, 36, 4,
+ 0, 9, 0, 13, 0
]
YYRLINE = [ 0,
- 14, 14, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 28, 28, 30, 32, 32, 34, 34, 36,
- 38, 40, 42, 42, 42, 42, 44, 58, 72, 86,
- 91, 105, 109, 116, 116, 118, 141, 141, 143, 156,
- 156, 158, 158, 160, 161, 166, 169, 169
+ 14, 14, 14, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 28, 28, 30, 32, 32, 34, 34,
+ 36, 38, 40, 42, 42, 42, 42, 44, 58, 72,
+ 86, 91, 105, 109, 116, 116, 118, 141, 141, 143,
+ 156, 156, 158, 158, 160, 161, 166, 169, 169
]
@@ -88,24 +86,24 @@
YYR1 = [ 0,
- 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 16, 16, 17, 18, 18, 19, 19, 20,
- 21, 22, 23, 23, 23, 23, 24, 25, 26, 27,
- 27, 28, 28, 29, 29, 30, 31, 31, 32, 33,
- 33, 34, 34, 35, 35, 35, 36, 36
+ 14, 14, 14, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 16, 16, 17, 18, 18, 19, 19,
+ 20, 21, 22, 23, 23, 23, 23, 24, 25, 26,
+ 27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
+ 33, 33, 34, 34, 35, 35, 35, 36, 36
]
YYR2 = [ 0,
- 1, 2, 1, 3, 1, 5, 5, 5, 1, 3,
- 1, 3, 0, 2, 1, 0, 1, 1, 1, 2,
- 2, 1, 1, 1, 1, 1, 6, 7, 5, 3,
- 5, 3, 6, 0, 2, 2, 0, 1, 2, 0,
- 1, 0, 1, 1, 2, 2, 1, 1
- ]
- YYDEFACT = [ 13,
- 15, 0, 16, 37, 0, 0, 2, 3, 18, 19,
- 9, 23, 24, 25, 26, 16, 11, 17, 14, 20,
- 38, 42, 0, 0, 0, 36, 21, 0, 0, 0,
- 0, 0, 44, 47, 48, 32, 43, 0, 0, 0,
- 30, 34, 0, 22, 4, 16, 0, 10, 0, 16,
- 42, 12, 45, 46, 0, 0, 0, 0, 40, 0,
- 0, 0, 0, 39, 37, 29, 31, 35, 41, 42,
- 0, 8, 22, 7, 6, 27, 33, 37, 28, 0,
+ 0, 1, 2, 1, 3, 1, 5, 5, 5, 1,
+ 3, 1, 3, 0, 2, 1, 0, 1, 1, 1,
+ 2, 2, 1, 1, 1, 1, 1, 6, 7, 5,
+ 3, 5, 3, 6, 0, 2, 2, 0, 1, 2,
+ 0, 1, 0, 1, 1, 2, 2, 1, 1
+ ]
+ YYDEFACT = [ 14,
+ 16, 0, 17, 38, 0, 0, 3, 4, 19, 20,
+ 10, 24, 25, 26, 27, 17, 12, 18, 15, 21,
+ 39, 43, 0, 0, 0, 37, 22, 0, 0, 0,
+ 0, 0, 45, 48, 49, 33, 44, 0, 0, 0,
+ 31, 35, 0, 23, 5, 17, 0, 11, 0, 17,
+ 43, 13, 46, 47, 0, 0, 0, 0, 41, 0,
+ 0, 0, 0, 40, 38, 30, 32, 36, 42, 43,
+ 0, 9, 23, 8, 7, 28, 34, 38, 29, 0,
0, 0
@@ -117,15 +115,15 @@
]
- YYPACT = [ 16,
--32768, 30, 6, 15, 37, 39,-32768, 8,-32768,-32768,
+ YYPACT = [ 28,
+-32768, 30, 6, 15, 25, 37,-32768, 8,-32768,-32768,
8,-32768,-32768,-32768,-32768, 7, 8,-32768,-32768,-32768,
--32768, 4, 24, 40, 41,-32768,-32768, 1, 42, 43,
- 27, 44, 45,-32768,-32768,-32768,-32768, 46, 47, 48,
- 38, 49, 50, 18, 8, 51, 18,-32768, 53, 51,
- 4,-32768,-32768,-32768, 56, 58, 59, 60, 61, 55,
- 43, 62, 62,-32768, 63,-32768,-32768,-32768,-32768, 4,
- 66,-32768,-32768,-32768,-32768,-32768,-32768, 63,-32768, 52,
- 67,-32768
+-32768, 4, 35, 43, 44,-32768,-32768, 1, 45, 46,
+ 39, 47, 13,-32768,-32768,-32768,-32768, 48, 23, 49,
+ 42, 50, 51, 18, 8, 52, 18,-32768, 54, 52,
+ 4,-32768,-32768,-32768, 53, 57, 59, 60, 58, 56,
+ 46, 63, 63,-32768, 62,-32768,-32768,-32768,-32768, 4,
+ 65,-32768,-32768,-32768,-32768,-32768,-32768, 62,-32768, 70,
+ 71,-32768
]
YYPGOTO = [ -32768,
--32768,-32768,-32768, -8, 22,-32768,-32768, -23,-32768,-32768,
+-32768,-32768,-32768, -8, 41,-32768,-32768, -17,-32768,-32768,
-32768,-32768,-32768, -28,-32768,-32768, -60,-32768,-32768, -47,
@@ -133,11 +131,12 @@
]
- YYLAST = 70
+ YYLAST = 72
YYTABLE = [ 29,
- 46, 48, 30, 64, 76, -1, -5, 31, 32, 33,
- 43, -16, 34, 18, 18, 18, 35, 79, 1, 20,
- 21, 22, 77, 23, 22, 24, 25, 39, 40, 25,
- 49, 5, 72, 4, 5, 6, 61, 62, 74, 75,
- 27, 63, 28, 41, 42, 44, 47, 51, 57, 54,
- 53, 81, 50, 60, 0, 55, 56, 20, 18, 65,
- 58, 66, 67, 68, 71, 73, 82, 69, 21, 78
+ 46, 48, 30, 64, 76, -2, -6, 31, 32, 33,
+ 43, -17, 34, 18, 18, 18, 35, 79, 53, 20,
+ 21, 22, 77, 23, 22, 24, 25, -1, 27, 25,
+ 1, 55, 72, 4, 5, 6, 61, 62, 39, 40,
+ 28, 63, 49, 5, 74, 75, 41, 42, 44, 47,
+ 51, 54, 57, 0, 60, 0, 65, 56, 20, 18,
+ 66, 58, 67, 68, 69, 71, 73, 21, 78, 81,
+ 82, 50
]
@@ -145,8 +144,9 @@
29, 30, 11, 51, 65, 0, 0, 16, 17, 6,
- 10, 4, 9, 8, 8, 8, 13, 78, 3, 5,
- 6, 7, 70, 9, 7, 11, 12, 4, 5, 12,
- 4, 5, 61, 4, 5, 6, 45, 46, 62, 63,
- 4, 50, 4, 4, 4, 4, 4, 4, 11, 4,
- 6, 0, 31, 4, -1, 9, 9, 5, 8, 4,
- 12, 4, 4, 4, 10, 4, 0, 7, 6, 4
+ 10, 4, 9, 8, 8, 8, 13, 78, 6, 5,
+ 6, 7, 70, 9, 7, 11, 12, 0, 4, 12,
+ 3, 9, 61, 4, 5, 6, 45, 46, 4, 5,
+ 4, 50, 4, 5, 62, 63, 4, 4, 4, 4,
+ 4, 4, 11, -1, 4, -1, 4, 9, 5, 8,
+ 4, 12, 4, 4, 7, 10, 4, 6, 4, 0,
+ 0, 31
]
@@ -155,3 +155,3 @@
YYTERROR = 1
-
+
def initialize
@@ -159,3 +159,3 @@
end
-
+
def yyparse(lexer)
@@ -170,5 +170,5 @@
while true
-
+
case jump
-
+
when :YYNEWSTATE
@@ -180,3 +180,3 @@
next
-
+
when :YYBACKUP
@@ -187,3 +187,3 @@
end
-
+
## get a lookahead token if we don't already have one
@@ -199,3 +199,3 @@
end
-
+
## if lookahead <= 0, end of input
@@ -208,3 +208,3 @@
else
- yychar1 = yychar < 0 || yychar > 262 ? 37 : YYTRANSLATE[yychar]
+ yychar1 = yychar < 0 || yychar > 261 ? 37 : YYTRANSLATE[yychar]
if @yydebug
@@ -214,3 +214,3 @@
end
-
+
## see if we know what to do with this token in this state
@@ -221,3 +221,3 @@
end
-
+
## yyn is what to do for this token type in this state
@@ -241,3 +241,3 @@
end
-
+
if yyn == YYFINAL
@@ -245,3 +245,3 @@
end
-
+
## shift the lookahead token
@@ -251,3 +251,3 @@
end
-
+
## discard the token being shifted unless it is eof
@@ -257,3 +257,3 @@
yyvs.push(yylval)
-
+
## count tokens shifted since error; after, three turn off
@@ -265,3 +265,3 @@
next
-
+
when :YYDEFAULT
@@ -275,3 +275,3 @@
end
-
+
## do a reduction. yyn is the number of the rule to reduce with
@@ -282,3 +282,3 @@
end
-
+
if @yydebug
@@ -293,14 +293,14 @@
end
-
+
case yyn
- when 15
- store(:wday, yyvs[-1 + 0].to_i)
- when 20
- store(:mday, yyvs[-1 + -1].to_i); store(:mon, yyvs[-1 + 0])
+ when 16
+ store(:wday, yyvs[-1 + 0].to_i)
when 21
- store(:mon, yyvs[-1 + -1]); store(:mday, yyvs[-1 + 0].to_i)
+ store(:mday, yyvs[-1 + -1].to_i); store(:mon, yyvs[-1 + 0])
when 22
- store(:year, yyvs[-1 + 0].to_i)
- when 27
-
+ store(:mon, yyvs[-1 + -1]); store(:mday, yyvs[-1 + 0].to_i)
+ when 23
+ store(:year, yyvs[-1 + 0].to_i)
+ when 28
+
if yyvs[-1 + -1].size >= 4
@@ -314,6 +314,6 @@
end
-
- when 28
-
- YYERROR unless /^[MTSH]$/ =~ yyvs[-1 + -6]
+
+ when 29
+
+ raise 'YYERROR' unless /^[MTSH]$/ =~ yyvs[-1 + -6]
store(:year, yyvs[-1 + -5].to_i +
@@ -326,5 +326,5 @@
store(:mday, yyvs[-1 + -1].to_i)
-
- when 29
-
+
+ when 30
+
if yyvs[-1 + -4].size >= 4
@@ -338,10 +338,10 @@
end
-
- when 30
-
+
+ when 31
+
store(:mon, yyvs[-1 + -2].to_i)
store(:mday, yyvs[-1 + 0].to_i)
-
- when 31
-
+
+ when 32
+
if yyvs[-1 + -4].size >= 4
@@ -355,16 +355,16 @@
end
-
- when 32
-
- store(:hour, yyvs[-1 + -2].to_i + yyvs[-1 + -1])
-
+
when 33
-
+
+ store(:hour, yyvs[-1 + -2].to_i + yyvs[-1 + -1])
+
+ when 34
+
store(:hour, yyvs[-1 + -5].to_i + yyvs[-1 + -1])
store(:min, yyvs[-1 + -3].to_i)
-
- when 35
- store(:sec, yyvs[-1 + 0].to_i)
+
when 36
-
+ store(:sec, yyvs[-1 + 0].to_i)
+ when 37
+
case yyvs[-1 + -1].size
@@ -385,9 +385,9 @@
else
- YYERROR
+ raise 'YYERROR'
end
-
- when 38
- YYERROR unless yyvs[-1 + 0] == 'T'
+
when 39
-
+ raise 'YYERROR' unless yyvs[-1 + 0] == 'T'
+ when 40
+
case yyvs[-1 + -1].size
@@ -398,19 +398,19 @@
else
- YYERROR
+ raise 'YYERROR'
end
-
- when 40
- yyval = 0
- when 44
- store(:zone, yyvs[-1 + 0])
+
+ when 41
+ yyval = 0
when 45
-
- YYERROR unless yyvs[-1 + 0] == 'DST'
- store(:zone, yyvs[-1 + -1] + ' ' + yyvs[-1 + 0])
-
+ store(:zone, yyvs[-1 + 0])
when 46
- store(:zone, yyvs[-1 + -1] + yyvs[-1 + 0])
+
+ raise 'YYERROR' unless yyvs[-1 + 0] == 'DST'
+ store(:zone, yyvs[-1 + -1] + ' ' + yyvs[-1 + 0])
+
+ when 47
+ store(:zone, yyvs[-1 + -1] + yyvs[-1 + 0])
when -65536 ## never used, placeholder for ruby
end
-
+
if yylen > 0
@@ -419,5 +419,5 @@
end
-
+
yyvs.push(yyval)
-
+
if @yydebug
@@ -426,3 +426,3 @@
end
-
+
## "Shift" the result of the reduction.
@@ -438,3 +438,3 @@
next
-
+
when :YYERRLAB
@@ -445,3 +445,3 @@
next
-
+
when :YYERRLAB1
@@ -457,3 +457,3 @@
end
-
+
yyerrstatus = 3
@@ -494,3 +494,3 @@
end
-
+
yyn = YYTABLE[yyn]
@@ -508,3 +508,3 @@
end
-
+
if yyn == YYFINAL
@@ -512,3 +512,3 @@
end
-
+
if @yydebug
@@ -516,3 +516,3 @@
end
-
+
yyvs.push(yylval)
@@ -521,7 +521,7 @@
next
-
+
end ## case
-
+
end ## while true
-
+
end ## yyparse
@@ -551,3 +551,3 @@
end
- if /\A(\d+)(?:(?:th|st|nd|rd)\>)?/ =~ @str
+ if /\A(\d+)(?:(?:th|st|nd|rd)\b)?/ =~ @str
@str = $'
@@ -559,3 +559,3 @@
end
- if /\A([ap]\.?m\.?\>)/i =~ @str
+ if /\A([ap]\.?m\.?\b)/i =~ @str
@str = $'
@@ -597,3 +597,3 @@
par.clear
- begin par.yyparse(lex) rescue; end
+ begin par.yyparse(lex); rescue; end
par.values(cyear)
ふなば ただよし