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