| 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 | }
|
|---|