?? fparse.y
字號:
/* * Copyright (c) 1997-2003 Erez Zadok * Copyright (c) 2001-2003 Stony Brook University * Copyright (c) 1997-2000 Columbia University * * For specific licensing information, see the COPYING file distributed with * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. * * This Copyright notice must be kept intact and distributed with all * fistgen sources INCLUDING sources generated by fistgen. */%{/* * fparse.y: parser for FiST language * Fistgen sources. * Copyright (c) 1997-2003 Erez Zadok * Copyright (c) 2001-2003 Stony Brook University * Copyright (c) 1997-2000 Columbia University */#ifdef HAVE_CONFIG_H# include <config.h>#endif /* HAVE_CONFIG_H */extern char *yytext;extern int fyylex(void);extern int yylineno;extern void free(void *);static int yyerror(const char *s);static void fyy_echo(const char *s);static void add_func_arg(const char *s);static char *dv, *dn, *da;static char buf[MAX_BUF_LEN], errmsg[MAX_BUF_LEN], fxnbuf[MAX_BUF_LEN];static bdt_t *tmp_bdt = NULL;ecl_t *tmp_ecl = NULL;int num_func_args, parsing_fist_fxn;static char *func_args[MAX_FUNCARGS];#define YYDEBUG 0#define PARSE_DEBUG 0#if PARSE_DEBUG# define dprintf(f,s) fprintf(stderr, (f), yylineno, (s))# define fist_return(v)#else /* not PARSE_DEBUG */# define dprintf(f,s)# define fist_return(v) return((v))#endif /* not PARSE_DEBUG */static int parsedebug;%}%union {char *strtype;int inttype;}%token NEWLINE SEMICOLON COLON%token LEFT_BRACE RIGHT_BRACE%token LEFT_BRACKET RIGHT_BRACKET%token LEFT_PAREN RIGHT_PAREN%token DOUBLE_PCT PCT_LEFT PCT_RIGHT%token <strtype> PCT_KEY DOLLAR_KEY%token <strtype> WORD PCT_ALPHA%token <inttype> NUMBER%token <strtype> CODELINE%token <strtype> MISC%token <strtype> DOLLAR_VNA%token <strtype> DOLLAR_VN DOLLAR_NA DOLLAR_VA%token <strtype> DOLLAR_V DOLLAR_N%token <strtype> FIST_FXN FIST_RULE_DEF FUNCARG%token <strtype> MSOURCE_LIST USOURCE_LIST MHEADER_LIST ADDMK_LIST%start file%%/****************************************************************************/file : { yylineno = 1;#if YYDEBUG != 0 yydebug = YYDEBUG;#endif /* YYDEBUG != 0 */ parsedebug = PARSE_DEBUG; } sections ;sections : opt_decls_sect fist_decls_sect fist_rules_sect opt_code_sect ;/****************************************************************************/opt_decls_sect : PCT_LEFT opt_decls_lines PCT_RIGHT | PCT_LEFT PCT_RIGHT | /* can be empty */ ;opt_decls_lines : opt_decls_line | opt_decls_line opt_decls_lines ;opt_decls_line : CODELINE { if (parsedebug) fprintf(stderr, "opt_decl1 = \"%s\"\n", $1 ? $1 : "null"); fprintf(out_fp_h, "%s", $1); } ;/****************************************************************************/fist_decls_sect : fist_decls | /* can be empty */ ;fist_decls : fist_decl | fist_decl fist_decls ;fist_decl : WORD WORD SEMICOLON { if (parsedebug) fprintf(stderr, "WORD+WORD LINE! %s %s\n", $1, $2); if (STREQ($1, "accessmode")) { if (parsedebug) fprintf(stderr, "accessmode +%s\n", $2); if (!fist_validate_decl_accessmode($2)) { yyerror("unknown FiST accessmode"); YYABORT; } } else if (STREQ($1, "debug")) { if (parsedebug) fprintf(stderr, "debug +%s\n", $2); if (!fist_validate_decl_debug($2)) { yyerror("unknown FiST debug flag"); YYABORT; } } else if (STREQ($1, "dynamic_inode_numbers")) { if (parsedebug) fprintf(stderr, "dynamic_inode_numbers +%s\n", $2); if (!fist_validate_decl_dynamic_inode_numbers($2)) { yyerror("unknown FiST dynamic_inode_numbers flag"); YYABORT; } } else if (STREQ($1, "encoding_type")) { if (parsedebug) fprintf(stderr, "encoding_type +%s\n", $2); if (!fist_validate_decl_encoding_type($2)) { yyerror("unknown FiST encoding_type flag"); YYABORT; } } else if (STREQ($1, "errorcode")) { if (parsedebug) fprintf(stderr, "errorcode +%s\n", $2); if (!fist_validate_decl_errorcode($2, errmsg)) { yyerror(errmsg); YYABORT; } } else if (STREQ($1, "filter")) { if (parsedebug) fprintf(stderr, "filter +%s\n", $2); if (!fist_validate_decl_filter($2)) { yyerror("unknown FiST filter type"); YYABORT; } } else if (STREQ($1, "fsname")) { if (parsedebug) fprintf(stderr, "fsname +%s\n", $2); if (STREQ(fist_globals.fg_fsname, $2)) strcpy(fist_globals.fg_fsname, $2); else { yyerror("not allowed to override fsname (taken from the fist file)"); YYABORT; } } else if (STREQ($1, "mntflag")) { if (parsedebug) fprintf(stderr, "mntflag +%s\n", $2); if (!fist_validate_decl_mntflag($2, errmsg)) { yyerror(errmsg); YYABORT; } } else if (STREQ($1, "mntstyle")) { if (parsedebug) fprintf(stderr, "mntstyle +%s\n", $2); if (!fist_validate_decl_mntstyle($2)) { yyerror("unknown FiST mntstyle flag"); YYABORT; } } else { yyerror("unknown FiST declaration (word argument)"); YYABORT; } } | WORD NUMBER SEMICOLON { if (parsedebug) fprintf(stderr, "WORD+NUMBER LINE! %s %d\n", $1, $2); if (STREQ($1, "fanout")) { if (parsedebug) fprintf(stderr, "fanout +%d\n", $2); if (!fist_validate_decl_fanout($2)) { yyerror("bad FiST fanout value"); YYABORT; } } else if (STREQ($1, "encoding_blocksize")) { if (parsedebug) fprintf(stderr, "encoding_blocksize +%d\n", $2); if (!fist_validate_decl_encoding_blocksize($2)) { yyerror("bad FiST encoding_blocksize value"); YYABORT; } } else { yyerror("unknown FiST declaration (numeric argument)"); YYABORT; } } | WORD LEFT_BRACE basic_data_types RIGHT_BRACE SEMICOLON { if (parsedebug) fprintf(stderr, "WORD BDT line: %s\n", $1); if (STREQ($1, "mntdata")) { if (parsedebug) fprintf(stderr, "mntdata\n"); if (fist_globals.fg_mntdata) { yyerror("already defined mntdata"); YYABORT; } fist_globals.fg_mntdata = tmp_bdt; tmp_bdt = NULL; /* do not free it */ } else if (STREQ($1, "pervfs")) { if (parsedebug) fprintf(stderr, "pervfs\n"); if (fist_globals.fg_pervfs) { yyerror("already defined pervfs"); YYABORT; } fist_globals.fg_pervfs = tmp_bdt; tmp_bdt = NULL; /* do not free it */ } else if (STREQ($1, "pervnode")) { if (parsedebug) fprintf(stderr, "pervnode\n"); if (fist_globals.fg_pervnode) { yyerror("already defined pervnode"); YYABORT; } fist_globals.fg_pervnode = tmp_bdt; tmp_bdt = NULL; /* do not free it */ } else { yyerror("unknown FiST declaration (word+bdt argument)"); YYABORT; } } | WORD WORD LEFT_BRACE basic_data_types RIGHT_BRACE SEMICOLON { if (parsedebug) fprintf(stderr, "WORD WORD BDT line: %s\n", $1); if (STREQ($1, "fileformat")) { if (parsedebug) fprintf(stderr, "fileformat +%s\n", $2); if (!fist_validate_decl_fileformat($2, tmp_bdt, errmsg)) { yyerror(errmsg); YYABORT; } tmp_bdt = NULL; /* do not free it */ } else if (STREQ($1, "ioctl")) { if (parsedebug) fprintf(stderr, "ioctl +%s\n", $2); if (!fist_validate_decl_ioctl($2, "both", tmp_bdt, errmsg)) { yyerror(errmsg); YYABORT; } tmp_bdt = NULL; /* do not free it */ } else { yyerror("unknown FiST declaration (word+word+bdt argument)"); YYABORT; } } | WORD COLON WORD WORD LEFT_BRACE basic_data_types RIGHT_BRACE SEMICOLON { if (parsedebug) fprintf(stderr, "WORD:WORD WORD BDT line: %s\n", $1); if (STREQ($1, "ioctl")) { if (parsedebug) fprintf(stderr, "ioctl:%s +%s\n", $3, $4); if (!fist_validate_decl_ioctl($4, $3, tmp_bdt, errmsg)) { yyerror(errmsg); YYABORT; } tmp_bdt = NULL; /* do not free it */ } else { yyerror("unknown FiST declaration (word:word+word+bdt argument)"); YYABORT; } } | MSOURCE_LIST SEMICOLON { char *cp; if (parsedebug) fprintf(stderr, "mod_src: %s\n", $1); cp = strtok($1, " \t"); while (cp) { if (!fist_validate_decl_msources(cp, errmsg)) { yyerror(errmsg); YYABORT; } cp = strtok(NULL, " \t"); } } | MHEADER_LIST SEMICOLON { char *cp; if (parsedebug) fprintf(stderr, "mod_hdr: %s\n", $1); cp = strtok($1, " \t"); while (cp) { if (!fist_validate_decl_mheaders(cp, errmsg)) { yyerror(errmsg); YYABORT; } cp = strtok(NULL, " \t"); } } | USOURCE_LIST SEMICOLON { char *cp; if (parsedebug) fprintf(stderr, "user_src: %s\n", $1); cp = strtok($1, " \t"); while (cp) { if (!fist_validate_decl_usources(cp, errmsg)) { yyerror(errmsg); YYABORT; } cp = strtok(NULL, " \t"); } }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -