# # bounded stack language for Perl (ajohnson@gpu.srv.ualberta.ca) # # $Id: perl.bsl,v 1.7 1998/03/07 05:02:45 ajohnson Exp ajohnson $ # # Warning: do not look directly at the code! # BSL type recursive trans-line typefaces r---- Perl-Plain rb--- Perl-Keyword r--b- Perl-Identifier rb-G- Perl-Sub r--r- Perl-Operator r---- Perl-Regex i---- Perl-Comment t--l- Perl-String r--R- Perl-Escape r-u-- Perl-Mod-Prag t---- Perl-Shebang rb-R- Perl-Delim r--B- Perl-Special t--b- Perl-Handle state set P Perl-Plain C Perl-Comment # some states for regexen and tr/// or y/// M Perl-Regex R Perl-Regex S Perl-Regex T Perl-Plain U Perl-Plain V Perl-Plain W Perl-Plain # single quoted string states: D Perl-Plain A Perl-String B Perl-String # double quoted string states: Q Perl-String H Perl-String # embedded code like as in "blah @{[some code]} blah" E Perl-String # embedded code like ${...}, also soft-references & hash-keys X Perl-String demo string open(FOO,"file.txt")||die "can't $!"; #comment word range a-zA-Z0-9_ rules # ditch blanks tabs semi-colons #PCMRS A QHEX [ \t;]+ nop # # in and out of plain style for pod P \{Perl-Delim}^=[a-z]+*$ push D D \{Perl-Delim}^=cut*$ pop D \{Perl-Delim}^=[a-z]+*$ nop # embedded code ending stuff...has to be early: X \{Perl-Escape}\\} nop X \{Perl-Operator}}{ nop X \{Perl-Operator}} pop E \{Perl-Escape}\\\{Perl-String}] nop E \{Perl-Operator}]} pop # # now for most Perl keywords # P EX \{Perl-Keyword}\:\<__FILE__\>:\<__LINE__\>:\<__PACKAGE__\> nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\:\:\:\:\ nop P EX \{Perl-Keyword}\ nop # EX \{Perl-Sub}[a-zA-Z_][a-zA-Z0-9_:]*\{Perl-Operator}( nop # other Perl keywords we want to treat specially: # P \{Perl-Keyword}\\{Perl-Plain}[ ]+\{Perl-Mod-Prag}\<[a-zA-Z_][a-zA-Z0-9_:]*\> nop P \{Perl-Keyword}\\{Perl-Plain}[ ]+\{Perl-Mod-Prag}\<[a-zA-Z_][a-zA-Z0-9_:]*\> nop P \{Perl-Keyword}\\{Perl-Plain}[ ]+\{Perl-Mod-Prag}\<[a-zA-Z_][a-zA-Z0-9_:]*\> nop P \{Perl-Keyword}^\<__DATA__\>:^\<__END__\> push D P \{Perl-Keyword}\<__DATA__\>:\<__END__\> nop P EX \{Perl-Keyword}\[ ]+\{Perl-Sub}\<[a-zA-Z_][a-zA-Z0-9_]*\>[ ]*\{Perl-Operator}(*) nop P EX \{Perl-Keyword}\[ ]+\{Perl-Sub}\<[a-zA-Z_][a-zA-Z0-9_]*\> nop P EX \{Perl-Keyword}\ nop # # deal with strings: not in embedded E # P \{Perl-Keyword}\\{Perl-Delim}[/!#|'{\[<(]! push Q P \{Perl-Keyword}\\{Perl-Delim}[/!#|'{\[<(]! push Q P \{Perl-Delim}["]! push Q P \{Perl-Keyword}\\{Perl-Delim}[/!#|'{\[<(]! push A P \{Perl-Delim}[']! push A P \{Perl-Operator}<<["]?\{Perl-Delim}[A-Z]*[A-Z]!["]?\{Perl-Plain}; push H P \{Perl-Operator}<<[']\{Perl-Delim}[A-Z]*[A-Z]![']\{Perl-Plain}; push B B H \{Perl-Delim}^[A-Z]*&0$ pop # # deal with regexen and tr,y: not in embedded E # P \{Perl-Keyword}[m]\{Perl-Delim}[']! push V P \{Perl-Keyword}m\{Perl-Delim}[/!#|{\[<(]! push M P \{Perl-Keyword}s\{Perl-Delim}[']! push V, push U P \{Perl-Keyword}s\{Perl-Delim}[/!#|{\[<(]! push R, push S # # P \{Perl-Keyword}tr\{Perl-Delim}[/|'#{\[<(]! push T, push W P \{Perl-Keyword}y\{Perl-Delim}[/!|'#{\[<(]! push T, push W # comments: P \{Perl-Shebang}^#\!*$ nop P \{Perl-Comment}#*$ nop # # last index of array identifier...needs to come before specials: P MRS QHEX \{Perl-Identifier}\$#\<[a-zA-Z_][a-zA-Z0-9_]*\> nop # # Perl special variables: # P R QHEX \{Perl-Special}\$_:\$.:\$[/]:\$\,:\$":\$\\:\$#:\$[*] nop P R QHEX \{Perl-Special}\$]:\$[\[]:\$;:\$[!]:\$@:\$\: nop P RS QHEX \{Perl-Special}\$[0-9][0-9]? nop P R QHEX \{Perl-Special}\$<:\$>:\$(:\$) nop P R QHEX \{Perl-Special}\$\^[ADFILPTWX]\> nop P R QHEX \{Perl-Special}\$%:\$=:\$-:\$~:\$\^:\$|:\$ARGV\> nop P R QHEX \{Perl-Special}\$&:\$`:\$':\$+ nop P R QHEX \{Perl-Special}\:\:\:\:\ nop P R QHEX \{Perl-Special}@ARGV\>:[@$]EXPORT\>:[@$]EXPORT_OK\>:[@$]INC\>:[@$]ISA\>:@_ nop P R QHEX \{Perl-Special}%ENV\>:%INC\>:%OVERLOAD\>:%SIG\> nop # note: still need scalar versions of the last row of special hashes # ie: $ENV{key} etc... P R QHEX \{Perl-Special}\$ENV\>\{Perl-Operator}{ push X P R QHEX \{Perl-Special}\$INC\>\{Perl-Operator}{ push X P R QHEX \{Perl-Special}\$SIG\>\{Perl-Operator}{ push X P R QHEX \{Perl-Special}\$OVERLOAD\>\{Perl-Operator}{ push X # other Perl identifiers, and thingies # P E \{Perl-Handle}\<[A-Z][A-Z0-9_]*\> nop P MRS QHEX \{Perl-Identifier}[$@][a-zA-Z_][a-zA-Z0-9_:]*\{Perl-Operator}{ push X P MRS QHEX \{Perl-Operator}->{ push X P MRS QHEX \{Perl-Identifier}[$@%][$]*\<[a-zA-Z_][a-zA-Z0-9_:]*\> nop P R QHEX \{Perl-Special}\$\$ nop P MRS QHEX \{Perl-Identifier}@\{Perl-Operator}{\[ push E P MRS QHEX \{Perl-Identifier}[$@%]\{Perl-Operator}{ push X P EX \{Perl-Sub}[&]\<[a-zA-Z_][a-zA-Z0-9_:]*\> nop P \{Perl-Sub}[&]\<[a-zA-Z_][a-zA-Z0-9_]*\> nop P \{Perl-Sub}\<[a-zA-Z_][a-zA-Z0-9_:]*\>[ ]*\{Perl-Operator}( nop P \{Perl-Mod-Prag}\<[a-zA-Z_][a-zA-Z0-9_:]*\>[ ]*\{Perl-Operator}-> nop P EX \{Perl-Operator}<<=:>>=:\+\+:--:<<:>>:<=:>=:==:\!=:>=:\&\&:||:\?:->:\*=:/=:%=:\+=:-=:\&=:|=:\^=:,:=:\:|:\^:>:<:(:):\[:\]:.:-:\+:~:\!:\*:\&:/:% nop # # some string state rules # A Q \{Perl-Escape}\\\{Perl-String}&0/!#|'{\[<(/!#|'}\]>)/ nop A Q \{Perl-Delim}&0/!#|'{\[<(/!#|'}\]>)/ pop A Q \\\{Perl-String}&0 nop A Q \{Perl-Delim}&0 pop M S \{Perl-Operator}\\d:\\D:\\w:\\W:\\s:\\S:\\b nop MRS QH \{Perl-Escape}\\[0-9][0-9][0-9]:\\x[0-9A-Fa-f][0-9A-Fa-f]:\\a:\\b:\\e:\\f:\\n:\\r:\\t:\\v:\\0 nop MRS V QH \{Perl-Escape}\\\{Perl-Regex}? nop # # regex rules (also some above): # UV for single quoted: m'V', s'U'V' # SMR for other delimiters: m/M/, s/S/R/ # TW for tr/// and y///: tr/T/W/ # MR UVW \{Perl-Escape}\\\{Perl-String}&0 nop S U W \{Perl-Delim}&0 pop S U W \{Perl-Delim}&0/{\[<(/}\]>)/[\n\t ]*[/'!#|{\[<(]! pop MR V \{Perl-Delim}&0/<\[{(/>\]})/[gesmiox]* pop M S UV \{Perl-Operator}(\?\{Perl-Delim}[ism]+ nop M S UV \{Perl-Operator}\?:\*:\+:\.:\^:\$:(\?\::(\?=:(\?\!:(:):\[:\]:| nop T \{Perl-Delim}&0/'!#|{\[<(/'!#|}\]>)/[cds]* pop S U W \{Perl-Delim}&0/{\[<(/}\]>)/[\n\t ]*[/'!#|{\[<(]! pop