ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/staticperl/perl/perl_keyword.pl
Revision: 1.1
Committed: Thu Jun 30 14:26:42 2005 UTC (19 years ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1
2     # How to generate the logic of the lookup table Perl_keyword() in toke.c
3    
4     use Devel::Tokenizer::C 0.05;
5     use strict;
6     use warnings;
7    
8     my @pos = qw(__DATA__ __END__ AUTOLOAD BEGIN CHECK DESTROY do delete defined
9     END else eval elsif exists for format foreach grep goto glob INIT
10     if last local m my map next no our pos print printf package
11     prototype q qr qq qw qx redo return require s scalar sort split
12     study sub tr tie tied use undef until untie unless while y);
13    
14     # In 5.8.x there is no err
15     my @neg = qw(__FILE__ __LINE__ __PACKAGE__ and abs alarm atan2 accept bless
16     bind binmode CORE cmp chr cos chop close chdir chomp chmod chown
17     crypt chroot caller connect closedir continue die dump dbmopen
18     dbmclose eq eof exp exit exec each endgrent endpwent
19     endnetent endhostent endservent endprotoent fork fcntl flock
20     fileno formline getppid getpgrp getpwent getpwnam getpwuid
21     getpeername getprotoent getpriority getprotobyname
22     getprotobynumber gethostbyname gethostbyaddr gethostent
23     getnetbyname getnetbyaddr getnetent getservbyname getservbyport
24     getservent getsockname getsockopt getgrent getgrnam getgrgid
25     getlogin getc gt ge gmtime hex int index ioctl join keys kill lt
26     le lc log link lock lstat length listen lcfirst localtime mkdir
27     msgctl msgget msgrcv msgsnd ne not or ord oct open opendir pop
28     push pack pipe quotemeta ref read rand recv rmdir reset rename
29     rindex reverse readdir readlink readline readpipe rewinddir seek
30     send semop select semctl semget setpgrp seekdir setpwent setgrent
31     setnetent setsockopt sethostent setservent setpriority
32     setprotoent shift shmctl shmget shmread shmwrite shutdown sin
33     sleep socket socketpair sprintf splice sqrt srand stat substr
34     system symlink syscall sysopen sysread sysseek syswrite tell time
35     times telldir truncate uc utime umask unpack unlink unshift
36     ucfirst values vec warn wait write waitpid wantarray x xor);
37    
38     my %pos = map { ($_ => 1) } @pos;
39    
40     my $t = Devel::Tokenizer::C->new( TokenFunc => \&perl_keyword
41     , TokenString => 'name'
42     , StringLength => 'len'
43     , MergeSwitches => 1
44     );
45    
46     $t->add_tokens(@pos, @neg, 'elseif');
47    
48     my $switch = $t->generate(Indent => ' ');
49    
50     print <<END;
51     /*
52     * The following code was generated by $0.
53     */
54    
55     I32
56     Perl_keyword (pTHX_ char *name, I32 len)
57     {
58     $switch
59     unknown:
60     return 0;
61     }
62     END
63    
64     sub perl_keyword
65     {
66     my $k = shift;
67     my $sign = $pos{$k} ? '' : '-';
68    
69     if ($k eq 'elseif') {
70     return <<END;
71     if(ckWARN_d(WARN_SYNTAX))
72     Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
73     END
74     }
75    
76     return <<END;
77     return ${sign}KEY_$k;
78     END
79     }