@@ -1334,7 +1334,7 @@ func (p *parser) parseFuncTypeOrLit() ast.Expr {
1334
1334
// types of the form [...]T. Callers must verify the result.
1335
1335
// If lhs is set and the result is an identifier, it is not resolved.
1336
1336
//
1337
- func (p * parser ) parseOperand (lhs bool ) ast.Expr {
1337
+ func (p * parser ) parseOperand (lhs , allowTuple bool ) ast.Expr {
1338
1338
if p .trace {
1339
1339
defer un (trace (p , "Operand" ))
1340
1340
}
@@ -1358,8 +1358,24 @@ func (p *parser) parseOperand(lhs bool) ast.Expr {
1358
1358
case token .LPAREN :
1359
1359
lparen := p .pos
1360
1360
p .next ()
1361
+ if allowTuple && p .tok == token .RPAREN { // () => expr
1362
+ p .next ()
1363
+ return & tupleExpr {}
1364
+ }
1361
1365
p .exprLev ++
1362
1366
x := p .parseRHSOrType () // types may be parenthesized: (some type)
1367
+ if allowTuple && p .tok == token .COMMA {
1368
+ // (x, y, ...) => expr
1369
+ items := make ([]* ast.Ident , 1 , 2 )
1370
+ items [0 ] = x .(* ast.Ident )
1371
+ for p .tok == token .COMMA {
1372
+ p .next ()
1373
+ items = append (items , p .parseIdent ())
1374
+ }
1375
+ p .exprLev --
1376
+ p .expect (token .RPAREN )
1377
+ return & tupleExpr {items : items }
1378
+ }
1363
1379
p .exprLev --
1364
1380
rparen := p .expect (token .RPAREN )
1365
1381
if debugParseOutput {
@@ -1759,12 +1775,12 @@ func (p *parser) checkExprOrType(x ast.Expr) ast.Expr {
1759
1775
}
1760
1776
1761
1777
// If lhs is set and the result is an identifier, it is not resolved.
1762
- func (p * parser ) parsePrimaryExpr (lhs bool ) ast.Expr {
1778
+ func (p * parser ) parsePrimaryExpr (lhs , allowTuple bool ) ast.Expr {
1763
1779
if p .trace {
1764
1780
defer un (trace (p , "PrimaryExpr" ))
1765
1781
}
1766
1782
1767
- x := p .parseOperand (lhs )
1783
+ x := p .parseOperand (lhs , allowTuple )
1768
1784
L:
1769
1785
for {
1770
1786
switch p .tok {
1817
1833
}
1818
1834
1819
1835
// If lhs is set and the result is an identifier, it is not resolved.
1820
- func (p * parser ) parseUnaryExpr (lhs bool ) ast.Expr {
1836
+ func (p * parser ) parseUnaryExpr (lhs , allowTuple bool ) ast.Expr {
1821
1837
if p .trace {
1822
1838
defer un (trace (p , "UnaryExpr" ))
1823
1839
}
@@ -1826,7 +1842,7 @@ func (p *parser) parseUnaryExpr(lhs bool) ast.Expr {
1826
1842
case token .ADD , token .SUB , token .NOT , token .XOR , token .AND :
1827
1843
pos , op := p .pos , p .tok
1828
1844
p .next ()
1829
- x := p .parseUnaryExpr (false )
1845
+ x := p .parseUnaryExpr (false , false )
1830
1846
return & ast.UnaryExpr {OpPos : pos , Op : op , X : p .checkExpr (x )}
1831
1847
1832
1848
case token .ARROW :
@@ -1848,7 +1864,7 @@ func (p *parser) parseUnaryExpr(lhs bool) ast.Expr {
1848
1864
// <- (chan type) => (<-chan type)
1849
1865
// <- (chan<- type) => (<-chan (<-type))
1850
1866
1851
- x := p .parseUnaryExpr (false )
1867
+ x := p .parseUnaryExpr (false , false )
1852
1868
1853
1869
// determine which case we have
1854
1870
if typ , ok := x .(* ast.ChanType ); ok {
@@ -1879,11 +1895,11 @@ func (p *parser) parseUnaryExpr(lhs bool) ast.Expr {
1879
1895
// pointer type or unary "*" expression
1880
1896
pos := p .pos
1881
1897
p .next ()
1882
- x := p .parseUnaryExpr (false )
1898
+ x := p .parseUnaryExpr (false , false )
1883
1899
return & ast.StarExpr {Star : pos , X : p .checkExprOrType (x )}
1884
1900
}
1885
1901
1886
- return p .parsePrimaryExpr (lhs )
1902
+ return p .parsePrimaryExpr (lhs , allowTuple )
1887
1903
}
1888
1904
1889
1905
func (p * parser ) tokPrec () (token.Token , int ) {
@@ -1895,12 +1911,12 @@ func (p *parser) tokPrec() (token.Token, int) {
1895
1911
}
1896
1912
1897
1913
// If lhs is set and the result is an identifier, it is not resolved.
1898
- func (p * parser ) parseBinaryExpr (lhs bool , prec1 int ) ast.Expr {
1914
+ func (p * parser ) parseBinaryExpr (lhs bool , prec1 int , allowTuple bool ) ast.Expr {
1899
1915
if p .trace {
1900
1916
defer un (trace (p , "BinaryExpr" ))
1901
1917
}
1902
1918
1903
- x := p .parseErrWrapExpr (lhs ) // TODO: change priority level of ErrWrapExpr
1919
+ x := p .parseErrWrapExpr (lhs , allowTuple ) // TODO: change priority level of ErrWrapExpr
1904
1920
for {
1905
1921
op , oprec := p .tokPrec ()
1906
1922
if oprec < prec1 {
@@ -1911,13 +1927,13 @@ func (p *parser) parseBinaryExpr(lhs bool, prec1 int) ast.Expr {
1911
1927
p .resolve (x )
1912
1928
lhs = false
1913
1929
}
1914
- y := p .parseBinaryExpr (false , oprec + 1 )
1930
+ y := p .parseBinaryExpr (false , oprec + 1 , false )
1915
1931
x = & ast.BinaryExpr {X : p .checkExpr (x ), OpPos : pos , Op : op , Y : p .checkExpr (y )}
1916
1932
}
1917
1933
}
1918
1934
1919
- func (p * parser ) parseErrWrapExpr (lhs bool ) ast.Expr { // expr! expr? expr?:defval
1920
- x := p .parseUnaryExpr (lhs )
1935
+ func (p * parser ) parseErrWrapExpr (lhs , allowTuple bool ) ast.Expr { // expr! expr? expr?:defval
1936
+ x := p .parseUnaryExpr (lhs , allowTuple )
1921
1937
switch p .tok {
1922
1938
case token .NOT : // expr!
1923
1939
expr := & ast.ErrWrapExpr {X : x , Tok : token .NOT , TokPos : p .pos }
@@ -1928,14 +1944,76 @@ func (p *parser) parseErrWrapExpr(lhs bool) ast.Expr { // expr! expr? expr?:defv
1928
1944
p .next ()
1929
1945
if p .tok == token .COLON {
1930
1946
p .next ()
1931
- expr .Default = p .parseUnaryExpr (false )
1947
+ expr .Default = p .parseUnaryExpr (false , true )
1932
1948
}
1933
1949
return expr
1934
1950
default :
1935
1951
return x
1936
1952
}
1937
1953
}
1938
1954
1955
+ type tupleExpr struct {
1956
+ ast.Expr
1957
+ items []* ast.Ident
1958
+ }
1959
+
1960
+ func (p * parser ) parseLambdaExpr () ast.Expr {
1961
+ var x ast.Expr
1962
+ var first = p .pos
1963
+ if p .tok != token .RARROW {
1964
+ x = p .parseBinaryExpr (false , token .LowestPrec + 1 , true )
1965
+ }
1966
+ if p .tok == token .RARROW { // =>
1967
+ var rarrow = p .pos
1968
+ var rhs []ast.Expr
1969
+ var lhsHasParen , rhsHasParen bool
1970
+ p .next ()
1971
+ switch p .tok {
1972
+ case token .LPAREN : // (
1973
+ rhsHasParen = true
1974
+ p .next ()
1975
+ for {
1976
+ item := p .parseExpr (false )
1977
+ rhs = append (rhs , item )
1978
+ if p .tok != token .COMMA {
1979
+ break
1980
+ }
1981
+ p .next ()
1982
+ }
1983
+ p .expect (token .RPAREN )
1984
+ default :
1985
+ rhs = []ast.Expr {p .parseExpr (false )}
1986
+ }
1987
+ var lhs []* ast.Ident
1988
+ if x != nil {
1989
+ switch v := x .(type ) {
1990
+ case * tupleExpr :
1991
+ lhs , lhsHasParen = v .items , true
1992
+ case * ast.ParenExpr :
1993
+ lhs , lhsHasParen = []* ast.Ident {v .X .(* ast.Ident )}, true
1994
+ default :
1995
+ lhs = []* ast.Ident {x .(* ast.Ident )}
1996
+ }
1997
+ }
1998
+ if debugParseOutput {
1999
+ log .Printf ("ast.LambdaExpr{Lhs: %v}\n " , lhs )
2000
+ }
2001
+ return & ast.LambdaExpr {
2002
+ First : first ,
2003
+ Last : p .pos ,
2004
+ Lhs : lhs ,
2005
+ Rarrow : rarrow ,
2006
+ Rhs : rhs ,
2007
+ LhsHasParen : lhsHasParen ,
2008
+ RhsHasParen : rhsHasParen ,
2009
+ }
2010
+ }
2011
+ if _ , ok := x .(* tupleExpr ); ok {
2012
+ panic ("TODO: tupleExpr" )
2013
+ }
2014
+ return x
2015
+ }
2016
+
1939
2017
// If lhs is set and the result is an identifier, it is not resolved.
1940
2018
// The result may be a type or even a raw type ([...]int). Callers must
1941
2019
// check the result (using checkExpr or checkExprOrType), depending on
@@ -1944,8 +2022,10 @@ func (p *parser) parseExpr(lhs bool) ast.Expr {
1944
2022
if p .trace {
1945
2023
defer un (trace (p , "Expression" ))
1946
2024
}
1947
-
1948
- return p .parseBinaryExpr (lhs , token .LowestPrec + 1 )
2025
+ if lhs {
2026
+ return p .parseBinaryExpr (lhs , token .LowestPrec + 1 , false )
2027
+ }
2028
+ return p .parseLambdaExpr ()
1949
2029
}
1950
2030
1951
2031
func (p * parser ) parseRHS () ast.Expr {
@@ -2883,7 +2963,7 @@ func (p *parser) parseFuncDecl() *ast.FuncDecl {
2883
2963
}
2884
2964
}
2885
2965
if debugParseOutput {
2886
- log .Printf ("ast.FuncDecl{Name: %v}\n " , ident .Name )
2966
+ log .Printf ("ast.FuncDecl{Name: %v, ... }\n " , ident .Name )
2887
2967
}
2888
2968
return decl
2889
2969
}
0 commit comments