• Rob Pike's avatar
    text/template: make spaces significant · de13e8dc
    Rob Pike authored
    Other than catching an error case that was missed before, this
    CL introduces no changes to the template language or API.
    
    For simplicity, templates use spaces as argument separators.
    This means that spaces are significant: .x .y is not the same as .x.y.
    In the existing code, these cases are discriminated by the lexer,
    but that means for instance that (a b).x cannot be distinguished
    from (a b) .x, which is lousy. Although that syntax is not
    supported yet, we want to support it and this CL is a necessary
    step.
    
    This CL emits a "space" token (actually a run of spaces) from
    the lexer so the parser can discriminate these cases. It therefore
    fixes a couple of undisclosed bugs ("hi".x is now an error) but
    doesn't otherwise change the language. Later CLs will amend
    the grammar to make .X a proper operator.
    
    There is one unpleasantness: With space a token, three-token
    lookahead is now required when parsing variable declarations
    to discriminate them from plain variable references. Otherwise
    the change isn't bad.
    
    The CL also moves the debugging print code out of the lexer
    into the test, which is the only place it's needed or useful.
    
    Step towards resolving issue 3999.
    It still remains to move field chaining out of the lexer
    and into the parser and make field access an operator.
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/6492054
    de13e8dc
parse_test.go 10.8 KB