# HG changeset patch # User jwe # Date 1068782104 0 # Node ID 22ca4cc02525a5e5257616694b125c799080e0cb # Parent eb84ffc19e449b49c394aa655e630873c96013ef [project @ 2003-11-14 03:55:04 by jwe] diff -r eb84ffc19e44 -r 22ca4cc02525 src/ChangeLog --- a/src/ChangeLog Thu Nov 13 20:17:52 2003 +0000 +++ b/src/ChangeLog Fri Nov 14 03:55:04 2003 +0000 @@ -1,5 +1,25 @@ 2003-11-13 John W. Eaton + * ov-file.h (octave_file::all, octave_file::any, + octave_file::dims, octave_file::is_real_type, + octave_file::ist_real_scalar): New functions. + + * lex.l (bracket_brace_paren_nesting_level::is_bracket_or_brace): + New function. + (handle_close_bracket): New arg, bracket_type. Change all uses. + Return bool, not int. First arg is now bool. + ({SNLCMT}*\}{S}*): New pattern. + (maybe_unput_comma): Handle brace nesting level the same as brackets. + (handle_close_brace): Likewise. + ({S}+): Likewise. + ({S}*{COMMENT}{SNLCMT}*): Likewise. + ({S}*{NL}{SNLCMT}*): Likewise. + ({NL}): Likewise. + ({CCHAR}): Likewise. + (")"): Likewise. + (\{{S}*): Handle the same as \[{S}*. + ("}"): Handle the same as \]. + * Makefile.in (stamp-prereq): Add oct-gperf.h, parse.cc, and lex.cc to the list. diff -r eb84ffc19e44 -r 22ca4cc02525 src/lex.l --- a/src/lex.l Thu Nov 13 20:17:52 2003 +0000 +++ b/src/lex.l Fri Nov 14 03:55:04 2003 +0000 @@ -122,6 +122,10 @@ bool is_paren (void) { return ! context.empty () && context.top () == PAREN; } + bool is_bracket_or_brace (void) + { return (! context.empty () + && (context.top () == BRACKET || context.top () == BRACE)); } + bool none (void) { return context.empty (); } void remove (void) { if (! context.empty ()) context.pop (); } @@ -167,7 +171,7 @@ static std::string strip_trailing_whitespace (char *s); static void handle_number (void); static int handle_string (char delim, int text_style = 0); -static int handle_close_bracket (int spc_gobbled); +static char handle_close_bracket (bool spc_gobbled, char bracket_type); static int handle_identifier (void); static bool have_continuation (bool trailing_comments_ok = true); static bool have_ellipsis_continuation (bool trailing_comments_ok = true); @@ -272,8 +276,17 @@ fixup_column_count (yytext); int c = yytext[yyleng-1]; int cont_is_spc = eat_continuation (); - int spc_gobbled = (cont_is_spc || c == ' ' || c == '\t'); - return handle_close_bracket (spc_gobbled); + bool spc_gobbled = (cont_is_spc || c == ' ' || c == '\t'); + return handle_close_bracket (spc_gobbled, ']'); + } + +{SNLCMT}*\}{S}* { + scan_for_comments (yytext); + fixup_column_count (yytext); + int c = yytext[yyleng-1]; + int cont_is_spc = eat_continuation (); + bool spc_gobbled = (cont_is_spc || c == ' ' || c == '\t'); + return handle_close_bracket (spc_gobbled, '}'); } %{ @@ -316,7 +329,7 @@ int postfix_un_op = next_token_is_postfix_unary_op (true); if (! (postfix_un_op || bin_op) - && nesting_level.is_bracket () + && nesting_level.is_bracket_or_brace () && lexer_flags.convert_spaces_to_comma) { if ((tmp & ATE_NEWLINE) == ATE_NEWLINE) @@ -371,7 +384,7 @@ if (nesting_level.none ()) return LEXICAL_ERROR; - if (nesting_level.is_bracket ()) + if (nesting_level.is_bracket_or_brace ()) { maybe_warn_separator_insert (';'); @@ -527,7 +540,7 @@ return '\n'; else if (nesting_level.is_paren ()) gripe_matlab_incompatible ("bare newline inside parentheses"); - else if (nesting_level.is_bracket ()) + else if (nesting_level.is_bracket_or_brace ()) return LEXICAL_ERROR; } @@ -627,7 +640,7 @@ if (nesting_level.none ()) return '\n'; - else if (nesting_level.is_bracket ()) + else if (nesting_level.is_bracket_or_brace ()) return ';'; } @@ -704,7 +717,7 @@ current_input_column++; lexer_flags.cant_be_identifier = true; lexer_flags.quote_is_transpose = true; - lexer_flags.convert_spaces_to_comma = nesting_level.is_bracket (); + lexer_flags.convert_spaces_to_comma = nesting_level.is_bracket_or_brace (); do_comma_insert_check (); return ')'; } @@ -730,22 +743,26 @@ "<<=" { XBIN_OP_RETURN (LSHIFT_EQ, false); } ">>=" { XBIN_OP_RETURN (RSHIFT_EQ, false); } -"{" { +\{{S}* { nesting_level.brace (); + + current_input_column += yyleng; + lexer_flags.quote_is_transpose = false; + lexer_flags.cant_be_identifier = false; + lexer_flags.convert_spaces_to_comma = true; + promptflag--; - TOK_RETURN ('{'); + eat_whitespace (); + + lexer_flags.bracketflag++; + BEGIN (MATRIX_START); + return '{'; } "}" { nesting_level.remove (); - current_input_column++; - lexer_flags.cant_be_identifier = true; - lexer_flags.quote_is_transpose = true; - lexer_flags.convert_spaces_to_comma = nesting_level.is_bracket (); - do_comma_insert_check (); // Is this really necessary? - - return '}'; + TOK_RETURN ('}'); } %{ @@ -2209,10 +2226,10 @@ return retval; } -static int -handle_close_bracket (int spc_gobbled) +static char +handle_close_bracket (bool spc_gobbled, char bracket_type) { - int retval = ']'; + char retval = bracket_type; if (! nesting_level.none ()) { @@ -2223,7 +2240,9 @@ if (lexer_flags.bracketflag == 0) BEGIN (INITIAL); - if (next_token_is_assign_op () && ! lexer_flags.looking_at_return_list) + if (bracket_type == ']' + && next_token_is_assign_op () + && ! lexer_flags.looking_at_return_list) { retval = CLOSE_BRACE; } @@ -2241,13 +2260,13 @@ int sep_op = next_token_is_sep_op (); if (! (postfix_un_op || bin_op || sep_op) - && nesting_level.is_bracket () + && nesting_level.is_bracket_or_brace () && lexer_flags.convert_spaces_to_comma) { maybe_warn_separator_insert (','); yyunput (',', yytext); - return ']'; + return retval; } } } @@ -2262,7 +2281,7 @@ static void maybe_unput_comma (int spc_gobbled) { - if (nesting_level.is_bracket ()) + if (nesting_level.is_bracket_or_brace ()) { int bin_op = next_token_is_bin_op (spc_gobbled); diff -r eb84ffc19e44 -r 22ca4cc02525 src/ov-file.h --- a/src/ov-file.h Thu Nov 13 20:17:52 2003 +0000 +++ b/src/ov-file.h Fri Nov 14 03:55:04 2003 +0000 @@ -81,6 +81,18 @@ bool is_stream (void) const { return true; } + // Pretend we are a real scalar for better compatibility, maybe. + + bool is_real_scalar (void) const { return true; } + + bool is_real_type (void) const { return true; } + + dim_vector dims (void) const { static dim_vector dv (1, 1); return dv; } + + octave_value all (int = 0) const { return (number != 0.0); } + + octave_value any (int = 0) const { return (number != 0.0); } + void print (std::ostream& os, bool pr_as_read_syntax = false) const; void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;