
{
{ CLP$SCAN_OPERAND updates its PARSE parameter to designate the
{ next lexical unit that is a separator (space, comment, comma, semicolon or
{ ellipsis) not nested within parentheses.
{ An ellipsis may have spaces on either side of it.
{ This procedure requires that the UNITS_ARRAY field of the PARSE parameter be
{ non-NIL.
{

  PROCEDURE [INLINE] clp$scan_operand
    (    termination_option: (clc$separator, clc$ellipsis);
     VAR parse {input, output} : clt$parse_state);

?? PUSH (LISTEXT := ON) ??

    VAR
      backup_parse: clt$parse_state,
      done: boolean,
      nesting_level: clt$string_size,
      space_pending: boolean,
      spaces_significant: boolean;


    nesting_level := $INTEGER (parse.unit.kind = clc$lex_left_parenthesis);
    spaces_significant := TRUE;
    done := FALSE;
    space_pending := FALSE;

    WHILE (NOT done) AND (parse.unit_index < parse.index_limit) DO
      IF NOT parse.unit_is_space THEN
        parse.previous_non_space_unit := parse.unit;
        parse.previous_non_space_unit_index := parse.unit_index;
      IFEND;

      parse.previous_unit_is_space := parse.unit_is_space;
      parse.unit_index := parse.index;
      parse.units_array_index := parse.units_array_index + 1;
      parse.unit := parse.units_array^ [parse.units_array_index];
      parse.index := parse.index + parse.unit.size;

      parse.unit_is_space := FALSE;
      CASE parse.unit.kind OF
      = clc$lex_space, clc$lex_comment, clc$lex_unterminated_comment =
        parse.unit_is_space := TRUE;
        IF spaces_significant AND (nesting_level <= 0) AND
              (NOT space_pending) THEN
          backup_parse := parse;
          IF termination_option = clc$ellipsis THEN
            space_pending := FALSE;
          ELSE
            space_pending := TRUE;
          IFEND;
        IFEND;
      = clc$lex_ellipsis =
        IF (nesting_level <= 0) AND (termination_option = clc$ellipsis) THEN
          done := TRUE;
          backup_parse := parse;
        ELSE
          spaces_significant := FALSE;
        IFEND;
      = clc$lex_semicolon, clc$lex_comma =
        IF nesting_level <= 0 THEN
          done := TRUE;
        ELSE
          spaces_significant := TRUE;
        IFEND;
      = clc$lex_left_parenthesis =
        done := space_pending;
        nesting_level := nesting_level + 1;
        spaces_significant := TRUE;
      = clc$lex_right_parenthesis =
        IF nesting_level <= 0 THEN
          done := TRUE;
        ELSE
          nesting_level := nesting_level - 1;
          spaces_significant := TRUE;
        IFEND;
      = clc$lex_greater_than .. clc$lex_subtract =
        done := space_pending;
        spaces_significant := FALSE;
      ELSE
        done := space_pending;
        spaces_significant := TRUE;
      CASEND;

      IF (NOT done) AND (NOT parse.unit_is_space) THEN
        space_pending := FALSE
      IFEND;
    WHILEND;

    IF space_pending AND (done OR (parse.unit_index >= parse.index_limit)) THEN
      parse := backup_parse;

    ELSEIF parse.unit.kind = clc$lex_beginning_of_line THEN
      parse.units_array_index := 2;
      parse.unit.kind := clc$lex_end_of_line;
    ELSEIF done AND (parse.unit.kind = clc$lex_ellipsis) THEN
      parse := backup_parse;
    IFEND;

  PROCEND clp$scan_operand;

*copyc clt$lexical_unit_kinds
*copyc clt$parse_state
*copyc clt$string_size
?? POP ??
