Re: datum comments of sweet-expressions
David A. Wheeler 24 Jul 2013 22:20 UTC
I've modified the ANTLR grammar to support datum comments
of the form "#;"+space|tab, at the beginning of the line. To do this:
* Productions can generate "empty", which means instead of just list/cons/append
we need variants in actions that can handle "empty". That causes many changes, but
they're all pretty obvious, e.g., "cons" becomes "conse" (cons handling empty).
* A new terminal DATUM_COMMENTW is generated by "#;" followed by whitespace
(and like the others doesn't consume the EOL) when we're in indent_processing mode.
* Several rules need to handle the new terminal. The t_expr recurses to the "real" new
rule t_expr_real if it get an empty result, and other minor changes handle it.
Below is a summary.
Does this seem like the right direction? If so, the next step is to implement
this in Scheme (and in Common Lisp). This creates a requirement to "take over"
parts of the n-expression reader, unfortunately, but it does create useful functionality
(commenting datum blocks).
--- David A. Wheeler
================================================
@@ -1017,7 +1084,9 @@ collecting_tail returns [Object v]
// Process line after ". hspace+" sequence. Does not go past current line.
post_period returns [Object v]
- : scomment hspace* rpt=post_period {$v = $rpt.v;} // (scomment hspace*)*
+ : DATUM_COMMENTW hspace*
+ (ignored=n_expr hspace* sp2=post_period {$v = $sp2.v;} | /*empty*/ error )
+ | scomment hspace* rpt=post_period {$v = $rpt.v;} // (scomment hspace*)*
| pn=n_expr hspace* (scomment hspace*)* (n_expr error)? {$v = $pn.v;}
| COLLECTING hspace* pc=collecting_tail hspace*
(scomment hspace*)* (n_expr error)? {$v = $pc.v;}
@@ -1066,6 +1135,8 @@ rest returns [Object v]
: PERIOD /* Improper list */
(hspace+ pp=post_period {$v = $pp.v;}
| /*empty*/ {$v = list(".");})
+ | DATUM_COMMENTW hspace*
+ (ignored=n_expr hspace* sr2=rest {$v = $sr2.v;} | /*empty*/ error )
| scomment hspace* (sr=rest {$v = $sr.v;} | /*empty*/ {$v = null;} )
| COLLECTING hspace* collecting_tail hspace*
(rr=rest {$v = cons($collecting_tail.v, $rr.v);}
@@ -1088,9 +1159,11 @@ body returns [Object v]
(same
( {isperiodp($i.v)}? => f=it_expr DEDENT
{$v = $f.v;} // Improper list final value
- | {! isperiodp($i.v)}? => nxt=body
- {$v = cons($i.v, $nxt.v);} )
- | DEDENT {$v = list($i.v);} ) ;
+ | {$i.v == empty}? => retry=body
+ {$v = $retry.v;}
+ | {!isperiodp($i.v) && ($i.v != empty)}? => nxt=body
+ {$v = conse($i.v, $nxt.v);} )
+ | DEDENT {$v = list1e($i.v);} ) ;
@@ -1128,22 +1201,21 @@ normal_it_expr returns [Object v]
// An it_expr with a special prefix like \\ or $:
special_it_expr returns [Object v]
- : (GROUP_SPLIT | scomment) hspace* /* Initial; Interpet as group */
+ : DATUM_COMMENTW hspace*
+ (is_i=it_expr | comment_eol INDENT body ) {$v=empty;}
+ | (GROUP_SPLIT | scomment) hspace* /* Initial; Interpet as group */
(group_i=it_expr {$v = $group_i.v;} /* Ignore initial GROUP/scomment */
| comment_eol
(INDENT g_body=body {$v = $g_body.v;} /* Normal GROUP use */
- | same ( g_i=it_expr {$v = $g_i.v;} /* Plausible separator */
- /* Handle #!sweet EOL EOL t_expr */
- | comment_eol restart=t_expr {$v = $restart.v;} )
- | DEDENT error ))
+ | same {$v = empty;} ))
--- David A. Wheeler