MAKEFILE:
=========

<makefile> ::= '(' + "makefile" + { <makerule-clause> | <common-clause> }* ')'

<makerule-clause> ::= <file-clause> 
		      | <all-clause>
                      | <md5-clause> 
		      | <always-clause> 
	              | <once-clause>
	              | <perms-clause>
	              | <md5-perms-clause>
	              | <paranoid-clause>

<common-clause> ::= '(' + "common" + <makerule-clause>* + ')'

<file-clause> ::= '(' + <fille-clause-identifier>
		      + <target-spec> 
	              + <prereq-spec> 
		      + <action>+ + ')'

<all-clause> ::= '(' + <all-clause-identifier>
		      + <target-spec> 
	              + <prereq-spec> 
		      + <action>+ + ')'

<md5-clause> ::= '(' + <md5-clause-identifier>
                     + <target-spec> 
	             + <prereq-spec> 
		     + <action-spec> + ')'

<perms-clause> ::= '(' + <perms-clause-identifier>
                       + <target-spec> 
	               + <prereq-spec> 
		       + <action-spec> + ')'

<md5-perms-clause> ::= '(' + <md5-perms-clause-identifier>
                           + <target-spec> 
	                   + <prereq-spec> 
		           + <action-spec> + ')'

<paranoid-clause> ::= '(' + <paranoid-clause-identifier>
                          + <target-spec> 
	                  + <prereq-spec> 
		          + <action-spec> + ')'

<always-clause> ::= '(' + <always-clause-identifier>
		        + <target-spec> 
	                + <prereq-spec> 
		        + <action-spec> + ')'

<once-clause> ::= '(' + <once-clause-identifier>
		      + <target-spec> 
	              + <prereq-spec> 
		      + <action-spec> + ')'

<file-clause-identifier> ::= "file" 
                             | "makefile-rule" 
                             | "is-out-of-date?"

<all-clause-identifier> ::= "all" 

<md5-clause-identifier> ::= "md5" 

<perms-clause-identifier> ::= "perms" 

<md5-perms-clause-identifier> ::= "md5-perms" 

<paranoid-clause-identifier> ::= "paranoid" 

<always-clause-identifier> ::= "always" 

<once-clause-identifier> ::= "once" 

<common-target-spec> ::= <target-descr> | <target> | <target-list>
<target-descr> ::= <target-pattern> | <target-rx>
<target-pattern> ::= '"' + <prefix> + '%' + <suffix> + '"'
<prefix> ::= <letter-or-digit>*
<suffix> ::= <letter-or-digit>*
<target-rx> ::= '(' + "rx" + '(' + <submatch-connector> 
                                 + <submatch-clause>{3} + ')' + ')'

<common-prereq-spec> ::= <prereq-descr> 
<prereq-pattern> ::= '"' + <prefix> + '%' + <suffix> + '"'
<prereq-descr> ::= '(' + { <prereq-pattern> | <prereq> }* + ')'

<target-spec> ::= <target> | <target-list>
<target> ::= <filename>
<target-list> ::= '(' + <filename>+ + ')'

<prereq-spec> ::= <prereq-list>
<prereq> ::= <filename>
<prereq-list> ::= '(' + <prereq>* + ')'

<action> ::= <function-call> | <value>

<filename> ::= '"' + {<dir-separator> + { 'a'-'z''A'-'Z''0'-'9' ... }+ }+ + '"'