/*
 * Copyright 1993, 1995 Christopher Seiwald.
 *
 * This file is part of Jam - see jam.c for Copyright information.
 */

/*
 * scan.h - the jam yacc scanner
 *
 * External functions:
 *
 *  yyerror( char *s ) - print a parsing error message.
 *  yyfparse( char *s ) - scan include file s.
 *  yylex() - parse the next token, returning its type.
 *  yymode() - adjust lexicon of scanner.
 *  yyparse() - declaration for yacc parser.
 *  yyanyerrors() - indicate if any parsing errors occured.
 *
 * The yymode() function is for the parser to adjust the lexicon of the scanner.
 * Aside from normal keyword scanning, there is a mode to handle action strings
 * (look only for the closing }) and a mode to ignore most keywords when looking
 * for a punctuation keyword. This allows non-punctuation keywords to be used in
 * lists without quoting.
 */

/*
 * YYSTYPE - value of a lexical token
 */

#define YYSTYPE YYSYMBOL

typedef struct _YYSTYPE
{
    int     type;
    char  * string;
    PARSE * parse;
    LIST  * list;
    int     number;
    char  * file;
    int     line;
} YYSTYPE;

extern YYSTYPE yylval;

void yymode( int n );
void yyerror( char * s );
int yyanyerrors();
void yyfparse( char * s );
int yyline();
int yylex();
int yyparse();
void yyinput_stream( char * * name, int * line );

# define SCAN_NORMAL  0   /* normal parsing */
# define SCAN_STRING  1   /* look only for matching } */
# define SCAN_PUNCT   2   /* only punctuation keywords */
