
{
{ CLP$SCAN_LEXICAL_UNIT updates its PARSE parameter to designate the
{ lexical unit determined by the TERMINATION_OPTION parameter.
{ This procedure does NOT require that the UNITS_ARRAY field of the PARSE
{ parameter be non-NIL.
{

  PROCEDURE [INLINE] clp$scan_lexical_unit
    (    termination_option: clt$slu_termination_option;
     VAR parse {input, output} : clt$parse_state);

?? PUSH (LISTEXT := ON) ??


    IF parse.unit_index < parse.index_limit THEN
      IF NOT parse.unit_is_space THEN
        parse.previous_non_space_unit := parse.unit;
        parse.previous_non_space_unit_index := parse.unit_index;
      IFEND;

      IF parse.units_array <> NIL THEN
        REPEAT
          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 := parse.unit.kind IN
                $clt$lexical_unit_kinds [clc$lex_space, clc$lex_comment,
                clc$lex_unterminated_comment];

        UNTIL (termination_option = clc$slu_any) OR
              (NOT parse.unit_is_space) OR (parse.unit_index >=
              parse.index_limit);

      ELSE
        clp$identify_lexical_unit (termination_option, parse.text, parse.index,
              parse.unit_index, parse.unit_is_space, parse.unit);
        parse.previous_unit_is_space := parse.unit_index >
              (parse.previous_non_space_unit_index +
              parse.previous_non_space_unit.size);
      IFEND;

    ELSEIF parse.unit.kind = clc$lex_beginning_of_line THEN
      parse.units_array_index := 2;
      parse.unit.kind := clc$lex_end_of_line;
    IFEND;

  PROCEND clp$scan_lexical_unit;

*copyc clt$lexical_unit_kinds
*copyc clt$parse_state
*copyc clt$slu_termination_option
?? POP ??
*copyc clp$identify_lexical_unit
