code: func (p *parser) parsePath(data bool) *ast.PathExpression {
  	var tok *lexer.Token
  
  	// ID
  	tok = p.shift()
  	if tok.Kind != lexer.TokenID {
  		errExpected(lexer.TokenID, tok)
  	}
  
  	result := ast.NewPathExpression(tok.Pos, tok.Line, data)
  	result.Part(tok.Val)
  
  	for p.isPathSep() {
  		// SEP
  		tok = p.shift()
  		result.Sep(tok.Val)
  
  		// ID
  		tok = p.shift()
  		if tok.Kind != lexer.TokenID {
  			errExpected(lexer.TokenID, tok)
  		}
  
  		result.Part(tok.Val)
  
  		if len(result.Parts) > 0 {
  			switch tok.Val {
  			case "..", ".", "this":
  				errToken(tok, "Invalid path: "+result.Original)
  			}
  		}
  	}
  
  	return result
  }
docs: // path : pathSegments
  // pathSegments : pathSegments SEP ID
  //              | ID