From: nobu.nakada@... Date: 2002-06-16T11:26:26+09:00 Subject: [ruby-dev:17461] Re: ternary operator and char literal (Re: parse error with `true || break ? 0 : 1' (PR#261)) なかだです。 At Sun, 16 Jun 2002 00:07:51 +0900, Yukihiro Matsumoto wrote: > |どちらかというと、?のリテラルで空白を禁止したほうが直観的なよう > |な気がします。必要なら`?\ 'とできますし。 > > そうですね。「?\s」を提案し、現状「? 」を使っているものにつ > いては警告を出すようにしたいと思います。 なるほど、\sのほうが明解ですね。標準配布ではext/curses/view2.rb が'? 'を使ってます。 > |それと、こういうのも一見して分かりにくいと思うので、二文字以上 > |の単語の先頭の?はリテラルとみなさないほうが良いのでは。 > | > | p ?aif true #=> 97 > > 賛成。コミットしてください。 上の警告と併せてこんなところでいいでしょうか。 > |ついでに、ソースと別ディレクトリでコンパイルしていると、 > |keywordsを変更しても$(srcdir)/lex.cが読み込まれてしまって、変更 > |が反映されません。 > > #include にすると解決するんでしたっけ? #include元のディレクトリとは無関係に-Iで指定されたところから探 しますから、カレントディレクトリが優先されるはずです。 "lex.c"だと、ソースディレクトリにparse.cがある場合にカレントディ レクトリに作り直されたlex.cが無視されるはずなんですが、なぜか gcc 2.95.3だとparse.cがカレントにある場合も同じようになります。 これは#line parse.yされているからなのか、gccのバグなのか…。 Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.184 diff -u -2 -p -r1.184 parse.y --- parse.y 2002/06/14 06:27:18 1.184 +++ parse.y 2002/06/16 02:10:04 @@ -3269,9 +3269,22 @@ yylex() return 0; } - if (IS_ARG() && ISSPACE(c)){ + if ((IS_ARG() && ISSPACE(c)) || ismbchar(c) || + (ISALNUM(c) || c == '_') && (lex_p >= lex_pend || is_identchar(*lex_p))) { pushback(c); lex_state = EXPR_BEG; return '?'; } + if (c == ' ') { + rb_warn("should use ?\\s for blank char literal"); + } + else if (!ISPRINT(c)) { + char s = c; + VALUE s1 = rb_str_new(&s, 1); + VALUE str = rb_funcall2(s1, rb_intern("dump"), 0, 0); + rb_gc_force_recycle(s1); + rb_warn("should use ?%.*s for non-printable char literal", + RSTRING(str)->len - 2, RSTRING(str)->ptr + 1); + rb_gc_force_recycle(str); + } if (c == '\\') { c = read_escape(); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦