This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / perl_keyword.pl
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 }