123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- #!/usr/bin/env perl
- use strict;
- use warnings;
- my (%token, @order, @keywords);
- {
- my $keywords;
- my @const;
- push @const, <<_END_;
- package token
- const(
- _ Token = iota
- _END_
- for (split m/\n/, <<_END_) {
- ILLEGAL
- EOF
- COMMENT
- KEYWORD
- STRING
- BOOLEAN
- NULL
- NUMBER
- IDENTIFIER
- PLUS +
- MINUS -
- MULTIPLY *
- SLASH /
- REMAINDER %
- AND &
- OR |
- EXCLUSIVE_OR ^
- SHIFT_LEFT <<
- SHIFT_RIGHT >>
- UNSIGNED_SHIFT_RIGHT >>>
- AND_NOT &^
- ADD_ASSIGN +=
- SUBTRACT_ASSIGN -=
- MULTIPLY_ASSIGN *=
- QUOTIENT_ASSIGN /=
- REMAINDER_ASSIGN %=
- AND_ASSIGN &=
- OR_ASSIGN |=
- EXCLUSIVE_OR_ASSIGN ^=
- SHIFT_LEFT_ASSIGN <<=
- SHIFT_RIGHT_ASSIGN >>=
- UNSIGNED_SHIFT_RIGHT_ASSIGN >>>=
- AND_NOT_ASSIGN &^=
- LOGICAL_AND &&
- LOGICAL_OR ||
- INCREMENT ++
- DECREMENT --
- EQUAL ==
- STRICT_EQUAL ===
- LESS <
- GREATER >
- ASSIGN =
- NOT !
- BITWISE_NOT ~
- NOT_EQUAL !=
- STRICT_NOT_EQUAL !==
- LESS_OR_EQUAL <=
- GREATER_OR_EQUAL <=
- LEFT_PARENTHESIS (
- LEFT_BRACKET [
- LEFT_BRACE {
- COMMA ,
- PERIOD .
- RIGHT_PARENTHESIS )
- RIGHT_BRACKET ]
- RIGHT_BRACE }
- SEMICOLON ;
- COLON :
- QUESTION_MARK ?
- firstKeyword
- IF
- IN
- DO
- VAR
- FOR
- NEW
- TRY
- THIS
- ELSE
- CASE
- VOID
- WITH
- WHILE
- BREAK
- CATCH
- THROW
- RETURN
- TYPEOF
- DELETE
- SWITCH
- DEFAULT
- FINALLY
- FUNCTION
- CONTINUE
- DEBUGGER
- INSTANCEOF
- lastKeyword
- _END_
- chomp;
- next if m/^\s*#/;
- my ($name, $symbol) = m/(\w+)\s*(\S+)?/;
- if (defined $symbol) {
- push @order, $name;
- push @const, "$name // $symbol";
- $token{$name} = $symbol;
- } elsif (defined $name) {
- $keywords ||= $name eq 'firstKeyword';
- push @const, $name;
- #$const[-1] .= " Token = iota" if 2 == @const;
- if ($name =~ m/^([A-Z]+)/) {
- push @keywords, $name if $keywords;
- push @order, $name;
- if ($token{SEMICOLON}) {
- $token{$name} = lc $1;
- } else {
- $token{$name} = $name;
- }
- }
- } else {
- push @const, "";
- }
- }
- push @const, ")";
- print join "\n", @const, "";
- }
- {
- print <<_END_;
- var token2string = [...]string{
- _END_
- for my $name (@order) {
- print "$name: \"$token{$name}\",\n";
- }
- print <<_END_;
- }
- _END_
- print <<_END_;
- var keywordTable = map[string]_keyword{
- _END_
- for my $name (@keywords) {
- print <<_END_
- "@{[ lc $name ]}": _keyword{
- token: $name,
- },
- _END_
- }
- for my $name (qw/
- const
- class
- enum
- export
- extends
- import
- super
- /) {
- print <<_END_
- "$name": _keyword{
- token: KEYWORD,
- futureKeyword: true,
- },
- _END_
- }
- for my $name (qw/
- implements
- interface
- let
- package
- private
- protected
- public
- static
- /) {
- print <<_END_
- "$name": _keyword{
- token: KEYWORD,
- futureKeyword: true,
- strict: true,
- },
- _END_
- }
- print <<_END_;
- }
- _END_
- }
|