Using Lex (and Yacc) on a string.

Pat Broderick ptb at ittc.wec.com
Sat Aug 11 00:41:51 AEST 1990


In article <1990Aug10.012927.5558 at basho.uucp>, john at basho.uucp (John Lacey) writes:
> Normally, of course, one wants a scanner (and a parser) to work from 
> a file, perhaps stdin.  Sigh.  Well, I want one that works from a string.
> ...

Recently I had occasion to do something similar.  What we did was
roughly as follows:

   - strings to be parsed are maintained in memory 
   - to parse a string a global pointer known to lex is set to point at
     the beginning of the string
   - the input() macro was redefined in terms of this pointer (standard
     uses getc(yyin))

The things needed might look something like:

LEX:

# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)   /* standard defn from lex */

# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):(*yynyy++))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)                   ^^^^^^^^^^

					/* modified defn to use string */

extern char *yynyy;			/* will pt to start of string */


Function invoking parser:

char *yynyy;			/* globally visible */

....

    yynyy = start_of_string;
    yyparse();


This works fine for us, hope it helps.
-- 
Patrick T. Broderick           |ptb at ittc.wec.com |
                               |uunet!ittc!ptb   |
                               |(412)733-6265    |



More information about the Comp.lang.c mailing list