Реферат: Препроцессор языка СИ
<span Courier New""> ‹ ¡®à â®à ïà ¡®â 1
<span Courier New"">
<span Courier New"">‡ ¤ ¨¥:
<span Courier New"">
<span Courier New""> ®áâநâì«¥ªá¨ç¥áª¨© «¨§ â®à(᪠¥à), ª®â®à멡㤥⠢
<span Courier New"">¤ «ì¥©è¥¬¨á¯®«ì§®¢ âìáï¯à¨ à §¡®à¥HTML-¤®ªã¬¥â®¢.
<span Courier New"">
<span Courier New"">’¥ªáâ¯à®£à ¬¬ë:
<span Courier New"">
<span Courier New"">#include<io.h>
<span Courier New"">#include<ctype.h>
<span Courier New"">#include<string.h>
<span Courier New"">#include<alloc.h>
<span Courier New"">
<span Courier New"">#include«parserhtm_cnst.h»
<span Courier New"">#include«parserhtm_glob.h»
<span Courier New"">#include«parserhtm_tokn.h»
<span Courier New"">#include«parserhtm_err.h»
<span Courier New"">#include«parse.h»
<span Courier New"">#pragma hdrstop
<span Courier New"">
<span Courier New"">extern YYSTYPEyylval;
<span Courier New"">enum {TEXT=0,PRE, KEYWORD, ATTR, AVALUE, IN_QUOTE};
<span Courier New"">char *states [ 6]= {«TEXT», «PRE», «KEYWORD», «ATTR»,«AVALUE», «IN_QUOTE»};
<span Courier New"">char *tktypes[10]= {"_OpenTag", "_CloseTag", "_EndTag","_C_KEYWORD",
<span Courier New""> "_S_KEYWORD", "_A_KEYWORD", "_V_KEYWORD","_NUM",
<span Courier New""> "_IDENTIFIER", "_QUOTED_ATTR"};
<span Courier New"">
<span Courier New"">/* text,preformatted text, HTML KEYWORD, attribute KEYWORD, */
<span Courier New"">/* attributevalue KEYWORD */
<span Courier New"">int in_close = FALSE;
<span Courier New"">int in_open = FALSE;
<span Courier New"">int opened_par =FALSE;
<span Courier New"">int state = TEXT;
<span Courier New"">int old_state =TEXT;
<span Courier New"">int cUKSZ = 0;
<span Courier New"">
<span Courier New"">int USE_BUFFER =FALSE;
<span Courier New"">int lex_buff_size= 0;
<span Courier New"">typedef struct {
<span Courier New""> int tktyp;
<span Courier New""> char tkval[NMSZ];
<span Courier New"">} tbuff;
<span Courier New"">tbufflex_buff[5];
<span Courier New"">
<span Courier New"">int c;
<span Courier New"">int lineno;
<span Courier New"">long charno;
<span Courier New"">long f_size;
<span Courier New"">int icm;
<span Courier New""> /*!!! */
<span Courier New"">charcomment[CMSZ];
<span Courier New""> /*!!! */
<span Courier New"">
<span Courier New"">typedef struct {
<span Courier New""> char name[TKSZ];
<span Courier New""> int kw_token;
<span Courier New""> int in_paragraph;
<span Courier New"">} kw_table;
<span Courier New"">
<span Courier New"">/**********functions declarations ************/
<span Courier New"">void fixfile(FILE*, char*);
<span Courier New"">int nextchar(FILE *, FILE *);
<span Courier New"">void nlproc (FILE*);
<span Courier New"">int bsearch (char *, kw_table *, int);
<span Courier New"">int nexttok (char *);
<span Courier New"">void lexinit();
<span Courier New"">int yylex();
<span Courier New"">/**********************************************/
<span Courier New"">
<span Courier New"">/* PossibleKEYWORDS — directives */
<span Courier New"">kw_tablekeyword_table[KWSZ] = {
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 2 -
<span Courier New"">
<span Courier New""> {«A», _C_KEYWORD, TRUE },
<span Courier New""> // ...
<span Courier New""> {«WBR», _S_KEYWORD, TRUE }
<span Courier New"">};
<span Courier New"">
<span Courier New"">/* PossibleKEYWORDS — attributes */
<span Courier New"">kw_tableattr_table[ATSZ] = {
<span Courier New""> {«ALIGN», _A_KEYWORD },
<span Courier New""> // ...
<span Courier New""> {«WRAP», _A_KEYWORD }
<span Courier New"">};
<span Courier New"">
<span Courier New"">/* PossibleKEYWORDS — attribute's values */
<span Courier New"">kw_tableaval_table[AVSZ] = {
<span Courier New""> {«ABSBOTTOM», _V_KEYWORD },
<span Courier New""> // ...
<span Courier New""> {"_top", _V_KEYWORD }
<span Courier New"">};
<span Courier New"">
<span Courier New"">/*
<span Courier New""> * äãªæ¨¨
<span Courier New""> */
<span Courier New"">
<span Courier New"">/*
<span Courier New""> * ”ãªæ¨ï¡¨ ண® ¯®¨áª ¨¬¥¨ ¢ â ¡«¨æ¥ ¨¬¥.‚®§¢à é ¥â ¨¤¥ªá
<span Courier New""> * ©¤¥®£®í«¥¬¥â ¢¬ áᨢ¥ ¨«¨ -1, ¥á«¨¨ç¥£® ¥ è« .
<span Courier New""> * Œ áᨢá®á⮨⠨§ § ¯¨á¥©á ¯®«ï¬¨: áâப®¢®©ASCII/Z-ª®áâ âë -
<span Courier New""> * ª«î祢®£®á«®¢ HTML ¨ int'®¢áª®£®â¨¯ í⮣® KEYWORD'
<span Courier New""> */
<span Courier New"">
<span Courier New"">int bsearch( charword[], kw_table word_table[], int tbsize)
<span Courier New"">{
<span Courier New""> int low, high, middle;
<span Courier New""> int i;
<span Courier New"">
<span Courier New""> low = 0;
<span Courier New""> high = tbsize — 1;
<span Courier New"">
<span Courier New""> while (low <= high) {
<span Courier New""> middle = (low + high) / 2;
<span Courier New""> i = strcmp(word, word_table[middle].name);
<span Courier New""> if (i < 0) {
<span Courier New""> high = middle — 1;
<span Courier New""> } else if (i > 0) {
<span Courier New""> low = middle + 1;
<span Courier New""> } else {
<span Courier New""> return (middle);
<span Courier New""> }
<span Courier New""> }
<span Courier New"">
<span Courier New""> return (-1);
<span Courier New"">}
<span Courier New"">
<span Courier New"">int nexttok(char*val)
<span Courier New"">{
<span Courier New""> register int i, i2;
<span Courier New""> char tokenvalue[NMSZ];
<span Courier New""> int c1, tokentype, tokenend;
<span Courier New"">
<span Courier New""> i = 0;
<span Courier New"">
<span Courier New""> while (isspace(c)) /* c is always one charahead */ {
<span Courier New""> if (c == 'n') nlproc(listfp);
<span Courier New""> if (state == PRE) {
<span Courier New""> tokenvalue[0] = c; tokenvalue[1] = '';
<span Courier New""> tokentype = _IDENTIFIER;
<span Courier New""> c = nextchar(infp, listfp); charno++;
<span Courier New""> strcpy(val, tokenvalue); return(tokentype);
<span Courier New""> }
<span Courier New""> c = nextchar(infp, listfp); charno++;
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 3 -
<span Courier New"">
<span Courier New""> }
<span Courier New"">
<span Courier New""> if ( ( (state == TEXT) || (state == PRE) )&& (c == '<') ) {
<span Courier New""> ungetc(c1 = getc(infp), infp);
<span Courier New""> old_state = state; state = KEYWORD;
<span Courier New""> if (c1 == '/') {
<span Courier New""> c = nextchar(infp, listfp); charno++;
<span Courier New"">c = nextchar(infp, listfp); charno++;
<span Courier New""> tokenvalue[0] = '<'; tokenvalue[1] ='/'; tokenvalue[2] = '';
<span Courier New""> tokentype = _CloseTag; in_close = TRUE;in_open = FALSE;
<span Courier New""> strcpy(val, tokenvalue);return(tokentype);
<span Courier New""> } else {
<span Courier New""> c = nextchar(infp, listfp); charno++;
<span Courier New""> tokenvalue[0] = '<'; tokenvalue[1] = '';
<span Courier New""> tokentype = _OpenTag; in_close = FALSE; in_open = TRUE;
<span Courier New""> strcpy(val, tokenvalue);return(tokentype);
<span Courier New""> }
<span Courier New""> }
<span Courier New""> if (state == KEYWORD) {
<span Courier New"">
<span Courier New""> if (c == '!') { /* Comments! */
<span Courier New""> while ((c != '>') && ( c != EOF)) {
<span Courier New""> c= nextchar(infp, listfp); charno++;
<span Courier New""> }
<span Courier New""> state = ATTR;
<span Courier New""> tokenvalue[0] = ''; tokentype =_IDENTIFIER;
<span Courier New""> strcpy(val, tokenvalue);return(tokentype);
<span Courier New""> }
<span Courier New"">
<span Courier New""> while (isalnum(c)) {
<span Courier New""> tokenvalue[i++] = toupper(c);
<span Courier New""> c = nextchar(infp, listfp); charno++;
<span Courier New""> }
<span Courier New""> tokenvalue[i++] = '';
<span Courier New""> if ((i = bsearch(tokenvalue,keyword_table, KWSZ)) >= 0) {
<span Courier New""> tokentype = keyword_table[i].kw_token;
<span Courier New""> state = ATTR;
<span Courier New""> if ( strcmp(«PRE», tokenvalue)== 0 ) {
<span Courier New""> if (in_close) old_state = TEXT;
<span Courier New""> else old_state = PRE;
<span Courier New""> }
<span Courier New""> strcpy(val, tokenvalue);return(tokentype);
<span Courier New""> } else {
<span Courier New""> if ((i = bsearch(tokenvalue, attr_table,ATSZ)) >= 0) {
<span Courier New""> tokentype = attr_table[i].kw_token;
<span Courier New""> state = AVALUE;
<span Courier New""> strcpy(val, tokenvalue); return(tokentype);
<span Courier New""> } else { /* Unknown attribute. Actually,it's much more easier */
<span Courier New""> /* just ignoring it in YACC then trying toskip it here*/
<span Courier New""> tokentype = _IDENTIFIER;
<span Courier New""> state = AVALUE;
<span Courier New""> strcpy(val, tokenvalue); return(tokentype);
<span Courier New""> }
<span Courier New"">
<span Courier New""> }
<span Courier New""> }
<span Courier New""> if (state == IN_QUOTE) {
<span Courier New""> if ( c == '"' ) {
<span Courier New""> c = nextchar(infp, listfp); charno++;
<span Courier New""> state = ATTR;
<span Courier New""> tokenvalue[0] = '"'; tokenvalue[1] = '';
<span Courier New""> tokentype = '"';
<span Courier New""> strcpy(val, tokenvalue);return(tokentype);
<span Courier New""> }
<span Courier New""> tokentype = _QUOTED_ATTR; /* maybe URL, maybe rain, maybe snow… */
<span Courier New""> /* state = IN_QUOTE; */
<span Courier New""> while ( c != '"' ) {
<span Courier New""> tokenvalue[i++] = c;
<span Courier New""> c = nextchar(infp, listfp); charno++;
<span Courier New""> }
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 4 -
<span Courier New"">
<span Courier New""> tokenvalue[i++] = '';
<span Courier New""> /* c = nextchar(infp, listfp); Skip theclosing quotation mark */
<span Courier New""> strcpy(val, tokenvalue); return(tokentype);
<span Courier New"">
<span Courier New""> } /* end if for (state == IN_QUOTE) */
<span Courier New"">
<span Courier New""> return 0; /* ’ ª®£® ¥¬®¦¥â ¡ëâì… */
<span Courier New"">}
<span Courier New"">
<span Courier New"">int yylex()
<span Courier New"">{
<span Courier New""> int tktyp;
<span Courier New""> char tkval[NMSZ];
<span Courier New"">
<span Courier New""> if (!USE_BUFFER) {
<span Courier New""> tktyp = nexttok(tkval);
<span Courier New""> switch (tktyp) {
<span Courier New""> case _OpenTag: {
<span Courier New""> tktyp = nexttok(tkval);
<span Courier New""> if (opened_par) {
<span Courier New""> if (tktyp == _C_KEYWORD || tktyp == _S_KEYWORD) {
<span Courier New""> if (!keyword_table[bsearch(tkval,keyword_table, KW...
<span Courier New""> lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
<span Courier New""> lex_buff[1].tktyp = _OpenTag ;strcpy(lex_buff[...
<span Courier New""> lex_buff[2].tktyp = _EndTag ;strcpy(lex_buff[...
<span Courier New""> lex_buff[3].tktyp = _C_KEYWORD; strcpy(lex_buff[...
<span Courier New""> lex_buff[4].tktyp = _CloseTag; strcpy(lex_buff[...
<span Courier New""> lex_buff_size = 5; USE_BUFFER = TRUE;
<span Courier New""> opened_par = (strcmp(tkval, «P»)==0);
<span Courier New""> } else {
<span Courier New""> lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
<span Courier New""> lex_buff[1].tktyp = _OpenTag ;strcpy(lex_buff[...
<span Courier New""> lex_buff_size = 2; USE_BUFFER = TRUE;
<span Courier New""> }
<span Courier New""> }
<span Courier New""> }else { // i.e. opened_par == FALSE
<span Courier New""> opened_par = (strcmp(tkval, «P»)==0);
<span Courier New""> lex_buff[0].tktyp = tktyp ;strcpy(lex_buff[0].tkv...
<span Courier New""> lex_buff[1].tktyp = _OpenTag ;strcpy(lex_buff[1].tkv...
<span Courier New""> lex_buff_size = 2; USE_BUFFER = TRUE;
<span Courier New""> }
<span Courier New""> break;
<span Courier New""> }
<span Courier New"">
<span Courier New""> case _CloseTag: {
<span Courier New""> tktyp = nexttok(tkval);
<span Courier New""> if (opened_par) {
<span Courier New""> if (keyword_table[bsearch(tkval, keyword_table, KWSZ)]...
<span Courier New""> lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[0]....
<span Courier New""> lex_buff[1].tktyp = _CloseTag;strcpy(lex_buff[1]....
<span Courier New""> lex_buff_size = 2; USE_BUFFER = TRUE;
<span Courier New""> } else {
<span Courier New""> if (strcmp(tkval, «P»)==0) {
<span Courier New""> lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
<span Courier New""> lex_buff[1].tktyp = _CloseTag; strcpy(lex_buff[...
<span Courier New""> lex_buff_size = 2; USE_BUFFER = TRUE;
<span Courier New""> opened_par = FALSE;
<span Courier New""> } else {
<span Courier New""> lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
<span Courier New""> lex_buff[1].tktyp = _CloseTag; strcpy(lex_buff[...
<span Courier New""> lex_buff[2].tktyp = _EndTag ;strcpy(lex_buff[...
<span Courier New""> lex_buff[3].tktyp = _C_KEYWORD; strcpy(lex_buff[...
<span Courier New""> lex_buff[4].tktyp = _CloseTag; strcpy(lex_buff[...
<span Courier New""> lex_buff_size = 5; USE_BUFFER =TRUE;
<span Courier New""> opened_par = FALSE;
<span Courier New""> }
<span Courier New""> }
<span Courier New""> }else {
<span Courier New""> lex_buff[0].tktyp = tktyp ;strcpy(lex_buff[0].tkv...
<span Courier New""> lex_buff[1].tktyp = _CloseTag; strcpy(lex_buff[1].tkv...
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 5 -
<span Courier New"">
<span Courier New""> lex_buff_size = 2; USE_BUFFER = TRUE;
<span Courier New""> }
<span Courier New"">
<span Courier New""> break;
<span Courier New""> }
<span Courier New"">
<span Courier New""> case _IDENTIFIER: {
<span Courier New""> if ( !(in_open || in_close) && (!opened_par)) {
<span Courier New""> lex_buff[0].tktyp = _IDENTIFIER; strcpy(lex_buff[0].tkv...
<span Courier New""> lex_buff[1].tktyp = _EndTag ;strcpy(lex_buff[1].tkv...
<span Courier New""> lex_buff[2].tktyp = _C_KEYWORD; strcpy(lex_buff[2].tkv...
<span Courier New""> lex_buff[3].tktyp = _OpenTag ;strcpy(lex_buff[3].tkv...
<span Courier New""> lex_buff_size = 4; USE_BUFFER = TRUE;
<span Courier New""> opened_par = TRUE;
<span Courier New""> }
<span Courier New""> break;
<span Courier New""> }
<span Courier New"">
<span Courier New""> case 0: { // EOF
<span Courier New""> if (opened_par) {
<span Courier New""> lex_buff[0].tktyp = tktyp ;strcpy(lex_buff[0].tkv...
<span Courier New""> lex_buff[1].tktyp = _EndTag ;strcpy(lex_buff[1].tkv...
<span Courier New""> lex_buff[2].tktyp = _C_KEYWORD; strcpy(lex_buff[2].tkv...
<span Courier New""> lex_buff[3].tktyp = _CloseTag ;strcpy(lex_buff[3].tkv...
<span Courier New""> lex_buff_size = 4; USE_BUFFER = TRUE;
<span Courier New""> opened_par = TRUE;
<span Courier New""> }
<span Courier New""> }
<span Courier New"">
<span Courier New""> }
<span Courier New""> }
<span Courier New"">
<span Courier New""> if (USE_BUFFER) {
<span Courier New""> tktyp = lex_buff[--lex_buff_size].tktyp;
<span Courier New""> strcpy(tkval, lex_buff[ lex_buff_size].tkval);
<span Courier New""> if (lex_buff_size == 0) USE_BUFFER =FALSE;
<span Courier New""> }
<span Courier New"">
<span Courier New""> yylval.pchar = (char *) malloc(1 +strlen(tkval));
<span Courier New""> strcpy(yylval.pchar, tkval);
<span Courier New""> return(tktyp);
<span Courier New"">}
<span Courier New"">
<span Courier New"">ਬ¥ç ¨¥:à ᯥç âª¨ä ©«®¢ htm_cnst.h, htm_glob.h, htm_tokn.h ¨
<span Courier New""> htm_err.h á¬. ¢ ¯à¨«®¦¥¨¨ €apendix' 4.4.
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 6 -
<span Courier New"">
<span Courier New""> ‹ ¡®à â®à ïà ¡®â 2
<span Courier New"">
<span Courier New"">‡ ¤ ¨¥:
<span Courier New""> ®áâநâìä®à¬ ⨧ â®à‘-ä ©«®¢. ¥®¡å®¤¨¬®à¥ «¨§®¢ âì
<span Courier New"">á«¥¤ãî騥äãªæ¨¨:
<span Courier New""> - `{`- ¢á¥£¤ c ®¢®©áâப¨ ¡¥§®âáâã¯
<span Courier New""> - `{`- ¨ª®£¤ ¥¯¥à¥®á¨âáï
<span Courier New""> - `{`- ¢á¥£¤ c ®¢®©áâப¨ á®âáâ㯮¬
<span Courier New""> - 0- ¢áâ ¢«ïâìᨬ¢®« TAB ¯à¨ ®âáâ㯥
<span Courier New""> - 1..8 ¢áâ ¢«ïâì x¯à®¡¥«®¢
<span Courier New""> - ä®à¬ â¨à®¢ â쪮¬¬¥â ਨ c xx ¯® yy¯®§¨æ¨¨
<span Courier New""> - ¥áª®«ìª® ª®¬ ¤ ®¤®©áâப¥
<span Courier New""> - `=`¢ë¤¥«ïâì¯à®¡¥« ¬¨
<span Courier New"">
<span Courier New"">’¥ªáâ¯à®£à ¬¬ë:
<span Courier New"">#include<stdio.h>
<span Courier New"">#include<dos.h>
<span Courier New"">#include<ctype.h>
<span Courier New"">#include<string.h>
<span Courier New"">
<span Courier New"">#define ERROR 0
<span Courier New"">#define IDENT 1
<span Courier New"">#defineKEYWORD 2
<span Courier New"">#defineBRACKETS 3
<span Courier New"">#define OTHER 4
<span Courier New"">#define BEGIN '{'
<span Courier New"">#define END '}'
<span Courier New"">#define COMMA ','
<span Courier New"">#define SEMI ';'
<span Courier New"">#define LB 'n'
<span Courier New"">
<span Courier New"">char val[100];
<span Courier New"">charcomment[200];
<span Courier New"">
<span Courier New"">int pos=0;
<span Courier New"">int undo;
<span Courier New"">int backspace;
<span Courier New"">
<span Courier New"">#define N_KW 8
<span Courier New"">charkeywords[N_KW][20]={
<span Courier New""> «for»,
<span Courier New""> «while»,
<span Courier New""> «do»,
<span Courier New""> «if»,
<span Courier New""> «switch»,
<span Courier New""> «else»,
<span Courier New""> «case»,
<span Courier New""> «default»};
<span Courier New"">
<span Courier New"">//-----------------------------------------------------------------
<span Courier New"">void blockQuote(char *(&s),FILE *f)
<span Courier New"">{
<span Courier New""> char c=fgetc(f);
<span Courier New"">
<span Courier New""> *(s++)=c, c=0;
<span Courier New""> while (c!=''' && c!='"') {
<span Courier New""> c=*(s++)=fgetc(f);
<span Courier New""> if (c=='\')
<span Courier New""> c=*(s++)=fgetc(f);
<span Courier New""> }
<span Courier New"">}
<span Courier New"">//-----------------------------------------------------------------
<span Courier New"">int getNext (FILE*f)
<span Courier New"">{
<span Courier New""> char *s=val,c;
<span Courier New""> int buf=undo;
<span Courier New""> static int symbol=0;
<span Courier New""> static int startPos=1;
<span Courier New"">
<span Courier New""> c=fgetc(f);
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 7 -
<span Courier New"">
<span Courier New""> startPos=0;
<span Courier New""> if (isalnum(c) || c=='_') {
<span Courier New""> symbol=0;
<span Courier New""> *(s++)=c;
<span Courier New""> while ((isalnum(c) || c=='_' || c=='.')&& !feof(f) && !isspace(c))
<span Courier New""> c=*(s++)=fgetc(f);
<span Courier New""> ungetc (c,f);
<span Courier New""> *(--s)=0;
<span Courier New""> for (int i=0;i<N_KW &&strcmp(keywords[i],val);i++);
<span Courier New""> if (i!=N_KW) *(s++)=' ';
<span Courier New""> *s=0;
<span Courier New""> if (i!=N_KW) return KEYWORD;
<span Courier New""> return IDENT;
<span Courier New""> }
<span Courier New"">
<span Courier New""> if (c==''' || c=='"') {
<span Courier New""> symbol=0;
<span Courier New""> ungetc(c,f);
<span Courier New""> blockQuote (s,f);
<span Courier New""> *s=0;
<span Courier New""> return IDENT;
<span Courier New""> }
<span Courier New"">
<span Courier New""> if (c=='=' && E && !symbol)
<span Courier New""> {
<span Courier New""> *(s++)=' ';
<span Courier New""> *(s++)=c;
<span Courier New""> *(s++)=' ';
<span Courier New""> *s=0;
<span Courier New""> return OTHER;
<span Courier New""> }
<span Courier New"">
<span Courier New""> *s=c, *(s+1)=0;
<span Courier New""> symbol=1;
<span Courier New""> return OTHER;
<span Courier New"">}
<span Courier New"">
<span Courier New"">void outVal (FILE*f,int back=0)
<span Courier New"">{
<span Courier New""> char *s=val;
<span Courier New"">
<span Courier New""> if (backspace && !back)
<span Courier New""> if (!T) {
<span Courier New""> fputc (9,f);
<span Courier New""> pos+=F3;
<span Courier New""> }
<span Courier New""> else {
<span Courier New""> for (int j=0;j<T;j++)
<span Courier New""> {
<span Courier New""> fputc (' ',f);
<span Courier New""> pos++;
<span Courier New""> }
<span Courier New""> }
<span Courier New""> backspace=0;
<span Courier New""> while (*s) {
<span Courier New""> fputc (*(s++),f);
<span Courier New""> pos++;
<span Courier New""> }
<span Courier New"">}
<span Courier New"">
<span Courier New"">void outCR (FILE*f,int tab,int newLine=0)
<span Courier New"">{
<span Courier New""> int limit=tab-1+newLine;
<span Courier New"">
<span Courier New""> // Out Comments
<span Courier New""> if (*comment)
<span Courier New""> outComment (f);
<span Courier New""> if (!newLine) {
<span Courier New""> fputc ('n',f);
<span Courier New""> pos=0;
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 8 -
<span Courier New"">
<span Courier New""> }
<span Courier New""> for (int i=0;i<limit;i++)
<span Courier New""> {
<span Courier New""> if (!T) {
<span Courier New""> fputc (9,f);
<span Courier New""> pos+=F3;
<span Courier New""> }
<span Courier New""> else {
<span Courier New""> for(int j=0;j<T;j++) {
<span Courier New""> fputc (' ',f);
<span Courier New""> pos++;
<span Courier New""> }
<span Courier New""> }
<span Courier New""> }
<span Courier New""> if (tab && !newLine)
<span Courier New""> backspace=1;
<span Courier New"">}
<span Courier New"">//-----------------------------------------------------------------
<span Courier New"">
<span Courier New"">int format (FILE*f_in,FILE *f_out)
<span Courier New"">{
<span Courier New""> int tab=0,tab1=0,tab2=0,lb=0;
<span Courier New""> int lex;
<span Courier New"">
<span Courier New""> while (!feof(f_in))
<span Courier New""> {
<span Courier New""> lex=getNext(f_in);
<span Courier New""> switch (lex) {
<span Courier New""> case KEYWORD: {
<span Courier New""> lb=0;
<span Courier New""> outVal (f_out);
<span Courier New""> lex=getNext(f_in);
<span Courier New""> break;
<span Courier New""> }
<span Courier New""> case BEGIN: {
<span Courier New""> tab1=0;
<span Courier New""> if (!lb && N!=2) outCR (f_out,tab);
<span Courier New""> if (N==3) outCR (f_out,1,1);
<span Courier New""> outVal(f_out);
<span Courier New""> outCR (f_out,++tab);
<span Courier New""> lb=1;
<span Courier New""> break;
<span Courier New""> }
<span Courier New""> case END: {
<span Courier New""> if (!lb) outCR (f_out,tab);
<span Courier New""> lb=1;
<span Courier New""> tab1=0;
<span Courier New""> lex=getNext (f_in);
<span Courier New""> if (lex==LB) lex=getNext(f_in);
<span Courier New""> undo=lex;
<span Courier New""> outCR (f_out,tab);
<span Courier New""> lb=1;
<span Courier New""> break;
<span Courier New""> }
<span Courier New""> case SEMI: {
<span Courier New""> lb=0;
<span Courier New""> tab1=0;
<span Courier New""> outVal (f_out);
<span Courier New""> lex=getNext(f_in);
<span Courier New""> undo=lex;
<span Courier New""> break;
<span Courier New""> }
<span Courier New""> case IDENT: {
<span Courier New""> lb=0;
<span Courier New""> outVal (f_out);
<span Courier New""> lex=getNext (f_in);
<span Courier New""> undo=lex;
<span Courier New""> break;
<span Courier New""> }
<span Courier New""> case LB: {
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 9 -
<span Courier New"">
<span Courier New""> int used;
<span Courier New"">
<span Courier New""> tab1=0;
<span Courier New""> if (*comment) {
<span Courier New""> outCR (f_out,tab);
<span Courier New""> used=1;
<span Courier New""> }
<span Courier New""> lex=getNext (f_in);
<span Courier New""> if (N!=2 || lex!=BEGIN) {
<span Courier New""> if (!used) outCR (f_out,tab);
<span Courier New""> lb=1;
<span Courier New""> }
<span Courier New""> undo=lex;
<span Courier New""> break;
<span Courier New""> }
<span Courier New""> case EOF:
<span Courier New""> return 1;
<span Courier New""> default: {
<span Courier New""> lb=0;
<span Courier New""> outVal(f_out);
<span Courier New""> }
<span Courier New""> }
<span Courier New""> }
<span Courier New"">
<span Courier New""> return 1;
<span Courier New"">}
<span Courier New"">
<span Courier New"">ਬ¥ç ¨¥:¥®¡å®¤¨¬ë¥ äãªæ¨¨¡ë«¨ ॠ«¨§®¢ ë ¢¯®«®¬ ®¡ê¥¬¥
<span Courier New""> ¨ ¯à¨ á¤ ç¥ à¥ª ¨© ¥ ¢ë§¢ «¨.(’¥áâ®¢ë© ¯à¨¬¥à
<span Courier New""> ¯à¨¢¥¤¥ ¢¯à¨«®¦¥¨¨ apendix' 4.5)
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New"">
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 10 -
<span Courier New"">
<span Courier New""> ‹ ¡®à â®à ïà ¡®â 3
<span Courier New"">
<span Courier New"">‡ ¤ ¨¥:
<span Courier New"">
<span Courier New"">à® «¨§¨®¢ âìåä ¨ ¢ë¡ âì«ãçèãî ¤«ïá«ãç ©®£® à ᯥ¤¥«¥¨ï¨¤-®¢
<span Courier New"">
<span Courier New"">¡®¡é¥ ï䮬㫠¢ëç¨á«¥¨ïåä:
<span Courier New"">
<span Courier New"">h0 = 0;
<span Courier New"">h(i) = Alf*h(i-1) [+] C(i), i=1..k
<span Courier New"">k — ¤«¨ áâப¨. [+] — ¥ª®â® ï¯à®¨§¢®«ì ﮯ¥à æ¨ï
<span Courier New""> (+, -, <<, _rotl, ^ |, &)
<span Courier New"">
<span Courier New"">à® «¨§¨®¢ âìí⨠¨ «î¡ë¥¤à㣨¥ åä ª®«¨ç¥á⢮ ª®««¨§¨©(ª®ä«¨ªâ®¢)
<span Courier New"">¤«ï¥ª®â®àëåá«ãç ©ë寮᫥¤®¢ ⥫ì®áâì. ¯à¨¬¥à:
<span Courier New"">1) id'ëï§ëª C (¤® 50).
<span Courier New"">2) — "" — (¤® 100).
<span Courier New"">3) — "" — (¤® 1000).
<span Courier New"">4)‚¥è¨¥ ¨¬¥ áâ ¤ ⮩¡¨¡«®¨®â⥪¨ BC++.
<span Courier New"">5)‚¥è¨¥ ¨¬¥ £ ä¨ç¥áª®©¡¨¡«¨®â¥ª¨ BC++.
<span Courier New"">6)‘«ãç ©® £¥¥¨ã¥¬ë¥¨¬¥ (~600)
<span Courier New"">7)€£«¨©áª¨¥ áá«®¢ á ¯¥ä¨ªá ¬¨ ¨/¨«¨áãää¨ªá ¬¨ (xxx) — ®ª®«®200
<span Courier New"">8) 300¨¬¥ ¢¨¤ : w000, w001, w002, etc
<span Courier New"">€ «¨§áâ â¨á⨪¨á¢¥á⨠¢â ¡«¨æã/£à 䨪
<span Courier New"">
<span Courier New"">
<span Courier New"">’¥ªá¯à®£à ¬¬ë «¨§ â®à :
<span Courier New"">#include<stdio.h>
<span Courier New"">#include<stdlib.h>
<span Courier New"">
<span Courier New"">unsignedhash_shift(char *s)
<span Courier New"">{
<span Courier New""> unsigned hash = 0;
<span Courier New"">
<span Courier New""> while (*s)
<span Courier New""> hash = (hash << 1) + *s++;
<span Courier New""> return hash;
<span Courier New"">}
<span Courier New"">
<span Courier New"">unsignedhash_rotl(char *s)
<span Courier New"">{
<span Courier New""> unsigned hash = 0;
<span Courier New"">
<span Courier New""> while (*s)
<span Courier New""> hash = _rotl(hash,1) ^ *s++;
<span Courier New""> return hash;
<span Courier New"">}
<span Courier New"">
<span Courier New"">longhash_pgw(char *s)
<span Courier New"">{
<span Courier New""> char *p;
<span Courier New""> unsigned long h = 0, g;
<span Courier New"">
<span Courier New""> for(p=s;*p;p++)
<span Courier New""> {
<span Courier New""> h = (h << 4) + *p;
<span Courier New""> if(g = h & 0xF0000000)
<span Courier New""> {
<span Courier New""> h =h^(g >>24);
<span Courier New""> h =h^g;
<span Courier New""> }
<span Courier New""> }
<span Courier New""> return h;
<span Courier New"">}
<span Courier New"">
<span Courier New"">unsigned hash_4(char *s)
<span Courier New"">{
<span Courier New""> unsigned h = 0;
<span Courier New""> const D=5;
<span Courier New"">
<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA"><span Courier New"">
<span Courier New""> — 11 -
<span Courier New"">
<span Courier New""> while (*s)
<span Courier New""> h = D*h + *s++;
<span Courier New""> return h;
<span Courier New"">}
<span Courier New"">
<span Courier New"">main (intargc,char **argv)
<span Courier New"">{
<span Courier New""> int n=0,total=0;
<span Courier New""> int placed1=0,placed2=0,placed3=0,placed4=0;
<span Courier New""> int max1=0,max2=0,max3=0,max4=0;
<span Courier New""> int *table1,*table2,*table3,*table4;
<span Courier New""> FILE *f;
<span Courier New""> char buf[100];
<span Courier New"">
<span Courier New""> puts("‹ ¡®à â®à ïà ¡®â 3.ˆáá«¥¤®¢ ¨¥åíè-äãªæ¨¨.");
<span Courier New""> puts ("‹ï¯ã®¢ˆ.‚. €-61");
<span Courier New"">
<span Courier New""> if (argc<3)
<span Courier New""> {
<span Courier New""> puts («n HASH.COM <file_name>»);
<span Courier New""> puts (" n — ç¨á«® í«¥¬¥â®¢ ¢â ¡«¨æ¥");
<span Courier New""> puts (" file_name — ¨¬ï ä ©« ᨤ¥â¨ä¨ª â®à ¬¨ n");
<span Courier New""> return 0;
<span Courier New""> }
<span Courier New""> n=atoi(argv[1]);
<span Courier New""> if (n<10)
<span Courier New""> {
<span Courier New""> puts («n ‘«¨èª®¬¬ «¥ìª ïâ ¡«¨æ n»);
<span Courier New""> return 0;
<span Courier New""> }
<span Courier New""> table1=(int*)calloc(n,sizeof(int));
<span Courier New""> table2=(int*)calloc(n,sizeof(int));
<span Courier New""> table3=(int*)calloc(n,sizeof(int));
<span Courier New""> table4=(int*)calloc(n,sizeof(int));
<span Courier New""> if (!table1 || !table2 || !table3 ||!table4)
<span Courier New""> {
<span Courier New""> puts («n¥å¢ ⠥⠯ ¬ï⨤«ï â ¡«¨æn»);
<span Courier New""> return 0;
<span Courier New""> }
<span Courier New""> if ((f=fopen(argv[2],«r»))==NULL)
<span Courier New""> {
<span Courier New""> puts («n¥¬®£ã ®âªàëâì㪠§ ë© ä ©«n»);
<span Courier New""> return 0;
<span Courier New""> }
<span Courier New"">
<span Courier New""> while (!feof(f))
<span Courier New""> if (fscanf (f,"%s",buf)==1)
</p