[#12164] patch for ext/gdbm — Koji Arai <JCA02266@...>

新井です。

24 messages 2001/02/04
[#12168] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/05

まつもと ゆきひろです

[#12176] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/05

新井です。

[#12179] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/06

まつもと ゆきひろです

[#12219] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12220] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12256] set_trace_func — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2001/02/17

[#12293] crash on proc without a block — Kenichi Komiya <kom@...1.accsnet.ne.jp>

15 messages 2001/02/25

[#12323] Re: [ruby-list:28364] class definition extension — "K.Kosako" <kosako@...>

ruby-listから移動しました。

13 messages 2001/02/28
[#12324] Re: [ruby-list:28364] class definition extension — matz@... (Yukihiro Matsumoto) 2001/02/28

まつもと ゆきひろです

[ruby-dev:12318] Quote Symbol

From: Hiroshi IGARASHI <igarashi@...>
Date: 2001-02-27 12:30:43 UTC
List: ruby-dev #12318
いがらしです。

Symbolオブジェクト "foo-bar".intern は :foo-bar という
形式では書けないので、quote表現で %s|foo-bar| と
書けるようにしませんか?

S式をRubyのオブジェクトにマッピングしてあれこれ
しようとしていたのですが、LISPではハイフンが入る
シンボルは珍しくないので、quote表現が欲しくなりました。

--
五十嵐  宏  (Hiroshi IGARASHI)

Index: parse.y
===================================================================
RCS file: /ruby/ruby/parse.y,v
retrieving revision 1.89
diff -u -p -r1.89 parse.y
--- parse.y	2001/02/26 05:29:00	1.89
+++ parse.y	2001/02/26 19:52:52
@@ -197,7 +197,7 @@ static void top_local_setup();
 	k__FILE__
 
 %token <id>   tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR
-%token <val>  tINTEGER tFLOAT tSTRING tXSTRING tREGEXP
+%token <val>  tINTEGER tFLOAT tSTRING tXSTRING tREGEXP tSYMBOL
 %token <node> tDSTRING tDXSTRING tDREGEXP tNTH_REF tBACK_REF
 
 %type <node> singleton string
@@ -1570,6 +1570,7 @@ literal		: numeric
 		    {
 			$$ = ID2SYM($1);
 		    }
+                | tSYMBOL
 		| tREGEXP
 
 string		: tSTRING
@@ -2581,6 +2582,62 @@ parse_qstring(term, paren)
 }
 
 static int
+parse_symbol(term, paren)
+    int term, paren;
+{
+    int strstart;
+    int c;
+    int nest = 0;
+
+    strstart = ruby_sourceline;
+    newtok();
+    while ((c = nextc()) != term || nest > 0) {
+	if (c == -1) {
+	    ruby_sourceline = strstart;
+	    rb_compile_error("unterminated symbol meets end of file");
+	    return 0;
+	}
+	if (ismbchar(c)) {
+	    int i, len = mbclen(c)-1;
+
+	    for (i = 0; i < len; i++) {
+		tokadd(c);
+		c = nextc();
+	    }
+	}
+	else if (c == '\\') {
+	    c = nextc();
+	    switch (c) {
+	      case '\n':
+		continue;
+
+	      case '\\':
+		c = '\\';
+		break;
+
+	      default:
+		/* fall through */
+		if (c == term || (paren && c == paren)) {
+		    tokadd(c);
+		    continue;
+		}
+		tokadd('\\');
+	    }
+	}
+	if (paren) {
+	    if (c == paren) nest++;
+	    if (c == term && nest-- == 0) break;
+	}
+	tokadd(c);
+    }
+
+    tokfix();
+    yylval.val = ID2SYM(rb_intern(tok()));
+    lex_state = EXPR_END;
+    return tSYMBOL;
+}
+
+static int
 parse_quotedwords(term, paren)
     int term, paren;
 {
@@ -3458,6 +3515,9 @@ yylex()
 
 	      case 'r':
 		return parse_regx(term, paren);
+
+	      case 's':
+		return parse_symbol(term, paren);
 
 	      default:
 		yyerror("unknown type of %string");

In This Thread

Prev Next