1
0
mirror of https://github.com/golang/go synced 2024-09-30 02:14:29 -06:00

cmd/compile: remove references to go.y and update documentation

This is a comment/documentation change only but for a minor
code change in the file and package_ methods (move recognition
of semi to match grammar better).

Per request from r.

Change-Id: I81ec985cc5831074d9eb5e8ffbf7e59466284819
Reviewed-on: https://go-review.googlesource.com/17202
Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
Robert Griesemer 2015-11-24 14:49:10 -08:00
parent d0351e9666
commit 3cac3b5fca

View File

@ -4,6 +4,14 @@
package gc
// The recursive-descent parser is built around a slighty modified grammar
// of Go to accomodate for the constraints imposed by strict one token look-
// ahead, and for better error handling. Subsequent checks of the constructed
// syntax tree restrict the language accepted by the compiler to proper Go.
//
// Semicolons are inserted by the lexer. The parser uses one-token look-ahead
// to handle optional commas and semicolons before a closing ) or } .
import (
"fmt"
"strconv"
@ -40,6 +48,7 @@ func pop_parser() {
savedstate = savedstate[:n]
}
// parse_file sets up a new parser and parses a single Go source file.
func parse_file() {
thenewparser = parser{}
thenewparser.loadsys()
@ -47,11 +56,9 @@ func parse_file() {
thenewparser.file()
}
// This loads the definitions for the low-level runtime functions,
// loadsys loads the definitions for the low-level runtime functions,
// so that the compiler can generate calls to them,
// but does not make the name "runtime" visible as a package.
//
// go.y:loadsys
func (p *parser) loadsys() {
if trace && Debug['x'] != 0 {
defer p.trace("loadsys")()
@ -292,16 +299,20 @@ func (p *parser) trace(msg string) func() {
// ----------------------------------------------------------------------------
// Parsing package files
//
// Parse methods are annotated with matching Go productions as appropriate.
// The annotations are intended as guidelines only since a single Go grammar
// rule may be covered by multiple parse methods and vice versa.
// go.y:file
// SourceFile = PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" } .
func (p *parser) file() {
if trace && Debug['x'] != 0 {
defer p.trace("file")()
}
p.package_()
p.want(';')
//go.y:imports
for p.tok == LIMPORT {
p.import_()
p.want(';')
@ -312,7 +323,8 @@ func (p *parser) file() {
p.want(EOF)
}
// go.y:package
// PackageClause = "package" PackageName .
// PackageName = identifier .
func (p *parser) package_() {
if trace && Debug['x'] != 0 {
defer p.trace("package_")()
@ -320,7 +332,6 @@ func (p *parser) package_() {
if p.got(LPACKAGE) {
mkpackage(p.sym().Name)
p.want(';')
} else {
prevlineno = lineno // see issue #13267
p.syntax_error("package statement must be first")
@ -328,7 +339,7 @@ func (p *parser) package_() {
}
}
// go.y:import
// ImportDecl = "import" ( ImportSpec | "(" { ImportSpec ";" } ")" ) .
func (p *parser) import_() {
if trace && Debug['x'] != 0 {
defer p.trace("import_")()
@ -348,7 +359,6 @@ func (p *parser) import_() {
}
}
// go.y:import_stmt
func (p *parser) import_stmt() {
if trace && Debug['x'] != 0 {
defer p.trace("import_stmt")()
@ -406,7 +416,11 @@ func (p *parser) import_stmt() {
}
}
// go.y:import_here
// ImportSpec = [ "." | PackageName ] ImportPath .
// ImportPath = string_lit .
//
// import_here switches the underlying lexed source to the export data
// of the imported package.
func (p *parser) import_here() int {
if trace && Debug['x'] != 0 {
defer p.trace("import_here")()
@ -438,7 +452,8 @@ func (p *parser) import_here() int {
return line
}
// go.y:import_package
// import_package parses the header of an imported package as exported
// in textual format from another package.
func (p *parser) import_package() {
if trace && Debug['x'] != 0 {
defer p.trace("import_package")()
@ -453,7 +468,6 @@ func (p *parser) import_package() {
p.import_error()
}
// go.y:import_safety
if p.tok == LNAME {
if p.sym_.Name == "safe" {
curio.importsafe = true
@ -478,7 +492,8 @@ func (p *parser) import_package() {
}
}
// go.y:import_there
// import_there parses the imported package definitions and then switches
// the underlying lexed source back to the importing package.
func (p *parser) import_there() {
if trace && Debug['x'] != 0 {
defer p.trace("import_there")()
@ -497,7 +512,10 @@ func (p *parser) import_there() {
unimportfile()
}
// go.y:common_dcl
// Declaration = ConstDecl | TypeDecl | VarDecl .
// ConstDecl = "const" ( ConstSpec | "(" { ConstSpec ";" } ")" ) .
// TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
// VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
func (p *parser) common_dcl() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("common_dcl")()
@ -539,7 +557,7 @@ func (p *parser) common_dcl() *NodeList {
return l
}
// go.y:vardcl
// VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
func (p *parser) vardcl() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("vardcl")()
@ -560,7 +578,7 @@ func (p *parser) vardcl() *NodeList {
return variter(names, typ, exprs)
}
// go.y:constdcl
// ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] .
func (p *parser) constdcl() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("constdcl")()
@ -579,7 +597,7 @@ func (p *parser) constdcl() *NodeList {
return constiter(names, typ, exprs)
}
// go.y:typedcl
// TypeSpec = identifier Type .
func (p *parser) typedcl() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("typedcl")()
@ -597,8 +615,9 @@ func (p *parser) typedcl() *NodeList {
return list1(typedcl1(name, typ, true))
}
// go.y:simple_stmt
// may return missing_stmt if labelOk is set
// SimpleStmt = EmptyStmt | ExpressionStmt | SendStmt | IncDecStmt | Assignment | ShortVarDecl .
//
// simple_stmt may return missing_stmt if labelOk is set.
func (p *parser) simple_stmt(labelOk, rangeOk bool) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("simple_stmt")()
@ -736,7 +755,8 @@ func (p *parser) simple_stmt(labelOk, rangeOk bool) *Node {
}
}
// may return missing_stmt
// LabeledStmt = Label ":" Statement .
// Label = identifier .
func (p *parser) labeled_stmt(label *Node) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("labeled_stmt")()
@ -761,7 +781,15 @@ func (p *parser) labeled_stmt(label *Node) *Node {
return liststmt(l)
}
// go.y:case
// case_ parses a superset of switch and select statement cases.
// Later checks restrict the syntax to valid forms.
//
// ExprSwitchCase = "case" ExpressionList | "default" .
// TypeSwitchCase = "case" TypeList | "default" .
// TypeList = Type { "," Type } .
// CommCase = "case" ( SendStmt | RecvStmt ) | "default" .
// RecvStmt = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .
// RecvExpr = Expression .
func (p *parser) case_(tswitch *Node) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("case_")()
@ -872,7 +900,8 @@ func (p *parser) case_(tswitch *Node) *Node {
}
}
// go.y:compound_stmt
// Block = "{" StatementList "}" .
// StatementList = { Statement ";" } .
func (p *parser) compound_stmt(else_clause bool) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("compound_stmt")()
@ -902,7 +931,11 @@ func (p *parser) compound_stmt(else_clause bool) *Node {
return stmt
}
// go.y:caseblock
// caseblock parses a superset of switch and select clauses.
//
// ExprCaseClause = ExprSwitchCase ":" StatementList .
// TypeCaseClause = TypeSwitchCase ":" StatementList .
// CommClause = CommCase ":" StatementList .
func (p *parser) caseblock(tswitch *Node) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("caseblock")()
@ -917,7 +950,7 @@ func (p *parser) caseblock(tswitch *Node) *Node {
return stmt
}
// go.y:caseblock_list
// caseblock_list parses a superset of switch and select clause lists.
func (p *parser) caseblock_list(tswitch *Node) (l *NodeList) {
if trace && Debug['x'] != 0 {
defer p.trace("caseblock_list")()
@ -935,7 +968,7 @@ func (p *parser) caseblock_list(tswitch *Node) (l *NodeList) {
return
}
// go.y:loop_body
// loop_body parses if and for statement bodies.
func (p *parser) loop_body(context string) *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("loop_body")()
@ -954,7 +987,10 @@ func (p *parser) loop_body(context string) *NodeList {
return body
}
// go.y:for_header
// for_header parses the header portion of a for statement.
//
// ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
// Condition = Expression .
func (p *parser) for_header() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("for_header")()
@ -987,7 +1023,6 @@ func (p *parser) for_header() *Node {
return h
}
// go.y:for_body
func (p *parser) for_body() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("for_body")()
@ -1000,7 +1035,7 @@ func (p *parser) for_body() *Node {
return stmt
}
// go.y:for_stmt
// ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
func (p *parser) for_stmt() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("for_stmt")()
@ -1014,6 +1049,12 @@ func (p *parser) for_stmt() *Node {
return body
}
// header parses a combination of if, switch, and for statement headers:
//
// Header = [ InitStmt ";" ] [ Expression ] .
// Header = [ InitStmt ] ";" [ Condition ] ";" [ PostStmt ] . // for_stmt only
// InitStmt = SimpleStmt .
// PostStmt = SimpleStmt .
func (p *parser) header(for_stmt bool) (init, cond, post *Node) {
if p.tok == '{' {
return
@ -1060,7 +1101,6 @@ func (p *parser) header(for_stmt bool) (init, cond, post *Node) {
return
}
// go.y:if_header
func (p *parser) if_header() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("if_header")()
@ -1073,7 +1113,7 @@ func (p *parser) if_header() *Node {
return h
}
// go.y:if_stmt
// IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] .
func (p *parser) if_stmt() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("if_stmt")()
@ -1105,7 +1145,6 @@ func (p *parser) if_stmt() *Node {
return stmt
}
// go.y:elsif
func (p *parser) elseif() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("elseif")()
@ -1124,8 +1163,6 @@ func (p *parser) elseif() *NodeList {
return list1(stmt)
}
// go.y:elsif_list
// go.y:else
func (p *parser) elseif_list_else() (l *NodeList) {
if trace && Debug['x'] != 0 {
defer p.trace("elseif_list_else")()
@ -1143,7 +1180,6 @@ func (p *parser) elseif_list_else() (l *NodeList) {
return l
}
// go.y:else
func (p *parser) else_() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("else")()
@ -1155,7 +1191,11 @@ func (p *parser) else_() *NodeList {
}
// go.y:switch_stmt
// switch_stmt parses both expression and type switch statements.
//
// SwitchStmt = ExprSwitchStmt | TypeSwitchStmt .
// ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .
// TypeSwitchStmt = "switch" [ SimpleStmt ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" .
func (p *parser) switch_stmt() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("switch_stmt")()
@ -1178,7 +1218,7 @@ func (p *parser) switch_stmt() *Node {
return hdr
}
// go.y:select_stmt
// SelectStmt = "select" "{" { CommClause } "}" .
func (p *parser) select_stmt() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("select_stmt")()
@ -1225,6 +1265,7 @@ var prectab = map[int32]struct {
LANDNOT: {6, OANDNOT},
}
// Expression = UnaryExpr | Expression binary_op Expression .
func (p *parser) bexpr(prec int) *Node {
// don't trace bexpr - only leads to overly nested trace output
@ -1242,7 +1283,6 @@ func (p *parser) bexpr(prec int) *Node {
return x
}
// go.y:expr
func (p *parser) expr() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("expr")()
@ -1258,7 +1298,7 @@ func unparen(x *Node) *Node {
return x
}
// go.y:uexpr
// UnaryExpr = PrimaryExpr | unary_op UnaryExpr .
func (p *parser) uexpr() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("uexpr")()
@ -1358,9 +1398,7 @@ func (p *parser) uexpr() *Node {
return Nod(op, p.uexpr(), nil)
}
// call-like statements that can be preceded by 'defer' and 'go'
//
// go.y:pseudocall
// pseudocall parses call-like statements that can be preceded by 'defer' and 'go'.
func (p *parser) pseudocall() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("pseudocall")()
@ -1380,7 +1418,10 @@ func (p *parser) pseudocall() *Node {
return nil
}
// go.y:pexpr (partial)
// Operand = Literal | OperandName | MethodExpr | "(" Expression ")" .
// Literal = BasicLit | CompositeLit | FunctionLit .
// BasicLit = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .
// OperandName = identifier | QualifiedIdent.
func (p *parser) operand(keep_parens bool) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("operand")()
@ -1466,7 +1507,22 @@ func (p *parser) operand(keep_parens bool) *Node {
// as well (operand is only called from pexpr).
}
// go.y:pexpr, pexpr_no_paren
// PrimaryExpr =
// Operand |
// Conversion |
// PrimaryExpr Selector |
// PrimaryExpr Index |
// PrimaryExpr Slice |
// PrimaryExpr TypeAssertion |
// PrimaryExpr Arguments .
//
// Selector = "." identifier .
// Index = "[" Expression "]" .
// Slice = "[" ( [ Expression ] ":" [ Expression ] ) |
// ( [ Expression ] ":" Expression ":" Expression )
// "]" .
// TypeAssertion = "." "(" Type ")" .
// Arguments = "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" .
func (p *parser) pexpr(keep_parens bool) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("pexpr")()
@ -1593,7 +1649,7 @@ loop:
return x
}
// go.y:keyval
// KeyedElement = [ Key ":" ] Element .
func (p *parser) keyval() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("keyval")()
@ -1626,7 +1682,7 @@ func wrapname(x *Node) *Node {
return x
}
// go.y:bare_complitexpr
// Element = Expression | LiteralValue .
func (p *parser) bare_complitexpr() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("bare_complitexpr")()
@ -1640,7 +1696,7 @@ func (p *parser) bare_complitexpr() *Node {
return p.expr()
}
// go.y:complitexpr
// LiteralValue = "{" [ ElementList [ "," ] ] "}" .
func (p *parser) complitexpr() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("complitexpr")()
@ -1670,8 +1726,6 @@ func (p *parser) complitexpr() *Node {
// names and types
// newname is used before declared
// oldname is used after declared
//
// go.y:new_name:
func (p *parser) new_name(sym *Sym) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("new_name")()
@ -1683,7 +1737,6 @@ func (p *parser) new_name(sym *Sym) *Node {
return nil
}
// go.y:onew_name:
func (p *parser) onew_name() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("onew_name")()
@ -1696,7 +1749,6 @@ func (p *parser) onew_name() *Node {
return nil
}
// go.y:sym
func (p *parser) sym() *Sym {
switch p.tok {
case LNAME:
@ -1730,7 +1782,6 @@ func mkname(sym *Sym) *Node {
return n
}
// go.y:name
func (p *parser) name() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("name")()
@ -1739,7 +1790,7 @@ func (p *parser) name() *Node {
return mkname(p.sym())
}
// go.y:dotdotdot
// [ "..." ] Type
func (p *parser) dotdotdot() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("dotdotdot")()
@ -1754,7 +1805,6 @@ func (p *parser) dotdotdot() *Node {
return Nod(ODDD, typenod(typ(TINTER)), nil)
}
// go.y:ntype
func (p *parser) ntype() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("ntype")()
@ -1771,6 +1821,11 @@ func (p *parser) ntype() *Node {
// try_ntype is like ntype but it returns nil if there was no type
// instead of reporting an error.
//
// Type = TypeName | TypeLit | "(" Type ")" .
// TypeName = identifier | QualifiedIdent .
// TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
// SliceType | MapType | ChannelType .
func (p *parser) try_ntype() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("try_ntype")()
@ -1873,7 +1928,6 @@ func (p *parser) chan_elem() *Node {
return nil
}
// go.y:dotname (partial)
func (p *parser) new_dotname(pkg *Node) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("new_dotname")()
@ -1889,7 +1943,6 @@ func (p *parser) new_dotname(pkg *Node) *Node {
}
// go.y:dotname
func (p *parser) dotname() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("dotname")()
@ -1902,7 +1955,7 @@ func (p *parser) dotname() *Node {
return name
}
// go.y:structtype
// StructType = "struct" "{" { FieldDecl ";" } "}" .
func (p *parser) structtype() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("structtype")()
@ -1924,7 +1977,7 @@ func (p *parser) structtype() *Node {
return t
}
// go.y:interfacetype
// InterfaceType = "interface" "{" { MethodSpec ";" } "}" .
func (p *parser) interfacetype() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("interfacetype")()
@ -1948,8 +2001,7 @@ func (p *parser) interfacetype() *Node {
// Function stuff.
// All in one place to show how crappy it all is.
//
// go.y:xfndcl
func (p *parser) xfndcl() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("xfndcl")()
@ -1980,7 +2032,11 @@ func (p *parser) xfndcl() *Node {
return f
}
// go.y:fndcl
// FunctionDecl = "func" FunctionName ( Function | Signature ) .
// FunctionName = identifier .
// Function = Signature FunctionBody .
// MethodDecl = "func" Receiver MethodName ( Function | Signature ) .
// Receiver = Parameters .
func (p *parser) fndcl() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("fndcl")()
@ -2069,7 +2125,6 @@ func (p *parser) fndcl() *Node {
}
}
// go.y:hidden_fndcl
func (p *parser) hidden_fndcl() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_fndcl")()
@ -2131,7 +2186,7 @@ func (p *parser) hidden_fndcl() *Node {
}
}
// go.y:fnbody
// FunctionBody = Block .
func (p *parser) fnbody() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("fnbody")()
@ -2151,7 +2206,7 @@ func (p *parser) fnbody() *NodeList {
return nil
}
// go.y:fnres
// Result = Parameters | Type .
func (p *parser) fnres() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("fnres")()
@ -2169,7 +2224,8 @@ func (p *parser) fnres() *NodeList {
return nil
}
// go.y:xdcl_list
// Declaration = ConstDecl | TypeDecl | VarDecl .
// TopLevelDecl = Declaration | FunctionDecl | MethodDecl .
func (p *parser) xdcl_list() (l *NodeList) {
if trace && Debug['x'] != 0 {
defer p.trace("xdcl_list")()
@ -2220,7 +2276,9 @@ loop:
return
}
// go.y:structdcl
// FieldDecl = (IdentifierList Type | AnonymousField) [ Tag ] .
// AnonymousField = [ "*" ] TypeName .
// Tag = string_lit .
func (p *parser) structdcl() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("structdcl")()
@ -2332,7 +2390,6 @@ func (p *parser) structdcl() *NodeList {
}
}
// go.y:oliteral
func (p *parser) oliteral() (v Val) {
if p.tok == LLITERAL {
v = p.val
@ -2341,7 +2398,6 @@ func (p *parser) oliteral() (v Val) {
return
}
// go.y:packname
func (p *parser) packname(name *Sym) *Sym {
if trace && Debug['x'] != 0 {
defer p.trace("embed")()
@ -2380,7 +2436,6 @@ func (p *parser) packname(name *Sym) *Sym {
return name
}
// go.y:embed
func (p *parser) embed(sym *Sym) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("embed")()
@ -2390,7 +2445,9 @@ func (p *parser) embed(sym *Sym) *Node {
return embedded(pkgname, localpkg)
}
// go.y: interfacedcl
// MethodSpec = MethodName Signature | InterfaceTypeName .
// MethodName = identifier .
// InterfaceTypeName = TypeName .
func (p *parser) interfacedcl() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("interfacedcl")()
@ -2441,7 +2498,8 @@ func (p *parser) interfacedcl() *Node {
}
}
// go.y:indcl
// MethodSpec = MethodName Signature .
// MethodName = identifier .
func (p *parser) indcl() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("indcl")()
@ -2459,7 +2517,7 @@ func (p *parser) indcl() *Node {
return t
}
// go.y:arg_type
// ParameterDecl = [ IdentifierList ] [ "..." ] Type .
func (p *parser) arg_type() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("arg_type")()
@ -2508,7 +2566,8 @@ func (p *parser) arg_type() *Node {
}
}
// go.y:oarg_type_list_ocomma + surrounding ()'s
// Parameters = "(" [ ParameterList [ "," ] ] ")" .
// ParameterList = ParameterDecl { "," ParameterDecl } .
func (p *parser) param_list() (l *NodeList) {
if trace && Debug['x'] != 0 {
defer p.trace("param_list")()
@ -2529,8 +2588,13 @@ func (p *parser) param_list() (l *NodeList) {
var missing_stmt = Nod(OXXX, nil, nil)
// go.y:stmt
// maty return missing_stmt
// Statement =
// Declaration | LabeledStmt | SimpleStmt |
// GoStmt | ReturnStmt | BreakStmt | ContinueStmt | GotoStmt |
// FallthroughStmt | Block | IfStmt | SwitchStmt | SelectStmt | ForStmt |
// DeferStmt .
//
// stmt may return missing_stmt.
func (p *parser) stmt() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("stmt")()
@ -2622,7 +2686,7 @@ func (p *parser) stmt() *Node {
}
}
// go.y:stmt_list
// StatementList = { Statement ";" } .
func (p *parser) stmt_list() (l *NodeList) {
if trace && Debug['x'] != 0 {
defer p.trace("stmt_list")()
@ -2647,8 +2711,9 @@ func (p *parser) stmt_list() (l *NodeList) {
return
}
// go.y:new_name_list
// if first != nil we have the first symbol already
// IdentifierList = identifier { "," identifier } .
//
// If first != nil we have the first symbol already.
func (p *parser) new_name_list(first *Sym) *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("new_name_list")()
@ -2664,7 +2729,7 @@ func (p *parser) new_name_list(first *Sym) *NodeList {
return l
}
// go.y:dcl_name_list
// IdentifierList = identifier { "," identifier } .
func (p *parser) dcl_name_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("dcl_name_list")()
@ -2677,7 +2742,7 @@ func (p *parser) dcl_name_list() *NodeList {
return l
}
// go.y:expr_list
// ExpressionList = Expression { "," Expression } .
func (p *parser) expr_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("expr_list")()
@ -2690,7 +2755,7 @@ func (p *parser) expr_list() *NodeList {
return l
}
// go.y:expr_or_type_list
// Arguments = "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" .
func (p *parser) arg_list() (l *NodeList, ddd bool) {
if trace && Debug['x'] != 0 {
defer p.trace("arg_list")()
@ -2713,7 +2778,7 @@ func (p *parser) arg_list() (l *NodeList, ddd bool) {
return
}
// go.y:osemi
// osemi parses an optional semicolon.
func (p *parser) osemi(follow int32) bool {
switch p.tok {
case ';':
@ -2730,7 +2795,7 @@ func (p *parser) osemi(follow int32) bool {
return false
}
// go.y:ocomma
// ocomma parses an optional comma.
func (p *parser) ocomma(follow int32) bool {
switch p.tok {
case ',':
@ -2755,12 +2820,11 @@ func (p *parser) import_error() {
p.next()
}
// The methods below reflect a 1:1 translation of the corresponding go.y yacc
// productions They could be simplified significantly and also use better
// The methods below reflect a 1:1 translation of the original (and now defunct)
// go.y yacc productions. They could be simplified significantly and also use better
// variable names. However, we will be able to delete them once we enable the
// new export format by default, so it's not worth the effort.
// new export format by default, so it's not worth the effort (issue 13241).
// go.y:hidden_importsym:
func (p *parser) hidden_importsym() *Sym {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_importsym")()
@ -2814,7 +2878,6 @@ func (p *parser) hidden_importsym() *Sym {
}
}
// go.y:ohidden_funarg_list
func (p *parser) ohidden_funarg_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("ohidden_funarg_list")()
@ -2827,7 +2890,6 @@ func (p *parser) ohidden_funarg_list() *NodeList {
return ss
}
// go.y:ohidden_structdcl_list
func (p *parser) ohidden_structdcl_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("ohidden_structdcl_list")()
@ -2840,7 +2902,6 @@ func (p *parser) ohidden_structdcl_list() *NodeList {
return ss
}
// go.y:ohidden_interfacedcl_list
func (p *parser) ohidden_interfacedcl_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("ohidden_interfacedcl_list")()
@ -2854,8 +2915,6 @@ func (p *parser) ohidden_interfacedcl_list() *NodeList {
}
// import syntax from package header
//
// go.y:hidden_import
func (p *parser) hidden_import() {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_import")()
@ -2945,7 +3004,6 @@ func (p *parser) hidden_import() {
}
}
// go.y:hidden_pkg_importsym
func (p *parser) hidden_pkg_importsym() *Sym {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_pkg_importsym")()
@ -2959,7 +3017,6 @@ func (p *parser) hidden_pkg_importsym() *Sym {
return ss
}
// go.y:hidden_pkgtype
func (p *parser) hidden_pkgtype() *Type {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_pkgtype")()
@ -2976,7 +3033,6 @@ func (p *parser) hidden_pkgtype() *Type {
// ----------------------------------------------------------------------------
// Importing types
// go.y:hidden_type
func (p *parser) hidden_type() *Type {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_type")()
@ -2992,7 +3048,6 @@ func (p *parser) hidden_type() *Type {
}
}
// go.y:hidden_type_non_recv_chan
func (p *parser) hidden_type_non_recv_chan() *Type {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_type_non_recv_chan")()
@ -3006,7 +3061,6 @@ func (p *parser) hidden_type_non_recv_chan() *Type {
}
}
// go.y:hidden_type_misc
func (p *parser) hidden_type_misc() *Type {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_type_misc")()
@ -3117,7 +3171,6 @@ func (p *parser) hidden_type_misc() *Type {
}
}
// go.y:hidden_type_recv_chan
func (p *parser) hidden_type_recv_chan() *Type {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_type_recv_chan")()
@ -3133,7 +3186,6 @@ func (p *parser) hidden_type_recv_chan() *Type {
return ss
}
// go.y:hidden_type_func
func (p *parser) hidden_type_func() *Type {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_type_func")()
@ -3148,7 +3200,6 @@ func (p *parser) hidden_type_func() *Type {
return functype(nil, s3, s5)
}
// go.y:hidden_funarg
func (p *parser) hidden_funarg() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_funarg")()
@ -3189,7 +3240,6 @@ func (p *parser) hidden_funarg() *Node {
}
}
// go.y:hidden_structdcl
func (p *parser) hidden_structdcl() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_structdcl")()
@ -3223,7 +3273,6 @@ func (p *parser) hidden_structdcl() *Node {
return ss
}
// go.y:hidden_interfacedcl
func (p *parser) hidden_interfacedcl() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_interfacedcl")()
@ -3249,7 +3298,6 @@ func (p *parser) hidden_interfacedcl() *Node {
}
}
// go.y:ohidden_funres
func (p *parser) ohidden_funres() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("ohidden_funres")()
@ -3264,7 +3312,6 @@ func (p *parser) ohidden_funres() *NodeList {
}
}
// go.y:hidden_funres
func (p *parser) hidden_funres() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_funres")()
@ -3286,7 +3333,6 @@ func (p *parser) hidden_funres() *NodeList {
// ----------------------------------------------------------------------------
// Importing constants
// go.y:hidden_literal
func (p *parser) hidden_literal() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_literal")()
@ -3337,7 +3383,6 @@ func (p *parser) hidden_literal() *Node {
}
}
// go.y:hidden_constant
func (p *parser) hidden_constant() *Node {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_constant")()
@ -3364,7 +3409,6 @@ func (p *parser) hidden_constant() *Node {
}
}
// go.y:hidden_import_list
func (p *parser) hidden_import_list() {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_import_list")()
@ -3375,7 +3419,6 @@ func (p *parser) hidden_import_list() {
}
}
// go.y:hidden_funarg_list
func (p *parser) hidden_funarg_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_funarg_list")()
@ -3390,7 +3433,6 @@ func (p *parser) hidden_funarg_list() *NodeList {
return ss
}
// go.y:hidden_structdcl_list
func (p *parser) hidden_structdcl_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_structdcl_list")()
@ -3405,7 +3447,6 @@ func (p *parser) hidden_structdcl_list() *NodeList {
return ss
}
// go.y:hidden_interfacedcl_list
func (p *parser) hidden_interfacedcl_list() *NodeList {
if trace && Debug['x'] != 0 {
defer p.trace("hidden_interfacedcl_list")()