summaryrefslogtreecommitdiff
path: root/x2p/a2p.y
diff options
context:
space:
mode:
authorLarry Wall <larry@wall.org>1988-06-05 00:00:00 +0000
committerLarry Wall <larry@wall.org>1988-06-05 00:00:00 +0000
commit378cc40b38293ffc7298c6a7ed3cd740ad79be52 (patch)
tree87bedf9adc5c88847a2e2d85963df5f94435aaf5 /x2p/a2p.y
parenta4de7c03d0bdc29d9d3a18abad4ac2628182ed7b (diff)
downloadperl-378cc40b38293ffc7298c6a7ed3cd740ad79be52.tar.gz
perl 2.0 (no announcement message available)perl-2.0
Some of the enhancements from Perl1 included: * New regexp routines derived from Henry Spencer's. o Support for /(foo|bar)/. o Support for /(foo)*/ and /(foo)+/. o \s for whitespace, \S for non-, \d for digit, \D nondigit * Local variables in blocks, subroutines and evals. * Recursive subroutine calls are now supported. * Array values may now be interpolated into lists: unlink 'foo', 'bar', @trashcan, 'tmp'; * File globbing. * Use of <> in array contexts returns the whole file or glob list. * New iterator for normal arrays, foreach, that allows both read and write. * Ability to open pipe to a forked off script for secure pipes in setuid scripts. * File inclusion via do 'foo.pl'; * More file tests, including -t to see if, for instance, stdin is a terminal. File tests now behave in a more correct manner. You can do file tests on filehandles as well as filenames. The special filetests -T and -B test a file to see if it's text or binary. * An eof can now be used on each file of the <> input for such purposes as resetting the line numbers or appending to each file of an inplace edit. * Assignments can now function as lvalues, so you can say things like ($HOST = $host) =~ tr/a-z/A-Z/; ($obj = $src) =~ s/\.c$/.o/; * You can now do certain file operations with a variable which holds the name of a filehandle, e.g. open(++$incl,$includefilename); $foo = <$incl>; * Warnings are now available (with -w) on use of uninitialized variables and on identifiers that are mentioned only once, and on reference to various undefined things. * There is now a wait operator. * There is now a sort operator. * The manual is now not lying when it says that perl is generally faster than sed. I hope.
Diffstat (limited to 'x2p/a2p.y')
-rw-r--r--x2p/a2p.y83
1 files changed, 47 insertions, 36 deletions
diff --git a/x2p/a2p.y b/x2p/a2p.y
index 15484d2f3b..d5c7149d97 100644
--- a/x2p/a2p.y
+++ b/x2p/a2p.y
@@ -1,9 +1,9 @@
%{
-/* $Header: a2p.y,v 1.0 87/12/18 13:07:05 root Exp $
+/* $Header: a2p.y,v 2.0 88/06/05 00:15:38 root Exp $
*
* $Log: a2p.y,v $
- * Revision 1.0 87/12/18 13:07:05 root
- * Initial revision
+ * Revision 2.0 88/06/05 00:15:38 root
+ * Baseline version 2.0.
*
*/
@@ -42,14 +42,14 @@ program : junk begin hunks end
{ root = oper4(OPROG,$1,$2,$3,$4); }
;
-begin : BEGIN '{' states '}' junk
- { $$ = oper2(OJUNK,$3,$5); in_begin = FALSE; }
+begin : BEGIN '{' maybe states '}' junk
+ { $$ = oper3(OJUNK,$3,$4,$6); in_begin = FALSE; }
| /* NULL */
{ $$ = Nullop; }
;
-end : END '{' states '}'
- { $$ = $3; }
+end : END '{' maybe states '}'
+ { $$ = oper2(OJUNK,$3,$4); }
| end NEWLINE
{ $$ = $1; }
| /* NULL */
@@ -64,10 +64,10 @@ hunks : hunks hunk junk
hunk : patpat
{ $$ = oper1(OHUNK,$1); need_entire = TRUE; }
- | patpat '{' states '}'
- { $$ = oper2(OHUNK,$1,$3); }
- | '{' states '}'
- { $$ = oper2(OHUNK,Nullop,$2); }
+ | patpat '{' maybe states '}'
+ { $$ = oper2(OHUNK,$1,oper2(OJUNK,$3,$4)); }
+ | '{' maybe states '}'
+ { $$ = oper2(OHUNK,Nullop,oper2(OJUNK,$2,$3)); }
;
patpat : pat
@@ -118,7 +118,7 @@ rel : expr RELOP expr
;
match : expr MATCHOP REGEX
- { $$ = oper3(OMATCHOP,$2,$1,$3); }
+ { $$ = oper3(OMATCHOP,$2,$1,oper1(OREGEX,$3)); }
| '(' match ')'
{ $$ = oper1(OMPAREN,$2); }
;
@@ -198,14 +198,6 @@ variable: NUMBER
{ $$ = oper1(OVFLD,$2); }
;
-maybe : NEWLINE
- { $$ = oper0(ONEWLINE); }
- | /* NULL */
- { $$ = Nullop; }
- | COMMENT
- { $$ = oper1(OCOMMENT,$1); }
- ;
-
print_list
: expr
| clist
@@ -237,15 +229,27 @@ hunksep : ';'
{ $$ = oper1(OCOMMENT,$1); }
;
-separator
- : ';'
- { $$ = oper0(OSEMICOLON); }
- | SEMINEW
- { $$ = oper0(OSNEWLINE); }
- | NEWLINE
- { $$ = oper0(OSNEWLINE); }
+maybe : maybe nlstuff
+ { $$ = oper2(OJUNK,$1,$2); }
+ | /* NULL */
+ { $$ = Nullop; }
+ ;
+
+nlstuff : NEWLINE
+ { $$ = oper0(ONEWLINE); }
| COMMENT
- { $$ = oper1(OSCOMMENT,$1); }
+ { $$ = oper1(OCOMMENT,$1); }
+ ;
+
+separator
+ : ';' maybe
+ { $$ = oper2(OJUNK,oper0(OSEMICOLON),$2); }
+ | SEMINEW maybe
+ { $$ = oper2(OJUNK,oper0(OSNEWLINE),$2); }
+ | NEWLINE maybe
+ { $$ = oper2(OJUNK,oper0(OSNEWLINE),$2); }
+ | COMMENT maybe
+ { $$ = oper2(OJUNK,oper1(OSCOMMENT,$1),$2); }
;
states : states statement
@@ -255,11 +259,20 @@ states : states statement
;
statement
- : simple separator
- { $$ = oper2(OSTATE,$1,$2); }
+ : simple separator maybe
+ { $$ = oper2(OJUNK,oper2(OSTATE,$1,$2),$3); }
+ | ';' maybe
+ { $$ = oper2(OSTATE,Nullop,oper2(OJUNK,oper0(OSEMICOLON),$2)); }
+ | SEMINEW maybe
+ { $$ = oper2(OSTATE,Nullop,oper2(OJUNK,oper0(OSNEWLINE),$2)); }
| compound
;
+simpnull: simple
+ | /* NULL */
+ { $$ = Nullop; }
+ ;
+
simple
: expr
| PRINT print_list redir expr
@@ -292,8 +305,6 @@ simple
{ $$ = oper1(OEXIT,$2); }
| CONTINUE
{ $$ = oper0(OCONTINUE); }
- | /* NULL */
- { $$ = Nullop; }
;
redir : RELOP
@@ -311,14 +322,14 @@ compound
{ $$ = oper3(OIF,$3,bl($6,$5),bl($9,$8)); }
| WHILE '(' cond ')' maybe statement
{ $$ = oper2(OWHILE,$3,bl($6,$5)); }
- | FOR '(' simple ';' cond ';' simple ')' maybe statement
+ | FOR '(' simpnull ';' cond ';' simpnull ')' maybe statement
{ $$ = oper4(OFOR,$3,$5,$7,bl($10,$9)); }
- | FOR '(' simple ';' ';' simple ')' maybe statement
+ | FOR '(' simpnull ';' ';' simpnull ')' maybe statement
{ $$ = oper4(OFOR,$3,string("",0),$6,bl($9,$8)); }
| FOR '(' VAR IN VAR ')' maybe statement
{ $$ = oper3(OFORIN,$3,$5,bl($8,$7)); }
- | '{' states '}'
- { $$ = oper1(OBLOCK,$2); }
+ | '{' maybe states '}' maybe
+ { $$ = oper3(OBLOCK,oper2(OJUNK,$2,$3),Nullop,$5); }
;
%%