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

📄 reserved.pl

📁 代码检索工具GLOBAL源码。可用来浏览分析LINUX源码。
💻 PL
字号:
#!/usr/bin/perl## Copyright (c) 2003, 2004 Tama Communications Corporation## This file is part of GNU GLOBAL.## GNU GLOBAL is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2, or (at your option)# any later version.## GNU GLOBAL is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.## This command does one of the followings:## [1] Generate option string for gperf(1).# [2] Generate regular expression which means reserved words for htags(1).# [3] Generate gperf(1) source from keyword file.## Both output is stdout.#$com = $0;$com =~ s/.*\///;## Allocation of ID## 1001 - 2000: Reserved variable (PHP)# 2001 -; Reserved word (wide sense)#	2001 - 3000: reserved word#	3001 - 4000: # macro#	4001 - 5000: yacc word#$START_VARIABLE = 1001;$START_WORD = 2001;$START_SHARP = 3001;$START_YACC = 4001;sub usage {	print STDERR "usage: $com --prefix=prefix --option\n";	print STDERR "       $com --prefix=prefix --perl keyword_file\n";	print STDERR "       $com --prefix=prefix keyword_file\n";	exit(1);}$slot_name = 'name';$option = 0;$perl = 0;$prefix = '';$keyword_file = '';while ($ARGV[0] =~ /^-/) {	$opt = shift;	if ($opt =~ /^--prefix=(.*)$/) {		$prefix = $1;	} elsif ($opt =~ /^--option$/) {		$option = 1;	} elsif ($opt =~ /^--perl$/) {		$perl = 1;	} else {		usage();	}}$keyword_file = $ARGV[0];if (!$prefix) {	usage();}## [1] Generate option string for gperf(1).#if ($option) {	print "--language=C\n";	print "--struct-type\n";	print "--slot-name=${slot_name}\n";	print "--hash-fn-name=${prefix}_hash\n";	print "--lookup-fn-name=${prefix}_lookup\n";	exit(0);}if (!$keyword_file) {	usage();}## [2] Generate regular expression which means reserved words for htags(1).#if ($perl) {	local(@array);	open(IP, $keyword_file) || die("$com: cannot open file '$keyword_file'.\n");	while(<IP>) {		chop;		next if (/^$/ || /^;/);		($id, $type) = split;		if ($prefix eq 'sharp') {			if ($type eq 'sharp' && $id ne '##') {				$id =~ s/#//g;				push(@array, $id);			}		} else {			if ($type eq 'word') {				@id = split(/,/, $id);				for ($i = 0; $i < @id; $i++) {					push(@array, $id[$i]);				}			}		}	}	close(IP);	#	# Sort by the length to match pattern to a longer name.	#	sub compare { length($b) <=> length($a); }	@array = sort compare @array;	print "# This part is generated automatically by $com from '$keyword_file'.\n";	if ($prefix eq 'sharp') {		print "\$'sharp_macros = \"(";	} else {		print "\$'${prefix}_reserved_words = \"(";	}	print join('|', @array);	print ")\";\n";	print "# end of generated part.\n";	close(IP);	exit(0);}## [3] Generate gperf(1) source from keyword file.#$PRE = $pre = $prefix;$PRE =~ tr/a-z/A-Z/;$pre =~ tr/A-Z/a-z/;local(%yacctab) = ('%%', 'SEP', '%{', 'BEGIN', '%}', 'END');## Macro definitions.#$n_variable = $START_VARIABLE;$n_word = $START_WORD;$n_sharp = $START_SHARP;$n_yacc = $START_YACC;open(IP, $keyword_file) || die("$com: cannot open file '$keyword_file'.\n");print "%{\n";print "#include \"strmake.h\"\n";print "#define START_VARIABLE\t$n_variable\n";print "#define START_WORD\t$n_word\n";print "#define START_SHARP\t$n_sharp\n";print "#define START_YACC\t$n_yacc\n";print "#define IS_RESERVED_WORD(a)	((a) >= START_WORD)\n";print "#define IS_RESERVED_VARIABLE(a)	((a) >= START_VARIABLE && (a) < START_WORD)\n";print "#define IS_RESERVED_SHARP(a)	((a) >= START_SHARP && (a) < START_YACC)\n";print "#define IS_RESERVED_YACC(a)	((a) >= START_YACC)\n";print "\n";while(<IP>) {	chop;	next if (/^$/ || /^;/);	($id, $type) = split;	@id = split(/,/, $id);	$upper = $id[0];	$upper =~ tr/a-z/A-Z/;	if ($type eq 'word') {		$upper =~ s/::/WCOLON/;		print "#define ${PRE}_${upper}\t${n_word}\n";		$n_word++;	} elsif ($type eq 'variable') {		print "#define ${PRE}_${upper}\t${n_variable}\n";		$n_variable++;	} elsif ($type eq 'sharp') {		$upper =~ s/##/SHARP/;		$upper =~ s/#//g;		print "#define SHARP_${upper}\t${n_sharp}\n";		$n_sharp++;	} elsif ($type eq 'yacc') {		$upper =~ s/(%%|%{|%})/$yacctab{$1}/ge;		$upper =~ s/%//g;		$upper =~ s/-/_/g;		print "#define YACC_${upper}\t${n_yacc}\n";		$n_yacc++;	}}close(IP);print "%}\n";## Structure definition.#print "struct keyword { char *${slot_name}; int token; }\n";print "%%\n";## Keyword definitions.#open(IP, $keyword_file) || die("$com: cannot open file '$keyword_file'.\n");while(<IP>) {	chop;	next if (/^$/ || /^;/);	($id, $type) = split;	@id = split(/,/, $id);	$upper = $id[0];	$upper =~ tr/a-z/A-Z/;	for ($i = 0; $i < @id; $i++) {		$name = $id[$i];		if ($type eq 'word') {			$upper =~ s/::/WCOLON/;			print "$name, ${PRE}_${upper}\n";		} elsif ($type eq 'variable') {			print "\"${name}\", ${PRE}_${upper}\n";		} elsif ($type eq 'sharp') {			$upper =~ s/##/SHARP/;			$upper =~ s/#//g;			print "\"${name}\", SHARP_${upper}\n";		} elsif ($type eq 'yacc') {			$upper =~ s/(%%|%{|%})/$yacctab{$1}/ge;			$upper =~ s/%//g;			$upper =~ s/-/_/g;			print "\"${name}\", YACC_${upper}\n";		}	}}close(IP);print "%%\n";## Generate reserved_xxxx() procedures.#sub generate_procedure {	local($type) = @_;	local($TYPE) = $type;	$TYPE =~ tr/a-z/A-Z/;	print "int ${prefix}_reserved_${type}(const char *, int);\n";	print "int\n";	print "${prefix}_reserved_${type}(str, len)\n";	print "\tconst char *str;\n";	print "\tint len;\n";	print "{\n";	print "\tstruct keyword *keyword;\n";	print "\n";	if ($type eq 'sharp') {		print "\t/* Delete blanks. Ex. ' # define ' => '#define' */\n";		print "\tstr = strtrim(str, TRIM_ALL, &len);\n";		print "\n";	}	print "\tkeyword = ${pre}_lookup(str, len);\n";	print "\treturn (keyword && IS_RESERVED_${TYPE}(keyword->token)) ? keyword->token : 0;\n";	print "}\n";}if ($n_word > $START_WORD) {	generate_procedure('word');}if ($n_variable > $START_VARIABLE) {	generate_procedure('variable');}if ($n_sharp > $START_SHARP) {	generate_procedure('sharp');}if ($n_yacc > $START_YACC) {	generate_procedure('yacc');}exit 0;

⌨️ 快捷键说明

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