From d4f2f6a7f708b010d9777f12bdcb84a449f61aa9 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 23 Oct 2002 10:17:30 +0000 Subject: * eval.c (rb_eval): added NODE_DSYM, symbol literal with interpolation. * node.h: ditto. * intern.h: prototypes; rb_is_junk_id, rb_str_dump, rb_str_intern * object.c (sym_inspect): escape and quote for non-alphanumeric symbols. * parse.y (dsym, tokadd_string, yylex): extended symbol literals. * parse.y (rb_is_junk_id): added. * string.c (rb_str_dump, rb_str_intern) : make extern. * lib/mkmf.rb (create_makefile): deffile should be removed by distclean, not clean. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2985 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- parse.y | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index 9d057aa66a..8a6a3fee77 100644 --- a/parse.y +++ b/parse.y @@ -48,6 +48,7 @@ #define is_attrset_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_ATTRSET) #define is_const_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_CONST) #define is_class_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_CLASS) +#define is_junk_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_JUNK) #define is_asgn_or_id(id) ((is_notop_id(id)) && \ (((id)&ID_SCOPE_MASK) == ID_GLOBAL || \ @@ -238,7 +239,7 @@ static void top_local_setup(); %type singleton strings string string1 xstring regexp %type string_contents xstring_contents string_content %type words qwords word_list qword_list word -%type literal numeric +%type literal numeric dsym %type bodystmt compstmt stmts stmt expr arg primary command command_call method_call %type expr_value arg_value primary_value %type if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure @@ -1740,6 +1741,7 @@ literal : numeric { $$ = NEW_LIT(ID2SYM($1)); } + | dsym ; strings : string @@ -1957,6 +1959,31 @@ sym : fname | tCVAR ; +dsym : tSYMBEG xstring_contents tSTRING_END + { + lex_state = EXPR_END; + if (!$2) { + yyerror("empty symbol literal"); + } + else { + $$ = $2; + switch (nd_type($$)) { + case NODE_STR: + $$->nd_lit = ID2SYM(rb_intern(RSTRING($$->nd_lit)->ptr)); + nd_set_type($$, NODE_LIT); + break; + case NODE_DSTR: + nd_set_type($$, NODE_DSYM); + break; + default: + $$ = rb_node_newnode(NODE_DSYM, rb_str_new(0, 0), + 1, NEW_LIST($$)); + break; + } + } + } + ; + numeric : tINTEGER | tFLOAT ; @@ -2770,6 +2797,7 @@ regx_options() #define STR_FUNC_EXPAND 0x02 #define STR_FUNC_REGEXP 0x04 #define STR_FUNC_QWORDS 0x08 +#define STR_FUNC_SYMBOL 0x10 #define STR_FUNC_INDENT 0x20 enum string_type { @@ -2779,6 +2807,8 @@ enum string_type { str_regexp = (STR_FUNC_REGEXP|STR_FUNC_ESCAPE|STR_FUNC_EXPAND), str_sword = (STR_FUNC_QWORDS), str_dword = (STR_FUNC_QWORDS|STR_FUNC_EXPAND), + str_ssym = (STR_FUNC_SYMBOL), + str_dsym = (STR_FUNC_SYMBOL|STR_FUNC_EXPAND), }; static int @@ -2851,6 +2881,11 @@ tokadd_string(func, term, paren) pushback(c); break; } + if (!c && (func & STR_FUNC_SYMBOL)) { + func &= ~STR_FUNC_SYMBOL; + rb_compile_error("symbol cannot contain '\\0'"); + continue; + } tokadd(c); } return c; @@ -3762,11 +3797,22 @@ yylex() lex_state = EXPR_DOT; return tCOLON2; } - pushback(c); if (lex_state == EXPR_END || lex_state == EXPR_ENDARG || ISSPACE(c)) { + pushback(c); lex_state = EXPR_BEG; return ':'; } + switch (c) { + case '\'': + lex_strterm = NEW_STRTERM(str_ssym, c, 0); + break; + case '"': + lex_strterm = NEW_STRTERM(str_dsym, c, 0); + break; + default: + pushback(c); + break; + } lex_state = EXPR_FNAME; return tSYMBEG; @@ -3968,6 +4014,11 @@ yylex() lex_strterm = NEW_STRTERM(str_regexp, term, paren); return tREGEXP_BEG; + case 's': + lex_strterm = NEW_STRTERM(str_ssym, term, paren); + lex_state = EXPR_FNAME; + return tSYMBEG; + default: yyerror("unknown type of %string"); return 0; @@ -5605,6 +5656,14 @@ rb_is_local_id(id) return Qfalse; } +int +rb_is_junk_id(id) + ID id; +{ + if (is_junk_id(id)) return Qtrue; + return Qfalse; +} + static void special_local_set(c, val) char c; -- cgit v1.2.3