Mercurial > hg > octave-nkf
diff libinterp/parse-tree/lex.ll @ 16683:e1c6ad54259f classdef
maint: periodic merge of default to classdef
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 18 May 2013 22:43:10 -0400 |
parents | 450c03932d6c d3619d4d267c |
children | 498b2dd1bd56 |
line wrap: on
line diff
--- a/libinterp/parse-tree/lex.ll +++ b/libinterp/parse-tree/lex.ll @@ -147,13 +147,31 @@ } \ while (0) +#define CMD_OR_COMPUTED_ASSIGN_OP(PATTERN, TOK) \ + \ + do \ + { \ + curr_lexer->lexer_debug (PATTERN); \ + \ + if (curr_lexer->previous_token_may_be_command ()) \ + { \ + yyless (0); \ + curr_lexer->push_start_state (COMMAND_START); \ + } \ + else \ + { \ + return curr_lexer->handle_incompatible_op (PATTERN, TOK, false); \ + } \ + } \ + while (0) + #define CMD_OR_UNARY_OP(PATTERN, TOK, COMPAT) \ \ do \ { \ curr_lexer->lexer_debug (PATTERN); \ \ - if (curr_lexer->looks_like_command_arg ()) \ + if (curr_lexer->previous_token_may_be_command ()) \ { \ yyless (0); \ curr_lexer->push_start_state (COMMAND_START); \ @@ -737,13 +755,21 @@ {IDENT}@{IDENT}.{IDENT} { curr_lexer->lexer_debug ("{IDENT}@{IDENT}|{IDENT}@{IDENT}.{IDENT}"); - int id_tok = curr_lexer->handle_superclass_identifier (); - - if (id_tok >= 0) + if (curr_lexer->previous_token_may_be_command ()) + { + yyless (0); + curr_lexer->push_start_state (COMMAND_START); + } + else { - curr_lexer->looking_for_object_index = true; - - return curr_lexer->count_token_internal (id_tok); + int id_tok = curr_lexer->handle_superclass_identifier (); + + if (id_tok >= 0) + { + curr_lexer->looking_for_object_index = true; + + return curr_lexer->count_token_internal (id_tok); + } } } @@ -755,13 +781,22 @@ \?{IDENT}\.{IDENT} { curr_lexer->lexer_debug ("\\?{IDENT}|\\?{IDENT}\\.{IDENT}"); - int id_tok = curr_lexer->handle_meta_identifier (); - - if (id_tok >= 0) + if (curr_lexer->previous_token_may_be_command () + && curr_lexer->space_follows_previous_token ()) + { + yyless (0); + curr_lexer->push_start_state (COMMAND_START); + } + else { - curr_lexer->looking_for_object_index = true; - - return curr_lexer->count_token_internal (id_tok); + int id_tok = curr_lexer->handle_meta_identifier (); + + if (id_tok >= 0) + { + curr_lexer->looking_for_object_index = true; + + return curr_lexer->count_token_internal (id_tok); + } } } @@ -828,6 +863,12 @@ yyless (0); curr_lexer->push_start_state (COMMAND_START); } + else if (curr_lexer->at_beginning_of_statement) + { + curr_lexer->current_input_column++; + int retval = curr_lexer->handle_string ('\''); + return curr_lexer->count_token_internal (retval); + } else { int tok = curr_lexer->previous_token_value (); @@ -996,37 +1037,8 @@ return curr_lexer->handle_op (".'", TRANSPOSE, false); } -"++" { - curr_lexer->lexer_debug ("++"); - - int tok = curr_lexer->handle_incompatible_unary_op (PLUS_PLUS, false); - - if (tok < 0) - { - yyless (0); - curr_lexer->xunput (','); - // Adjust for comma that was not really in the input stream. - curr_lexer->current_input_column--; - } - else - return tok; - } - -"--" { - curr_lexer->lexer_debug ("--"); - - int tok = curr_lexer->handle_incompatible_unary_op (MINUS_MINUS, false); - - if (tok < 0) - { - yyless (0); - curr_lexer->xunput (','); - // Adjust for comma that was not really in the input stream. - curr_lexer->current_input_column--; - } - else - return tok; - } +"++" { CMD_OR_UNARY_OP ("++", PLUS_PLUS, false); } +"--" { CMD_OR_UNARY_OP ("--", MINUS_MINUS, false); } "(" { curr_lexer->lexer_debug ("("); @@ -1119,24 +1131,24 @@ return curr_lexer->handle_op ("=", '='); } -"+=" { return curr_lexer->handle_incompatible_op ("+=", ADD_EQ); } -"-=" { return curr_lexer->handle_incompatible_op ("-=", SUB_EQ); } -"*=" { return curr_lexer->handle_incompatible_op ("*=", MUL_EQ); } -"/=" { return curr_lexer->handle_incompatible_op ("/=", DIV_EQ); } -"\\=" { return curr_lexer->handle_incompatible_op ("\\=", LEFTDIV_EQ); } -".+=" { return curr_lexer->handle_incompatible_op (".+=", ADD_EQ); } -".-=" { return curr_lexer->handle_incompatible_op (".-=", SUB_EQ); } -".*=" { return curr_lexer->handle_incompatible_op (".*=", EMUL_EQ); } -"./=" { return curr_lexer->handle_incompatible_op ("./=", EDIV_EQ); } -".\\=" { return curr_lexer->handle_incompatible_op (".\\=", ELEFTDIV_EQ); } -"^=" { return curr_lexer->handle_incompatible_op ("^=", POW_EQ); } -"**=" { return curr_lexer->handle_incompatible_op ("^=", POW_EQ); } -".^=" { return curr_lexer->handle_incompatible_op (".^=", EPOW_EQ); } -".**=" { return curr_lexer->handle_incompatible_op (".^=", EPOW_EQ); } -"&=" { return curr_lexer->handle_incompatible_op ("&=", AND_EQ); } -"|=" { return curr_lexer->handle_incompatible_op ("|=", OR_EQ); } -"<<=" { return curr_lexer->handle_incompatible_op ("<<=", LSHIFT_EQ); } -">>=" { return curr_lexer->handle_incompatible_op (">>=", RSHIFT_EQ); } +"+=" { CMD_OR_COMPUTED_ASSIGN_OP ("+=", ADD_EQ); } +"-=" { CMD_OR_COMPUTED_ASSIGN_OP ("-=", SUB_EQ); } +"*=" { CMD_OR_COMPUTED_ASSIGN_OP ("*=", MUL_EQ); } +"/=" { CMD_OR_COMPUTED_ASSIGN_OP ("/=", DIV_EQ); } +"\\=" { CMD_OR_COMPUTED_ASSIGN_OP ("\\=", LEFTDIV_EQ); } +".+=" { CMD_OR_COMPUTED_ASSIGN_OP (".+=", ADD_EQ); } +".-=" { CMD_OR_COMPUTED_ASSIGN_OP (".-=", SUB_EQ); } +".*=" { CMD_OR_COMPUTED_ASSIGN_OP (".*=", EMUL_EQ); } +"./=" { CMD_OR_COMPUTED_ASSIGN_OP ("./=", EDIV_EQ); } +".\\=" { CMD_OR_COMPUTED_ASSIGN_OP (".\\=", ELEFTDIV_EQ); } +"^=" { CMD_OR_COMPUTED_ASSIGN_OP ("^=", POW_EQ); } +"**=" { CMD_OR_COMPUTED_ASSIGN_OP ("^=", POW_EQ); } +".^=" { CMD_OR_COMPUTED_ASSIGN_OP (".^=", EPOW_EQ); } +".**=" { CMD_OR_COMPUTED_ASSIGN_OP (".^=", EPOW_EQ); } +"&=" { CMD_OR_COMPUTED_ASSIGN_OP ("&=", AND_EQ); } +"|=" { CMD_OR_COMPUTED_ASSIGN_OP ("|=", OR_EQ); } +"<<=" { CMD_OR_COMPUTED_ASSIGN_OP ("<<=", LSHIFT_EQ); } +">>=" { CMD_OR_COMPUTED_ASSIGN_OP (">>=", RSHIFT_EQ); } %{ // In Matlab, '{' may also trigger command syntax.