[stringtemplate-interest] summarizing white space and indentation
Terence Parr
parrt at cs.usfca.edu
Mon Nov 9 12:00:47 PST 2009
Hi guys. I'm going to try to get away with no - operator for now and
see what happens when I try to apply to my multitude of antlr output
templates.
Ter
On Nov 8, 2009, at 5:48 PM, Zenaan Harkness wrote:
> On Sun, Nov 08, 2009 at 12:59:43PM -0800, Jonathan Buhacoff wrote:
>>
>> On Nov 8, 2009, at 10:40 AM, Terence Parr wrote:
>>
>>> Verrrrrrry interesting. Perhaps this gives an opport. to format
>>> templates w/o messing up output.
>>>
>>> <if(x)>
>>> foo
>>> <endif>
>>>
>>> would give "foo\n" by default if x. It would give "" if !x. Wait,
>>> how to remove \n from after foo?
>>>
>>> <if(x)>
>>> foo
>>> <-endif>
>
> Yes. Looks very clean. Aligns with an existing syntax that Jonathan
> raised. Perfect.
>
> Only thing is, you're still assuming removing initial \n.
> So instead perhaps use:
>
> <if(x)->
> foo
> <-endif>
>
> Of course, if we wanted to be really strict here, then it might be:
>
> <-if(x)>
> foo
> <endif->
>
> with the question arising, does the '-' be the syntax that removes
> all whitespace, or just \n. I suggest that anything other than "all
> whitespace between this point and the next bit of non-whitespace is
> removed" would be confusing.
>
> So in my last example above, the pre-fix '-' removes whitespace
> before the 'if', including any newline, and the - after the endif
> would remove whitespace after the if. This of course assumes that the
> user of the template wants "\n foo\n " in their template, which
> is what I tend to use.
>
> But of course, '-' is so simple and visually innocuous, it works a
> treat as far as I can tell, for any scenario someone might want.
>
> Great stuff.
>
>
>>> ?? probably not.
>
> Why not?
>
>
>> You could remove the \n from after foo like this:
>>
>> <if(x)>
>> foo<empty-> <! where empty is an empty template named "empty" !>
>> <endif>
>>
>> or
>>
>> <if(x)>
>> foo<""-> <! empty string as literal empty template !>
>> <endif>
>>
>>
>> Maybe <""-> looks rather ugly, but how nice can a representation of
>> nothingness be? Maybe <\\-> is a little better, but I would expect a
>> backslash out of that and not an empty string. Maybe \e meaning
>> empty
>> string could then be used as <\e->. I like \e because it doesn't
>> step
>> on any existing standard that I know of. ANSI-C defines only \n
>> \r \t
>> \b \\ \? \' and \"
>
> How about just <> and <->, for completely-empty template (if ever
> needed) and for white-space-removing empty template, respectively?
>
> Clean as it gets.
>
>
>>> Let's use a real example where I have a huge single template line to
>>> obtain a single output line (it might wrap in your emailer:
>>>
>>> public <returnType()> <ruleDescriptor
>>> .name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>)
>>> throws RecognitionException \{
>>> <if(ruleDescriptor.hasReturnValue)>return <endif><ruleDescriptor
>>> .grammar:delegateName
>>> ()>.<ruleDescriptor.name>(<ruleDescriptor.parameterScope.attributes:
>>> {a|<a.name>}; separator=", ">); \}}; separator="\n">
>>>
>>> Here we have exprs and IF stuff and {...} stuff with separator
>>> option.
>>> What I'd like is to add some formatting:
>>>
>>> public <returnType()> <ruleDescriptor.name>(
>>> <ruleDescriptor.parameterScope:parameterScope(scope=it)>
>>> ) throws RecognitionException {
>>> <if(ruleDescriptor.hasReturnValue)>return <endif>
>>> <ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(
>>> <ruleDescriptor.parameterScope.attributes:{a|<a.name>};
>>> separator=", ">
>>> );
>>> \}}; separator="\n">
>>>
>>
>> My attempt, this time trying <\e-> to see how it looks. Notice
>> also the
>> leading/trailing whitespace control on other tags:
>>
>> public <returnType()> <ruleDescriptor.name>(<\e->
>> <-ruleDescriptor.parameterScope:parameterScope(scope=it)->
>
> Looking at the above two lines, if the '-' prefixing ruleDescriptor
> removes "all whitespace", then surely the '<\e->' (or <-> or whatever)
> is not necessary at all ??
>
>
>> ) throws RecognitionException {<\e->
>> <-if(ruleDescriptor.hasReturnValue)>return <endif->
>> <-ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(<
>> \e->
>> <-ruleDescriptor.parameterScope.attributes:{a|<a.name>};
>> separator=", "->
>> );<\e->
>> \}}; separator="\n">
>>
>> Or, if the rule for trailing whitespace control is eliminate all
>> whitespace up to the next template tag or literal character (like
>> what
>> <\\> is currently supposed to do), then this specific example
>> wouldn't
>> need to use the leading whitespace controls (but they'd still be
>> necessary for other situations):
>
> Ahh of course. Similar thought process. How about:
>
> public <returnType()> <ruleDescriptor.name>(
> <-ruleDescriptor.parameterScope:parameterScope(scope=it)->
> ) throws RecognitionException {
> <-if(ruleDescriptor.hasReturnValue)>return <endif->
> <ruleDescriptor.grammar:delegateName()>.<ruleDescriptor.name>(
> <-ruleDescriptor.parameterScope.attributes:{a|<a.name>};
> separator=", "->
> );<->
> \}}; separator="\n">
>
>
> Very clean yes? Ter, does this give you exactly what you want?
>
> ...
>>> I guess that works. The <\\> would scarf \n followed by whitespace.
>>> Hmm....seems ok.
>>>
>>> I like the '-' idea so we could indent IFs:
>>>
>>> <if(x)>
>>> <-name> <! don't indent; I'm just formatting template !>
>>> <endif>
>>>
>>> OTOH, that makes it harder to read templates. have to read carefully
>>> to figure out indentation.
>
> I think what you need is any of the following:
>
> <if(x)>
> <-name>
> <-endif>
>
> <if(x)>
> <-name->
> <endif>
>
> <if(x)->
> <name>
> <-endif>
>
> etc
>
> Any of those look about as clean and sweet as it gets, and immediately
> easy to see the output, each of which should be the same?
>
>
> best
> zen
>
>
> --
> Free Australia: www.UPMART.org
> Please respect the confidentiality of this email as sensibly
> warranted.
> _______________________________________________
> stringtemplate-interest mailing list
> stringtemplate-interest at antlr.org
> http://www.antlr.org/mailman/listinfo/stringtemplate-interest
More information about the stringtemplate-interest
mailing list