зеркало из https://github.com/github/ruby.git
* parse.y: debug output of lex_state transition if PARSER_DEBUG
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53087 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
de577357e8
Коммит
4e4a76e8f4
|
@ -1,3 +1,7 @@
|
|||
Sun Dec 13 18:40:45 2015 Yuki Yugui Sonoda <yugui@yugui.jp>
|
||||
|
||||
* parse.y: debug output of lex_state transition if PARSER_DEBUG
|
||||
|
||||
Sun Dec 13 18:49:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* io.c (parse_mode_enc): preserve encoding of mode string in
|
||||
|
|
191
parse.y
191
parse.y
|
@ -94,7 +94,14 @@ enum lex_state_e {
|
|||
#define IS_lex_state_all(ls) IS_lex_state_all_for(lex_state, (ls))
|
||||
|
||||
#if PARSER_DEBUG
|
||||
# define SET_LEX_STATE(ls) do { \
|
||||
printf("lex_state: %s -> %s at L%d\n", \
|
||||
lex_state_name(lex_state), lex_state_name((ls)), __LINE__); \
|
||||
lex_state = (ls); \
|
||||
} while (0)
|
||||
static const char *lex_state_name(enum lex_state_e state);
|
||||
#else
|
||||
# define SET_LEX_STATE(ls) do { lex_state = (ls); } while (0)
|
||||
#endif
|
||||
|
||||
typedef VALUE stack_type;
|
||||
|
@ -927,7 +934,7 @@ static void token_info_pop(struct parser_params*, const char *token, size_t len)
|
|||
|
||||
%%
|
||||
program : {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
/*%%%*/
|
||||
local_push(compile_for_eval || rb_parse_in_main());
|
||||
/*%
|
||||
|
@ -1121,7 +1128,7 @@ stmt_or_begin : stmt
|
|||
%*/
|
||||
}
|
||||
|
||||
stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
|
||||
stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME);} fitem
|
||||
{
|
||||
/*%%%*/
|
||||
$$ = NEW_ALIAS($2, $4);
|
||||
|
@ -1920,12 +1927,12 @@ fname : tIDENTIFIER
|
|||
| tFID
|
||||
| op
|
||||
{
|
||||
lex_state = EXPR_ENDFN;
|
||||
SET_LEX_STATE(EXPR_ENDFN);
|
||||
$$ = $1;
|
||||
}
|
||||
| reswords
|
||||
{
|
||||
lex_state = EXPR_ENDFN;
|
||||
SET_LEX_STATE(EXPR_ENDFN);
|
||||
/*%%%*/
|
||||
$$ = $<id>1;
|
||||
/*%
|
||||
|
@ -1957,7 +1964,7 @@ undef_list : fitem
|
|||
$$ = rb_ary_new3(1, $1);
|
||||
%*/
|
||||
}
|
||||
| undef_list ',' {lex_state = EXPR_FNAME;} fitem
|
||||
| undef_list ',' {SET_LEX_STATE(EXPR_FNAME);} fitem
|
||||
{
|
||||
/*%%%*/
|
||||
$$ = block_append($1, NEW_UNDEF($4));
|
||||
|
@ -2686,7 +2693,7 @@ primary : literal
|
|||
$$ = dispatch1(begin, $3);
|
||||
%*/
|
||||
}
|
||||
| tLPAREN_ARG {lex_state = EXPR_ENDARG;} rparen
|
||||
| tLPAREN_ARG {SET_LEX_STATE(EXPR_ENDARG);} rparen
|
||||
{
|
||||
/*%%%*/
|
||||
$$ = 0;
|
||||
|
@ -2699,7 +2706,7 @@ primary : literal
|
|||
$<val>1 = cmdarg_stack;
|
||||
cmdarg_stack = 0;
|
||||
}
|
||||
expr {lex_state = EXPR_ENDARG;} rparen
|
||||
expr {SET_LEX_STATE(EXPR_ENDARG);} rparen
|
||||
{
|
||||
cmdarg_stack = $<val>1;
|
||||
/*%%%*/
|
||||
|
@ -3037,11 +3044,11 @@ primary : literal
|
|||
in_def = $<num>4 & 1;
|
||||
current_arg = $<id>3;
|
||||
}
|
||||
| k_def singleton dot_or_colon {lex_state = EXPR_FNAME;} fname
|
||||
| k_def singleton dot_or_colon {SET_LEX_STATE(EXPR_FNAME);} fname
|
||||
{
|
||||
$<num>4 = in_single;
|
||||
in_single = 1;
|
||||
lex_state = EXPR_ENDFN|EXPR_LABEL; /* force for args */
|
||||
SET_LEX_STATE(EXPR_ENDFN|EXPR_LABEL); /* force for args */
|
||||
local_push(0);
|
||||
$<id>$ = current_arg;
|
||||
current_arg = 0;
|
||||
|
@ -4305,7 +4312,7 @@ string_content : tSTRING_CONTENT
|
|||
{
|
||||
$<node>$ = lex_strterm;
|
||||
lex_strterm = 0;
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
}
|
||||
string_dvar
|
||||
{
|
||||
|
@ -4329,7 +4336,7 @@ string_content : tSTRING_CONTENT
|
|||
}
|
||||
{
|
||||
$<num>$ = lex_state;
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
}
|
||||
{
|
||||
$<num>$ = brace_nest;
|
||||
|
@ -4344,7 +4351,7 @@ string_content : tSTRING_CONTENT
|
|||
cond_stack = $<val>1;
|
||||
cmdarg_stack = $<val>2;
|
||||
lex_strterm = $<node>3;
|
||||
lex_state = $<num>4;
|
||||
SET_LEX_STATE($<num>4);
|
||||
brace_nest = $<num>5;
|
||||
heredoc_indent = $<num>6;
|
||||
heredoc_line_indent = -1;
|
||||
|
@ -4386,7 +4393,7 @@ string_dvar : tGVAR
|
|||
|
||||
symbol : tSYMBEG sym
|
||||
{
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
/*%%%*/
|
||||
$$ = $2;
|
||||
/*%
|
||||
|
@ -4403,7 +4410,7 @@ sym : fname
|
|||
|
||||
dsym : tSYMBEG xstring_contents tSTRING_END
|
||||
{
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
/*%%%*/
|
||||
$$ = dsym_node($2);
|
||||
/*%
|
||||
|
@ -4493,7 +4500,7 @@ backref : tNTH_REF
|
|||
|
||||
superclass : '<'
|
||||
{
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
command_start = TRUE;
|
||||
}
|
||||
expr_value term
|
||||
|
@ -4517,7 +4524,7 @@ f_arglist : '(' f_args rparen
|
|||
/*%
|
||||
$$ = dispatch1(paren, $2);
|
||||
%*/
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
command_start = TRUE;
|
||||
}
|
||||
| {
|
||||
|
@ -4529,7 +4536,7 @@ f_arglist : '(' f_args rparen
|
|||
{
|
||||
parser->in_kwarg = !!$<num>1;
|
||||
$$ = $2;
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
command_start = TRUE;
|
||||
}
|
||||
;
|
||||
|
@ -4982,7 +4989,7 @@ singleton : var_ref
|
|||
$$ = $1;
|
||||
%*/
|
||||
}
|
||||
| '(' {lex_state = EXPR_BEG;} expr rparen
|
||||
| '(' {SET_LEX_STATE(EXPR_BEG);} expr rparen
|
||||
{
|
||||
/*%%%*/
|
||||
if ($3 == 0) {
|
||||
|
@ -7371,7 +7378,7 @@ parse_numeric(struct parser_params *parser, int c)
|
|||
int suffix;
|
||||
|
||||
is_float = seen_point = seen_e = nondigit = 0;
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
newtok();
|
||||
if (c == '-' || c == '+') {
|
||||
tokadd(c);
|
||||
|
@ -7606,7 +7613,7 @@ parse_qmark(struct parser_params *parser)
|
|||
register int c;
|
||||
|
||||
if (IS_END()) {
|
||||
lex_state = EXPR_VALUE;
|
||||
SET_LEX_STATE(EXPR_VALUE);
|
||||
return '?';
|
||||
}
|
||||
c = nextc();
|
||||
|
@ -7643,7 +7650,7 @@ parse_qmark(struct parser_params *parser)
|
|||
}
|
||||
ternary:
|
||||
pushback(c);
|
||||
lex_state = EXPR_VALUE;
|
||||
SET_LEX_STATE(EXPR_VALUE);
|
||||
return '?';
|
||||
}
|
||||
newtok();
|
||||
|
@ -7680,7 +7687,7 @@ parse_qmark(struct parser_params *parser)
|
|||
}
|
||||
tokfix();
|
||||
set_yylval_str(STR_NEW3(tok(), toklen(), enc, 0));
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
return tCHAR;
|
||||
}
|
||||
|
||||
|
@ -7760,7 +7767,7 @@ parse_percent(struct parser_params *parser, const int space_seen, const enum lex
|
|||
|
||||
case 's':
|
||||
lex_strterm = NEW_STRTERM(str_ssym, term, paren);
|
||||
lex_state = EXPR_FNAME;
|
||||
SET_LEX_STATE(EXPR_FNAME);
|
||||
return tSYMBEG;
|
||||
|
||||
default:
|
||||
|
@ -7770,13 +7777,13 @@ parse_percent(struct parser_params *parser, const int space_seen, const enum lex
|
|||
}
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id('%');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
if (IS_SPCARG(c)) {
|
||||
goto quotation;
|
||||
}
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||
pushback(c);
|
||||
warn_balanced("%%", "string literal");
|
||||
return '%';
|
||||
|
@ -7801,7 +7808,7 @@ tokenize_ident(struct parser_params *parser, const enum lex_state_e last_state)
|
|||
set_yylval_name(ident);
|
||||
if (!IS_lex_state_for(last_state, EXPR_DOT|EXPR_FNAME) &&
|
||||
is_local_id(ident) && lvar_defined(ident)) {
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7831,7 +7838,7 @@ parse_gvar(struct parser_params *parser, const enum lex_state_e last_state)
|
|||
{
|
||||
register int c;
|
||||
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
newtok();
|
||||
c = nextc();
|
||||
switch (c) {
|
||||
|
@ -7923,7 +7930,7 @@ parse_gvar(struct parser_params *parser, const enum lex_state_e last_state)
|
|||
}
|
||||
|
||||
if (tokadd_ident(parser, c)) return 0;
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
tokenize_ident(parser, last_state);
|
||||
return tGVAR;
|
||||
}
|
||||
|
@ -7962,7 +7969,7 @@ parse_atmark(struct parser_params *parser, const enum lex_state_e last_state)
|
|||
}
|
||||
|
||||
if (tokadd_ident(parser, c)) return 0;
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
tokenize_ident(parser, last_state);
|
||||
return result;
|
||||
}
|
||||
|
@ -8013,7 +8020,7 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
|
|||
|
||||
if (IS_LABEL_POSSIBLE()) {
|
||||
if (IS_LABEL_SUFFIX(0)) {
|
||||
lex_state = EXPR_ARG|EXPR_LABELED;
|
||||
SET_LEX_STATE(EXPR_ARG|EXPR_LABELED);
|
||||
nextc();
|
||||
set_yylval_name(TOK_INTERN());
|
||||
return tLABEL;
|
||||
|
@ -8026,7 +8033,7 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
|
|||
kw = rb_reserved_word(tok(), toklen());
|
||||
if (kw) {
|
||||
enum lex_state_e state = lex_state;
|
||||
lex_state = kw->state;
|
||||
SET_LEX_STATE(kw->state);
|
||||
if (IS_lex_state_for(state, EXPR_FNAME)) {
|
||||
set_yylval_name(rb_intern2(tok(), toklen()));
|
||||
return kw->id[0];
|
||||
|
@ -8051,7 +8058,7 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
|
|||
return kw->id[0];
|
||||
else {
|
||||
if (kw->id[0] != kw->id[1])
|
||||
lex_state = EXPR_BEG | EXPR_LABEL;
|
||||
SET_LEX_STATE(EXPR_BEG | EXPR_LABEL);
|
||||
return kw->id[1];
|
||||
}
|
||||
}
|
||||
|
@ -8059,17 +8066,17 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
|
|||
|
||||
if (IS_lex_state(EXPR_BEG_ANY | EXPR_ARG_ANY | EXPR_DOT)) {
|
||||
if (cmd_state) {
|
||||
lex_state = EXPR_CMDARG;
|
||||
SET_LEX_STATE(EXPR_CMDARG);
|
||||
}
|
||||
else {
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
}
|
||||
}
|
||||
else if (lex_state == EXPR_FNAME) {
|
||||
lex_state = EXPR_ENDFN;
|
||||
SET_LEX_STATE(EXPR_ENDFN);
|
||||
}
|
||||
else {
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
}
|
||||
|
||||
tokenize_ident(parser, last_state);
|
||||
|
@ -8093,7 +8100,7 @@ parser_yylex(struct parser_params *parser)
|
|||
token = here_document(lex_strterm);
|
||||
if (token == tSTRING_END) {
|
||||
lex_strterm = 0;
|
||||
lex_state = EXPR_END;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -8108,7 +8115,7 @@ parser_yylex(struct parser_params *parser)
|
|||
if (token == tSTRING_END || token == tREGEXP_END || token == tLABEL_END) {
|
||||
rb_gc_force_recycle((VALUE)lex_strterm);
|
||||
lex_strterm = 0;
|
||||
lex_state = token == tLABEL_END ? EXPR_BEG|EXPR_LABEL : EXPR_END;
|
||||
SET_LEX_STATE(token == tLABEL_END ? EXPR_BEG|EXPR_LABEL : EXPR_END);
|
||||
}
|
||||
}
|
||||
return token;
|
||||
|
@ -8201,14 +8208,14 @@ parser_yylex(struct parser_params *parser)
|
|||
}
|
||||
normal_newline:
|
||||
command_start = TRUE;
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return '\n';
|
||||
|
||||
case '*':
|
||||
if ((c = nextc()) == '*') {
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id(tPOW);
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8227,7 +8234,7 @@ parser_yylex(struct parser_params *parser)
|
|||
else {
|
||||
if (c == '=') {
|
||||
set_yylval_id('*');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8243,19 +8250,19 @@ parser_yylex(struct parser_params *parser)
|
|||
c = '*';
|
||||
}
|
||||
}
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||
return c;
|
||||
|
||||
case '!':
|
||||
c = nextc();
|
||||
if (IS_AFTER_OPERATOR()) {
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
if (c == '@') {
|
||||
return '!';
|
||||
}
|
||||
}
|
||||
else {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
}
|
||||
if (c == '=') {
|
||||
return tNEQ;
|
||||
|
@ -8297,7 +8304,7 @@ parser_yylex(struct parser_params *parser)
|
|||
}
|
||||
}
|
||||
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||
if ((c = nextc()) == '=') {
|
||||
if ((c = nextc()) == '=') {
|
||||
return tEQQ;
|
||||
|
@ -8325,12 +8332,12 @@ parser_yylex(struct parser_params *parser)
|
|||
if (token) return token;
|
||||
}
|
||||
if (IS_AFTER_OPERATOR()) {
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
}
|
||||
else {
|
||||
if (IS_lex_state(EXPR_CLASS))
|
||||
command_start = TRUE;
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
}
|
||||
if (c == '=') {
|
||||
if ((c = nextc()) == '>') {
|
||||
|
@ -8342,7 +8349,7 @@ parser_yylex(struct parser_params *parser)
|
|||
if (c == '<') {
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id(tLSHFT);
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8353,14 +8360,14 @@ parser_yylex(struct parser_params *parser)
|
|||
return '<';
|
||||
|
||||
case '>':
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||
if ((c = nextc()) == '=') {
|
||||
return tGEQ;
|
||||
}
|
||||
if (c == '>') {
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id(tRSHFT);
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8376,14 +8383,14 @@ parser_yylex(struct parser_params *parser)
|
|||
|
||||
case '`':
|
||||
if (IS_lex_state(EXPR_FNAME)) {
|
||||
lex_state = EXPR_ENDFN;
|
||||
SET_LEX_STATE(EXPR_ENDFN);
|
||||
return c;
|
||||
}
|
||||
if (IS_lex_state(EXPR_DOT)) {
|
||||
if (cmd_state)
|
||||
lex_state = EXPR_CMDARG;
|
||||
SET_LEX_STATE(EXPR_CMDARG);
|
||||
else
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
return c;
|
||||
}
|
||||
lex_strterm = NEW_STRTERM(str_xquote, '`', 0);
|
||||
|
@ -8399,10 +8406,10 @@ parser_yylex(struct parser_params *parser)
|
|||
|
||||
case '&':
|
||||
if ((c = nextc()) == '&') {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id(tANDOP);
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8410,11 +8417,11 @@ parser_yylex(struct parser_params *parser)
|
|||
}
|
||||
else if (c == '=') {
|
||||
set_yylval_id('&');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
else if (c == '.') {
|
||||
lex_state = EXPR_DOT;
|
||||
SET_LEX_STATE(EXPR_DOT);
|
||||
return tANDDOT;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8429,15 +8436,15 @@ parser_yylex(struct parser_params *parser)
|
|||
warn_balanced("&", "argument prefix");
|
||||
c = '&';
|
||||
}
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||
return c;
|
||||
|
||||
case '|':
|
||||
if ((c = nextc()) == '|') {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id(tOROP);
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8445,17 +8452,17 @@ parser_yylex(struct parser_params *parser)
|
|||
}
|
||||
if (c == '=') {
|
||||
set_yylval_id('|');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG|EXPR_LABEL;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG|EXPR_LABEL);
|
||||
pushback(c);
|
||||
return '|';
|
||||
|
||||
case '+':
|
||||
c = nextc();
|
||||
if (IS_AFTER_OPERATOR()) {
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
if (c == '@') {
|
||||
return tUPLUS;
|
||||
}
|
||||
|
@ -8464,18 +8471,18 @@ parser_yylex(struct parser_params *parser)
|
|||
}
|
||||
if (c == '=') {
|
||||
set_yylval_id('+');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous('+'))) {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
pushback(c);
|
||||
if (c != -1 && ISDIGIT(c)) {
|
||||
return parse_numeric(parser, '+');
|
||||
}
|
||||
return tUPLUS;
|
||||
}
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
pushback(c);
|
||||
warn_balanced("+", "unary operator");
|
||||
return '+';
|
||||
|
@ -8483,7 +8490,7 @@ parser_yylex(struct parser_params *parser)
|
|||
case '-':
|
||||
c = nextc();
|
||||
if (IS_AFTER_OPERATOR()) {
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
if (c == '@') {
|
||||
return tUMINUS;
|
||||
}
|
||||
|
@ -8492,28 +8499,28 @@ parser_yylex(struct parser_params *parser)
|
|||
}
|
||||
if (c == '=') {
|
||||
set_yylval_id('-');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
if (c == '>') {
|
||||
lex_state = EXPR_ENDFN;
|
||||
SET_LEX_STATE(EXPR_ENDFN);
|
||||
return tLAMBDA;
|
||||
}
|
||||
if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous('-'))) {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
pushback(c);
|
||||
if (c != -1 && ISDIGIT(c)) {
|
||||
return tUMINUS_NUM;
|
||||
}
|
||||
return tUMINUS;
|
||||
}
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
pushback(c);
|
||||
warn_balanced("-", "unary operator");
|
||||
return '-';
|
||||
|
||||
case '.':
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
if ((c = nextc()) == '.') {
|
||||
if ((c = nextc()) == '.') {
|
||||
return tDOT3;
|
||||
|
@ -8525,7 +8532,7 @@ parser_yylex(struct parser_params *parser)
|
|||
if (c != -1 && ISDIGIT(c)) {
|
||||
yyerror("no .<digit> floating literal anymore; put 0 before dot");
|
||||
}
|
||||
lex_state = EXPR_DOT;
|
||||
SET_LEX_STATE(EXPR_DOT);
|
||||
return '.';
|
||||
|
||||
case '0': case '1': case '2': case '3': case '4':
|
||||
|
@ -8539,9 +8546,9 @@ parser_yylex(struct parser_params *parser)
|
|||
COND_LEXPOP();
|
||||
CMDARG_LEXPOP();
|
||||
if (c == ')')
|
||||
lex_state = EXPR_ENDFN;
|
||||
SET_LEX_STATE(EXPR_ENDFN);
|
||||
else
|
||||
lex_state = EXPR_ENDARG;
|
||||
SET_LEX_STATE(EXPR_ENDARG);
|
||||
if (c == '}') {
|
||||
if (!brace_nest--) c = tSTRING_DEND;
|
||||
}
|
||||
|
@ -8551,16 +8558,16 @@ parser_yylex(struct parser_params *parser)
|
|||
c = nextc();
|
||||
if (c == ':') {
|
||||
if (IS_BEG() || IS_lex_state(EXPR_CLASS) || IS_SPCARG(-1)) {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tCOLON3;
|
||||
}
|
||||
lex_state = EXPR_DOT;
|
||||
SET_LEX_STATE(EXPR_DOT);
|
||||
return tCOLON2;
|
||||
}
|
||||
if (IS_END() || ISSPACE(c) || c == '#') {
|
||||
pushback(c);
|
||||
warn_balanced(":", "symbol literal");
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return ':';
|
||||
}
|
||||
switch (c) {
|
||||
|
@ -8574,7 +8581,7 @@ parser_yylex(struct parser_params *parser)
|
|||
pushback(c);
|
||||
break;
|
||||
}
|
||||
lex_state = EXPR_FNAME;
|
||||
SET_LEX_STATE(EXPR_FNAME);
|
||||
return tSYMBEG;
|
||||
|
||||
case '/':
|
||||
|
@ -8584,7 +8591,7 @@ parser_yylex(struct parser_params *parser)
|
|||
}
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id('/');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
pushback(c);
|
||||
|
@ -8593,27 +8600,27 @@ parser_yylex(struct parser_params *parser)
|
|||
lex_strterm = NEW_STRTERM(str_regexp, '/', 0);
|
||||
return tREGEXP_BEG;
|
||||
}
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||
warn_balanced("/", "regexp literal");
|
||||
return '/';
|
||||
|
||||
case '^':
|
||||
if ((c = nextc()) == '=') {
|
||||
set_yylval_id('^');
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
return tOP_ASGN;
|
||||
}
|
||||
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
||||
SET_LEX_STATE(IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG);
|
||||
pushback(c);
|
||||
return '^';
|
||||
|
||||
case ';':
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
command_start = TRUE;
|
||||
return ';';
|
||||
|
||||
case ',':
|
||||
lex_state = EXPR_BEG|EXPR_LABEL;
|
||||
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
|
||||
return ',';
|
||||
|
||||
case '~':
|
||||
|
@ -8621,10 +8628,10 @@ parser_yylex(struct parser_params *parser)
|
|||
if ((c = nextc()) != '@') {
|
||||
pushback(c);
|
||||
}
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
}
|
||||
else {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
}
|
||||
return '~';
|
||||
|
||||
|
@ -8638,13 +8645,13 @@ parser_yylex(struct parser_params *parser)
|
|||
paren_nest++;
|
||||
COND_PUSH(0);
|
||||
CMDARG_PUSH(0);
|
||||
lex_state = EXPR_BEG|EXPR_LABEL;
|
||||
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
|
||||
return c;
|
||||
|
||||
case '[':
|
||||
paren_nest++;
|
||||
if (IS_AFTER_OPERATOR()) {
|
||||
lex_state = EXPR_ARG;
|
||||
SET_LEX_STATE(EXPR_ARG);
|
||||
if ((c = nextc()) == ']') {
|
||||
if ((c = nextc()) == '=') {
|
||||
return tASET;
|
||||
|
@ -8662,7 +8669,7 @@ parser_yylex(struct parser_params *parser)
|
|||
else if (IS_ARG() && (space_seen || IS_lex_state(EXPR_LABELED))) {
|
||||
c = tLBRACK;
|
||||
}
|
||||
lex_state = EXPR_BEG|EXPR_LABEL;
|
||||
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
|
||||
COND_PUSH(0);
|
||||
CMDARG_PUSH(0);
|
||||
return c;
|
||||
|
@ -8670,7 +8677,7 @@ parser_yylex(struct parser_params *parser)
|
|||
case '{':
|
||||
++brace_nest;
|
||||
if (lpar_beg && lpar_beg == paren_nest) {
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
lpar_beg = 0;
|
||||
--paren_nest;
|
||||
COND_PUSH(0);
|
||||
|
@ -8687,7 +8694,7 @@ parser_yylex(struct parser_params *parser)
|
|||
c = tLBRACE; /* hash */
|
||||
COND_PUSH(0);
|
||||
CMDARG_PUSH(0);
|
||||
lex_state = EXPR_BEG;
|
||||
SET_LEX_STATE(EXPR_BEG);
|
||||
if (c != tLBRACE_ARG) lex_state |= EXPR_LABEL;
|
||||
if (c != tLBRACE) command_start = TRUE;
|
||||
return c;
|
||||
|
|
Загрузка…
Ссылка в новой задаче