⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pp_rules.y

📁 harvest是一个下载html网页得机器人
💻 Y
字号:
%{#include <stdio.h>#include <string.h>#include "util.h"#include "template.h"#include "post_process.h"#define FLEX_SCANNERextern char *name_buf;     /* this is strdup'ed in the lexer */extern char *qstr_buf;     /* this is strdup'ed in the lexer */extern char *word_buf;     /* this is strdup'ed in the lexer */static Word *mk_wordlist ();static Word *add_word ();static Inst *mk_inst ();static Inst *add_inst ();static Cond *mk_cond ();static Cond *add_cond ();static Rule *mk_rule ();static Rule *add_rule ();#ifndef FLEX_SCANNERextern int yylineno;#endif%}%token END_ LTAB_%token AND_ OR_ COMMA_%token BANG_ PIPE_ TWIDDLE_ EQUALS_ ASSIGN_ NOTEQUALS_ NOTTWIDDLE_%token DELETE_%token NAME_ QSTR_ DQSTR_ PATTERN_ WORD_%token COMMENT_%union{	Word	*WORD;	Cond	*COND;	Inst	*INST;	Rule	*RULE;	int	INT;}%type <WORD>	wordlist attrs qstr dqstr pattern word attr condattr condstr%type <RULE>	rule rules config;%type <COND>	condition conditions;%type <INST>	instruction instructions;%type <INT>	AND_ OR_ EQUALS_ NOTEQUALS_ TWIDDLE_ NOTTWIDDLE_ PIPE_ BANG_ ASSIGN_ condop%%config		: rules				{ PPRules = $1; }		;rules		: rule				{ $$ = $1; }		| rule rules			{ $$ = add_rule ($1, $2); }		;rule		: conditions END_ instructions 	{ $$ = mk_rule ($1, $3); }		;conditions	: condition			{ $$ = $1; }		| conditions AND_ condition	{ $$ = add_cond ($1, $3, AND); }		| conditions OR_  condition	{ $$ = add_cond ($1, $3, OR); }		;condition	: condattr condop condstr	{ $$ = mk_cond ($1, $2, $3); }		;condattr	: word				{ $$ = $1; }		;condop		: EQUALS_			{ $$ = EQUALS; }		| NOTEQUALS_			{ $$ = NOTEQ; }		| TWIDDLE_			{ $$ = REGEX; }		| NOTTWIDDLE_			{ $$ = NOTRE; }		;condstr		: qstr				{ $$ = $1; }		| dqstr				{ $$ = $1; }		| pattern			{ $$ = $1; }		;instructions	: instruction			{ $$ = $1; }		| instructions instruction	{ $$ = add_inst ($1, $2); }		;instruction	: LTAB_ attr PIPE_   wordlist END_	{ $$ = mk_inst ($2, PIPE,   $4); }		| LTAB_ attr ASSIGN_ dqstr END_		{ $$ = mk_inst ($2, ASSIGN, $4); }		| LTAB_ attrs BANG_  wordlist END_	{ $$ = mk_inst ($2, BANG,   $4); }		| LTAB_ DELETE_ END_			{ $$ = mk_inst (NULL, DELETE, NULL); }		;attrs		: attr				{ $$ = $1; }		| attrs COMMA_ attr		{ $$ = add_word ($1, $3); }		;attr		: word				{ $$ = $1; }		;wordlist	: word 				{ $$ = $1; }		| wordlist word			{ $$ = add_word ($1, $2); }		;qstr		: QSTR_				{ $$ = mk_wordlist (qstr_buf, '\''); }		;dqstr		: DQSTR_			{ $$ = mk_wordlist (qstr_buf, '"'); }		;word		: WORD_				{ $$ = mk_wordlist (word_buf, 0); }		;pattern		: PATTERN_			{ $$ = mk_wordlist (qstr_buf, '/'); }		;%%static Word *mk_wordlist (word, delim)	char	*word;	int	delim;{	Word	*t;	char	*s;	/* remove delimeters */	if (*word == (char) delim)		word++;	s	= word+strlen(word)-1;	if (*s == (char) delim)		*s = 0;	t	= (Word *) xmalloc (sizeof (Word));	t->word	= (char *) xstrdup (word);	t->next	= 0;	return t;}static Word *add_word (wordlist, word)	Word	*wordlist;	Word	*word;{	Word	*t;	for (t=wordlist; t->next; t=t->next);	t->next = word;	return wordlist;}static Inst *mk_inst (attrs, op, args)	Word	*attrs;	int	op;	Word	*args;{	Inst		*t;	t		= (Inst *) xmalloc (sizeof (Inst));	t->attrs	= attrs;	t->op		= op;	t->args		= args;	t->next		= 0;	return t;}static Inst *add_inst (list, inst)	Inst	*list;	Inst	*inst;{	Inst	*t;	for (t=list; t->next; t=t->next);	t->next	= inst;	return list;}static Cond *mk_cond (attr, op, value)	Word	*attr;	int	op;	Word	*value;{	Cond	*t;	t	= (Cond *) xmalloc (sizeof (Cond));	t->attr	= attr;	t->op	= op;	t->value = value;	t->nextop = 0;	t->next	= 0;	return t;}static Cond *add_cond (list, cond, op)	Cond	*list;	Cond	*cond;	int	op;{	Cond	*t;	for (t=list; t->next; t=t->next);	t->next = cond;	t->nextop = op;	return list;}static Rule *mk_rule (cond, inst)	Cond	*cond;	Inst	*inst;{	Rule	*t;	t	= (Rule *) xmalloc (sizeof (Rule));	t->cond	= cond;	t->inst	= inst;	t->next	= 0;	return t;}static Rule *add_rule (list, rule)	Rule	*list;	Rule	*rule;{	Rule	*t;	for (t=list; t->next; t=t->next);	t->next	= rule;	return list;}int yyerror (msg)	char *msg;{	extern char yytext[];#ifdef FLEX_SCANNER	fprintf (stderr, "line: %s at '%s'\n",		msg, yytext);#else	fprintf (stderr, "line %d: %s at '%s'\n",		yylineno, msg, yytext);#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -