Overview

The RoseP21Lex class is an internal utility class used for scanning tokens in STEP ISO 10303-21 (Part 21) formatted files. It is not created or used directly.

See STEP Part 21 Exchange Files for more information on writing and customizing STEP files.

comment_fn

typedef void (* RoseP21CommentFn) (
	RoseP21Lex *
	);

static RoseP21CommentFn comment_fn;

The comment_fn static class variable can specify a hook function that will be used to process comments found in the a Part 21 file.

By default, this variable is null and the function rose_p21_read_and_discard_comment() is used to read and ignore comments. The rose_p21_read_and_preserve_comment() function can also be used to capture comments and make them available through the RoseObject::entity_comment() function.

    /* somewhere in your main, before you start reading files */

    /* save comments for later use with entity_comment() */
    RoseP21Lex::comment_fn = rose_p21_read_and_preserve_comment;

    /* default behavior, discard comments */     
    RoseP21Lex::comment_fn = NULL;
    RoseP21Lex::comment_fn = rose_p21_dflt_read_comment;  /* alias */
    RoseP21Lex::comment_fn = rose_p21_read_and_discard_comment;

The following sample code scans and discards comments. The function is called when the Part 21 lexer encounters the beginning of a comment. The function is responsible for reading through to the closing "*/" and incrementing the lexer line count where appropriate. Characters are provided by the get()/unget() functions on the stream() object associated with the lexer. Use this as the starting point for your own function.

    /* EXAMPLE */
    void process_comment (RoseP21Lex * lex)
    {
        register int c;
	register RoseInputStream * f = lex->stream();

	for (c=f->get(); c != EOF; c=f->get()) 
        {
            if (c == '*') {
                /* Lookahead to check for the closing slash. */
                int c2 = f->get();
                if (c2 == EOF) break;
                if (c2 == '/') return;
		f->unget (c2);  /* pushback and continue */
            }
            else if (c == '\n') {
                lex-> trace()-> increment_line();
            }
        }
        rose_io_ec()-> warning ("End of file in comment.");
    }

See Also

Reading and Writing Comments; rose_p21_read_and_discard_comment(); rose_p21_read_and_preserve_comment()