Mercurial > hg > octave-jordi
diff src/lex.l @ 3351:8623649c967c
[project @ 1999-11-15 16:17:01 by jwe]
author | jwe |
---|---|
date | Mon, 15 Nov 1999 16:17:06 +0000 |
parents | 7c03933635c6 |
children | 42cb61dd0248 |
line wrap: on
line diff
--- a/src/lex.l +++ b/src/lex.l @@ -86,15 +86,18 @@ const yum_yum ATE_SPACE_OR_TAB = 1; const yum_yum ATE_NEWLINE = 2; -// Is the closest nesting level a square brace or a paren? +// Is the closest nesting level a square bracket, squiggly brace or a paren? -class brace_paren_nesting_level : public SLStack <int> +class bracket_brace_paren_nesting_level : public SLStack <int> { public: - brace_paren_nesting_level (void) : SLStack<int> () { } + bracket_brace_paren_nesting_level (void) : SLStack<int> () { } - ~brace_paren_nesting_level (void) { } + ~bracket_brace_paren_nesting_level (void) { } + + void bracket (void) { push (BRACKET); } + bool is_bracket (void) { return ! empty () && top () == BRACKET; } void brace (void) { push (BRACE); } bool is_brace (void) { return ! empty () && top () == BRACE; } @@ -108,14 +111,15 @@ private: - enum { BRACE = 1, PAREN = 2 }; + enum { BRACKET = 1, BRACE = 2, PAREN = 3 }; - brace_paren_nesting_level (const brace_paren_nesting_level&); + bracket_brace_paren_nesting_level (const bracket_brace_paren_nesting_level&); - brace_paren_nesting_level& operator = (const brace_paren_nesting_level&); + bracket_brace_paren_nesting_level& + operator = (const bracket_brace_paren_nesting_level&); }; -static brace_paren_nesting_level nesting_level; +static bracket_brace_paren_nesting_level nesting_level; // Should whitespace in a literal matrix list be automatically // converted to commas and semicolons? @@ -176,7 +180,7 @@ static 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_brace (int spc_gobbled); +static int handle_close_bracket (int spc_gobbled); static int handle_identifier (const string& tok, int spc_gobbled); static bool have_continuation (bool trailing_comments_ok = true); static bool have_ellipsis_continuation (bool trailing_comments_ok = true); @@ -262,7 +266,7 @@ int c = yytext[yyleng-1]; int cont_is_spc = eat_continuation (); int spc_gobbled = (cont_is_spc || c == ' ' || c == '\t'); - return handle_close_brace (spc_gobbled); + return handle_close_bracket (spc_gobbled); } %{ @@ -299,7 +303,7 @@ int postfix_un_op = next_token_is_postfix_unary_op (true); if (! (postfix_un_op || bin_op) - && nesting_level.is_brace () + && nesting_level.is_bracket () && lexer_flags.convert_spaces_to_comma) { lexer_flags.quote_is_transpose = false; @@ -346,19 +350,19 @@ if (nesting_level.none ()) return LEXICAL_ERROR; - if (nesting_level.is_brace ()) + if (nesting_level.is_bracket ()) return ';'; } } %{ -// Open and close brace are handled differently if we are in the range +// Open and close bracket are handled differently if we are in the range // part of a plot command. // %} \[{S}* { - nesting_level.brace (); + nesting_level.bracket (); current_input_column += yyleng; lexer_flags.quote_is_transpose = false; @@ -375,7 +379,7 @@ } else { - lexer_flags.braceflag++; + lexer_flags.bracketflag++; BEGIN MATRIX; return '['; } @@ -477,7 +481,7 @@ if (nesting_level.none ()) return '\n'; - if (nesting_level.is_brace ()) + if (nesting_level.is_bracket ()) return LEXICAL_ERROR; } @@ -548,7 +552,7 @@ if (nesting_level.none ()) return '\n'; - else if (nesting_level.is_brace ()) + else if (nesting_level.is_bracket ()) return ';'; } @@ -617,7 +621,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_brace (); + lexer_flags.convert_spaces_to_comma = nesting_level.is_bracket (); do_comma_insert_check (); return ')'; } @@ -641,6 +645,24 @@ "<<=" { BIN_OP_RETURN (LSHIFT_EQ, false); } ">>=" { BIN_OP_RETURN (RSHIFT_EQ, false); } +"{" { + nesting_level.brace (); + promptflag--; + TOK_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 '}'; + } + %{ // Unrecognized input is a lexical error. %} @@ -674,7 +696,7 @@ if (spc_gobbled) unput (' '); - lexer_flags.do_comma_insert = (lexer_flags.braceflag && c == '['); + lexer_flags.do_comma_insert = (lexer_flags.bracketflag && c == '['); } // Fix things up for errors or interrupts. The parser is never called @@ -691,7 +713,7 @@ // We do want a prompt by default. promptflag = 1; - // Error may have occurred inside some parentheses or braces. + // Error may have occurred inside some brackets, braces, or parentheses. nesting_level.clear (); // Clear out the stack of token info used to track line and column @@ -1806,17 +1828,17 @@ } static int -handle_close_brace (int spc_gobbled) +handle_close_bracket (int spc_gobbled) { int retval = ']'; if (! nesting_level.none ()) { nesting_level.remove (); - lexer_flags.braceflag--; + lexer_flags.bracketflag--; } - if (lexer_flags.braceflag == 0) + if (lexer_flags.bracketflag == 0) BEGIN 0; if (next_token_is_assign_op () && ! lexer_flags.looking_at_return_list) @@ -1828,7 +1850,7 @@ int c1 = yyinput (); unput (c1); - if (lexer_flags.braceflag && Vwhitespace_in_literal_matrix != 2) + if (lexer_flags.bracketflag && Vwhitespace_in_literal_matrix != 2) { int bin_op = next_token_is_bin_op (spc_gobbled); @@ -1837,7 +1859,7 @@ int sep_op = next_token_is_sep_op (); if (! (postfix_un_op || bin_op || sep_op) - && nesting_level.is_brace () + && nesting_level.is_bracket () && lexer_flags.convert_spaces_to_comma) { unput (','); @@ -1856,7 +1878,7 @@ static void maybe_unput_comma (int spc_gobbled) { - if (Vwhitespace_in_literal_matrix != 2 && nesting_level.is_brace ()) + if (Vwhitespace_in_literal_matrix != 2 && nesting_level.is_bracket ()) { int bin_op = next_token_is_bin_op (spc_gobbled); @@ -1950,7 +1972,7 @@ if (! lexer_flags.in_plot_range) lexer_flags.past_plot_range = true; - // Option keywords can't appear in parentheses or braces. + // Option keywords can't appear in brackets, braces, or parentheses. int plot_option_kw = 0; @@ -2090,7 +2112,7 @@ lexical_feedback::init (void) { // Not initially defining a matrix list. - braceflag = 0; + bracketflag = 0; // Not initially inside a loop or if statement. looping = 0;