# [cfg_dfn.h] Context Free Grammar: symbol and production types

## contents

#include "standard.h"

## Symbol types

    #define PLR_TYP_NTM  0 /* Nonterminal       */
    #define PLR_TYP_TOK  1 /* Token             */
    #define PLR_TYP_KEY  2 /* Keyword           */
    #define PLR_TYP_WKY  3 /* Wide Keyword      */
    #define PLR_TYP_CFG  4 /* Language token    */
    #define PLR_TYP_COM  5 /* Comment           */

    /* Terminal <--> Comment */

    #define CFG_TERM_TO_COM(typ) ( (typ) + PLR_TYP_COM )
    #define CFG_COM_TO_TERM(typ) ( (typ) - PLR_TYP_COM )

    /* Recognizer */

    #define CFG_NTM(typ)      ( (typ) == PLR_TYP_NTM )
    #define CFG_CFG(typ)      ( (typ) == PLR_TYP_CFG )
    #define CFG_TOK(typ)      ( (typ) == PLR_TYP_TOK || (typ) == PLR_TYP_CFG )
    #define CFG_KEY(typ)      ( (typ) == PLR_TYP_KEY || (typ) == PLR_TYP_WKY )
    #define CFG_WCKEY(typ)    ( (typ) == PLR_TYP_WKY )
    #define CFG_COM(typ)      ( (typ) >= PLR_TYP_COM )

    #define CFG_TOK_NTM(typ)  ( CFG_TOK(typ)     || CFG_NTM(typ) )
    #define CFG_TOK_KEY(typ)  ( CFG_TOK(typ)     || CFG_KEY(typ) )
    #define CFG_TERMINAL(typ) ( CFG_TOK_KEY(typ) || \
                                ( CFG_COM(typ) && (typ) != PLR_TYP_COM ) )

## Production types: special recognizer

    c_bool nilProd(c_string prod)
| production name = "nil" ?
    c_bool consProd(c_string prod)
| production name = "cons" ?
    c_bool ignProd(c_string prod)
| production name = "ign#*" ?