mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: literal term lex_state
* parse.y (parser_string_term, parser_parse_string): move setting lex_state operations from parser_yylex per each token types. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59974 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c18503c25a
commit
5da2f77b93
1 changed files with 32 additions and 36 deletions
62
parse.y
62
parse.y
|
@ -6256,14 +6256,35 @@ parser_peek_variable_name(struct parser_params *parser)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define IS_ARG() IS_lex_state(EXPR_ARG_ANY)
|
||||||
|
#define IS_END() IS_lex_state(EXPR_END_ANY)
|
||||||
|
#define IS_BEG() (IS_lex_state(EXPR_BEG_ANY) || IS_lex_state_all(EXPR_ARG|EXPR_LABELED))
|
||||||
|
#define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c))
|
||||||
|
#define IS_LABEL_POSSIBLE() (\
|
||||||
|
(IS_lex_state(EXPR_LABEL|EXPR_ENDFN) && !cmd_state) || \
|
||||||
|
IS_ARG())
|
||||||
|
#define IS_LABEL_SUFFIX(n) (peek_n(':',(n)) && !peek_n(':', (n)+1))
|
||||||
|
#define IS_AFTER_OPERATOR() IS_lex_state(EXPR_FNAME | EXPR_DOT)
|
||||||
|
|
||||||
static inline enum yytokentype
|
static inline enum yytokentype
|
||||||
parser_string_term(struct parser_params *parser, int func)
|
parser_string_term(struct parser_params *parser, int func)
|
||||||
{
|
{
|
||||||
if (!(func & STR_FUNC_REGEXP)) return tSTRING_END;
|
rb_gc_force_recycle((VALUE)lex_strterm);
|
||||||
|
lex_strterm = 0;
|
||||||
|
if (func & STR_FUNC_REGEXP) {
|
||||||
set_yylval_num(regx_options());
|
set_yylval_num(regx_options());
|
||||||
dispatch_scan_event(tREGEXP_END);
|
dispatch_scan_event(tREGEXP_END);
|
||||||
|
SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
|
||||||
return tREGEXP_END;
|
return tREGEXP_END;
|
||||||
}
|
}
|
||||||
|
if ((func & STR_FUNC_LABEL) && IS_LABEL_SUFFIX(0)) {
|
||||||
|
nextc();
|
||||||
|
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
|
||||||
|
return tLABEL_END;
|
||||||
|
}
|
||||||
|
SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
|
||||||
|
return tSTRING_END;
|
||||||
|
}
|
||||||
|
|
||||||
static enum yytokentype
|
static enum yytokentype
|
||||||
parser_parse_string(struct parser_params *parser, NODE *quote)
|
parser_parse_string(struct parser_params *parser, NODE *quote)
|
||||||
|
@ -6275,6 +6296,8 @@ parser_parse_string(struct parser_params *parser, NODE *quote)
|
||||||
rb_encoding *enc = current_enc;
|
rb_encoding *enc = current_enc;
|
||||||
|
|
||||||
if (func & STR_FUNC_TERM) {
|
if (func & STR_FUNC_TERM) {
|
||||||
|
SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
|
||||||
|
lex_strterm = 0;
|
||||||
return func & STR_FUNC_REGEXP ? tREGEXP_END : tSTRING_END;
|
return func & STR_FUNC_REGEXP ? tREGEXP_END : tSTRING_END;
|
||||||
}
|
}
|
||||||
c = nextc();
|
c = nextc();
|
||||||
|
@ -6660,11 +6683,14 @@ parser_here_document(struct parser_params *parser, NODE *here)
|
||||||
#endif
|
#endif
|
||||||
restore:
|
restore:
|
||||||
heredoc_restore(lex_strterm);
|
heredoc_restore(lex_strterm);
|
||||||
|
lex_strterm = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (was_bol() && whole_match_p(eos, len, indent)) {
|
if (was_bol() && whole_match_p(eos, len, indent)) {
|
||||||
dispatch_heredoc_end();
|
dispatch_heredoc_end();
|
||||||
heredoc_restore(lex_strterm);
|
heredoc_restore(lex_strterm);
|
||||||
|
lex_strterm = 0;
|
||||||
|
SET_LEX_STATE(EXPR_END);
|
||||||
return tSTRING_END;
|
return tSTRING_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7158,16 +7184,6 @@ parser_prepare(struct parser_params *parser)
|
||||||
parser->token_info_enabled = !compile_for_eval && RTEST(ruby_verbose);
|
parser->token_info_enabled = !compile_for_eval && RTEST(ruby_verbose);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define IS_ARG() IS_lex_state(EXPR_ARG_ANY)
|
|
||||||
#define IS_END() IS_lex_state(EXPR_END_ANY)
|
|
||||||
#define IS_BEG() (IS_lex_state(EXPR_BEG_ANY) || IS_lex_state_all(EXPR_ARG|EXPR_LABELED))
|
|
||||||
#define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c))
|
|
||||||
#define IS_LABEL_POSSIBLE() (\
|
|
||||||
(IS_lex_state(EXPR_LABEL|EXPR_ENDFN) && !cmd_state) || \
|
|
||||||
IS_ARG())
|
|
||||||
#define IS_LABEL_SUFFIX(n) (peek_n(':',(n)) && !peek_n(':', (n)+1))
|
|
||||||
#define IS_AFTER_OPERATOR() IS_lex_state(EXPR_FNAME | EXPR_DOT)
|
|
||||||
|
|
||||||
#ifndef RIPPER
|
#ifndef RIPPER
|
||||||
#define ambiguous_operator(tok, op, syn) ( \
|
#define ambiguous_operator(tok, op, syn) ( \
|
||||||
rb_warning0("`"op"' after local variable or literal is interpreted as binary operator"), \
|
rb_warning0("`"op"' after local variable or literal is interpreted as binary operator"), \
|
||||||
|
@ -7912,33 +7928,13 @@ parser_yylex(struct parser_params *parser)
|
||||||
int token_seen = parser->token_seen;
|
int token_seen = parser->token_seen;
|
||||||
|
|
||||||
if (lex_strterm) {
|
if (lex_strterm) {
|
||||||
enum yytokentype token;
|
|
||||||
if (nd_type(lex_strterm) == NODE_HEREDOC) {
|
if (nd_type(lex_strterm) == NODE_HEREDOC) {
|
||||||
token = here_document(lex_strterm);
|
return here_document(lex_strterm);
|
||||||
if (token == tSTRING_END) {
|
|
||||||
lex_strterm = 0;
|
|
||||||
SET_LEX_STATE(EXPR_END);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
token = parse_string(lex_strterm);
|
return parse_string(lex_strterm);
|
||||||
if ((token == tSTRING_END) && (lex_strterm->nd_func & STR_FUNC_LABEL)) {
|
|
||||||
if (((IS_lex_state(EXPR_BEG | EXPR_ENDFN) && !COND_P()) || IS_ARG()) &&
|
|
||||||
IS_LABEL_SUFFIX(0)) {
|
|
||||||
nextc();
|
|
||||||
token = tLABEL_END;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (token == tSTRING_END || token == tREGEXP_END || token == tLABEL_END) {
|
|
||||||
const enum lex_state_e next_state =
|
|
||||||
token == tLABEL_END ? EXPR_BEG|EXPR_LABEL : EXPR_END|EXPR_ENDARG;
|
|
||||||
rb_gc_force_recycle((VALUE)lex_strterm);
|
|
||||||
lex_strterm = 0;
|
|
||||||
SET_LEX_STATE(next_state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
cmd_state = command_start;
|
cmd_state = command_start;
|
||||||
command_start = FALSE;
|
command_start = FALSE;
|
||||||
parser->token_seen = TRUE;
|
parser->token_seen = TRUE;
|
||||||
|
|
Loading…
Add table
Reference in a new issue