view tests/agcl/parsifal/pex2.syn @ 17:12171da8943f

Don't refer to CVS.
author David A. Holland
date Tue, 31 May 2022 01:56:37 -0400
parents 13d2b8934445
children
line wrap: on
line source

[
  case sensitive = off
  disregard white space
  lexeme {while body text}
]

space = ' ' + '\t'
eof = 0

white space
 -> space
 -> comment

while loop $
 -> while head, while body text, false while condition
 -> while head, while body text, while iteration..., false while condition

while head
 -> "!while"                                         =save_loop_head << PCB.pointer;

while body text     // skips to find end of loop
 -> [~eof - space, ~eof?...], while body terminator  ={save_loop_tail << PCB.pointer;
                                                       save_loop_top >> PCB.pointer;        // Restore top of loop
                                                       save_loop_top << PCB.pointer;        // Save top of loop
                                                      }
while body terminator
 -> "!endw" | "!endwhile"

true while condition, false while condition
 -> expression:x          ={
                             if (x.value.lval) return;
                             CHANGE_REDUCTION(false_while_condition);
                             save_loop_tail >> PCB.pointer;
                             save_loop_head >> junk;
                           }

while iteration
 -> true while condition, while body, while body terminator ={
                                                               save_loop_top >> PCB.pointer;        // Restore top of loop
                                                               save_loop_top << PCB.pointer;        // Save top of loop
                                                             }
while body
 -> [section | eol...]/..., while body terminator