🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #2144

Re: How do I add a new keywork to the front end?

#2144
From: Doug Schmidt
Date: Tue, 17 Jan 1989 06:53
134 lines
4707 bytes
In article <HAM.89Jan16190223@polya.Stanford.EDU> ham@polya.Stanford.EDU (Peter R. Ham) writes:
>
>I'm trying to add the new keyword "shared" as a storage class specifier
>for the front end.
>
>In c-parse.y there's a table of keywords.  The comment says that I keyword
>cannot be added by hand, instead the program "perfect-hash" must be used?
>
>Where is this program?  Does anyone understand this comment?

That program is available via ftp from ics.uci.edu (128.195.0.1) in
~ftp/pub/gperf.tar.1.3.Z, and a beta version of it is in the libg++
1.32 distribution.

However, here is a quick table for you: you'll have to decide what
attributes to give to ``shared,'' I just made a quick guess.  Let
me know if there are any problems with this.

Doug

----------------------------------------
/* C code produced by gperf version 1.4 */
/* Command-line: gp -k1,2,$ -o -t gnuc.input  */

struct resword { char *name; short token; enum rid rid; };

#define MIN_WORD_LENGTH 2
#define MAX_WORD_LENGTH 9
#define MIN_HASH_VALUE 4
#define MAX_HASH_VALUE 59
/*
37 keywords
56 is the maximum key range
*/

inline static int 
hash (str, len)
register char	*str;
register int	len;
{
	static int cval[] = {
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
		  59,  59,  59,  59,  59,  15,  59,   0,   0,  35,
		   5,   0,  10,  10,   5,  20,  59,   0,  15,  30,
		   0,   0,  59,  59,  15,   0,   0,   0,   0,  45,
		  40,  35,  59,  59,  59,  59,  59,  59,
	};
	return (len + cval[str[1]] + cval[str[0]] + cval[str[len - 1]]);
}

inline static int 
is_reserved_word (str, len)
register char *str;
register int len;
{

	static struct resword wordlist[] = {
		{ "",},{ "",},{ "",},{ "",},
		{ "auto", SCSPEC, RID_AUTO },
		{ "union", UNION, NORID },
		{ "struct", STRUCT, NORID },
		{ "do", DO, NORID },
		{ "volatile", TYPE_QUAL, RID_VOLATILE },
		{ "void", TYPESPEC, RID_VOID },
		{ "short", TYPESPEC, RID_SHORT },
		{ "double", TYPESPEC, RID_DOUBLE },
		{ "default", DEFAULT, NORID },
		{ "unsigned", TYPESPEC, RID_UNSIGNED },
		{ "goto", GOTO, NORID },
		{ "",},
		{ "shared", SCSPEC, RID_SHARED },
		{ "",},{ "",},
		{ "else", ELSE, NORID },
		{ "break", BREAK, NORID },
		{ "return", RETURN, NORID },
		{ "",},
		{ "int", TYPESPEC, RID_INT },
		{ "",},{ "",},
		{ "inline", SCSPEC, RID_INLINE },
		{ "",},
		{ "for", FOR, NORID },
		{ "long", TYPESPEC, RID_LONG },
		{ "float", TYPESPEC, RID_FLOAT },
		{ "signed", TYPESPEC, RID_SIGNED },
		{ "",},
		{ "asm", ASM, NORID },
		{ "enum", ENUM, NORID },
		{ "",},
		{ "sizeof", SIZEOF, NORID },
		{ "",},
		{ "register", SCSPEC, RID_REGISTER },
		{ "case", CASE, NORID },
		{ "const", TYPE_QUAL, RID_CONST },
		{ "static", SCSPEC, RID_STATIC },
		{ "if", IF, NORID },
		{ "continue", CONTINUE, NORID },
		{ "",},{ "",},
		{ "extern", SCSPEC, RID_EXTERN },
		{ "",},{ "",},
		{ "__alignof", ALIGNOF, NORID },
		{ "",},
		{ "typeof", TYPEOF, NORID },
		{ "typedef", SCSPEC, RID_TYPEDEF },
		{ "",},{ "",},
		{ "while", WHILE, NORID },
		{ "switch", SWITCH, NORID },
		{ "",},{ "",},
		{ "char", TYPESPEC, RID_CHAR },
	};

	if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) {
		register int key = hash (str, len);

		if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE) {
			register char *s = wordlist[key].name;

			return (*s == *str && ! strcmp (str + 1, s + 1));
		}
	}
	return (0);
}
--
schmidt@ics.uci.edu (ARPA) |   Per me si va nella citta' dolente.
office: (714) 856-4043     |   Per me si va nell'eterno dolore.
                           |   Per me si va tra la perduta gente.
                           |   Lasciate ogni speranza o voi ch'entrate.
Technical Details
Message-ID: <4333@paris.ics.uci.edu>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!watmath!uunet!bu-cs!bloom-beacon!oberon!orion.cf.uci.edu!uci-ics!glacier.ics.uci.edu!schmidt
References: <HAM.89Jan16190223@polya.Stanford.EDU>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!watmath!uunet!bu-cs!bloom-beacon!oberon!orion.cf.uci.edu!uci-ics!glacier.ics.uci.edu!schmidt
From: schmidt@glacier.ics.uci.edu (Doug Schmidt)
Newsgroups: gnu.gcc.bug
Subject: Re: How do I add a new keywork to the front end?
Message-ID: <4333@paris.ics.uci.edu>
Date: 17 Jan 89 06:53:56 GMT
References: <HAM.89Jan16190223@polya.Stanford.EDU>
Sender: news@paris.ics.uci.edu
Reply-To: Doug Schmidt <schmidt@glacier.ics.uci.edu>
Distribution: gnu
Organization: University of California, Irvine - Dept of ICS
Lines: 134