* parse.y (parse_ident): simplified selecting identifier types by
  the suffix.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59458 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-08-01 08:32:18 +00:00
Родитель fb29a4dcda
Коммит 4eafec5ea6
1 изменённых файлов: 8 добавлений и 25 удалений

33
parse.y
Просмотреть файл

@ -7793,7 +7793,7 @@ parse_atmark(struct parser_params *parser, const enum lex_state_e last_state)
static enum yytokentype static enum yytokentype
parse_ident(struct parser_params *parser, int c, int cmd_state) parse_ident(struct parser_params *parser, int c, int cmd_state)
{ {
enum yytokentype result = 0; enum yytokentype result;
int mb = ENC_CODERANGE_7BIT; int mb = ENC_CODERANGE_7BIT;
const enum lex_state_e last_state = lex_state; const enum lex_state_e last_state = lex_state;
ID ident; ID ident;
@ -7804,37 +7804,20 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
c = nextc(); c = nextc();
} while (parser_is_identchar()); } while (parser_is_identchar());
if ((c == '!' || c == '?') && !peek('=')) { if ((c == '!' || c == '?') && !peek('=')) {
result = tFID;
tokadd(c);
}
else if (c == '=' && IS_lex_state(EXPR_FNAME) &&
(!peek('~') && !peek('>') && (!peek('=') || (peek_n('>', 1))))) {
result = tIDENTIFIER;
tokadd(c); tokadd(c);
} }
else { else {
result = ISUPPER(tok()[0]) ? tCONSTANT : tIDENTIFIER;
pushback(c); pushback(c);
} }
tokfix(); tokfix();
if (toklast() == '!' || toklast() == '?') {
result = tFID;
}
else {
if (IS_lex_state(EXPR_FNAME)) {
register int c = nextc();
if (c == '=' && !peek('~') && !peek('>') &&
(!peek('=') || (peek_n('>', 1)))) {
result = tIDENTIFIER;
tokadd(c);
tokfix();
}
else {
pushback(c);
}
}
if (result == 0 && ISUPPER(tok()[0])) {
result = tCONSTANT;
}
else {
result = tIDENTIFIER;
}
}
if (IS_LABEL_POSSIBLE()) { if (IS_LABEL_POSSIBLE()) {
if (IS_LABEL_SUFFIX(0)) { if (IS_LABEL_SUFFIX(0)) {
SET_LEX_STATE(EXPR_ARG|EXPR_LABELED); SET_LEX_STATE(EXPR_ARG|EXPR_LABELED);