def rune_lit(): return _, [r(r"r'(\\[^\n]|[^\\\"\n])*'"), r('r"(\\[^\n]|[^\\\'\n])*"')] def string_lit(): return _, [single_string, double_string, raw_string]
def GotoStmt(): return _, r(r'\bgoto\b'), ident def FallStmt(): return _, r(r'\bfallthrough\b')
def IfStmt(): return _, r(r'\bif\b'), Optional(SimpleStmt, _, ';'), Expression, Block, ZeroOrMore(_, r(r'\belse\b'), _, r(r'\bif\b'), Expression, Block), Optional(_, r(r'\belse\b'), Block) def SwitchStmt(): return _, r(r'\bswitch\b'), Optional(SimpleStmt, _, ';'), [ExprSwitchStmt, TypeSwitchStmt]
def GoStmt(): return _, r(r'\bgo\b'), Expression def ReturnStmt(): return _, r(r'\breturn\b'), Optional(ExpressionList)
def BreakStmt(): return _, r(r'\bbreak\b'), Optional(ident) def ContinueStmt(): return _, r(r'\bcontinue\b'), Optional(ident)
def ChannelType(): return _, r('<-?'), Type, _, r('-?>') def FunctionLit(): return _, r(r'\bfunc\b'), Function
def TypeAssertion(): return _, r(r'\bas\b'), Type # statements def Block(): return _, '{', Optional(StatementList), _, '}'
def ImportDecl(): return _, r(r'\bimport\b'), ImportSpec, ZeroOrMore(_, ',', ImportSpec), Optional(_, ',') def ImportSpec(): return _, r(import_re), Optional(_, r(r'\bas\b'), ident)
def ImportSpec(): return _, r(import_re), Optional(_, r(r'\bas\b'), ident) def TopLevelDecls(): return TopLevelDecl, ZeroOrMore(nl, TopLevelDecl), Optional(nl)
def NotKeyword(): return _, Not(r(r'\b(as|break|case|const|continue|default|defer|else|fallthrough|for|while|func|go|goto|if|import|interface|return|select|struct|switch|type|var)\b')) def nl(): return r(r'[ \t\r]*[\n;]')
def nl(): return r(r'[ \t\r]*[\n;]') def _(): return r(r'[ \t\r\n]*')
def raw_string(): return r("`[^`]*`") def ident(): return NotKeyword, r(id_re)
def double_string(): return r(r'\$?"(\\[^\n]|[^\\\'\n])*"') def raw_string(): return r("`[^`]*`")
def single_string(): return r(r"\$?'(\\[^\n]|[^\\\"\n])*'") def double_string(): return r(r'\$?"(\\[^\n]|[^\\\'\n])*"')
def FunctionType(): return _, r(r'\bfunc\b'), Signature def Signature(): return _, '(', ParameterList, _, ')', Optional(Result)
def ConstDecl(): return _, r(r'\bconst\b'), IdentifierList, _, '=', ExpressionList def IdentifierList(): return ident, ZeroOrMore(_, ',', ident), Optional(_, ',')
def InterfaceType(): return _, r(r'\binterface\b'), InterfaceBody def InterfaceBody(): return _, '{', Optional(MethodSpec, ZeroOrMore(nl, MethodSpec), Optional(nl)), _, '}'
def TypeDecl(): return _, r(r'\btype\b'), TypeSpec, ZeroOrMore(_, ',', TypeSpec), Optional(_, ',') def TypeSpec(): return Type, ident
def FunctionLit(): return _, r(r'\bfunc\b'), Function def Function(): return _, Signature, Block
def FunctionDecl(): return _, r(r'\bfunc\b'), ident, [Function, Signature] def MethodDecl(): return _, r(r'\bfunc\b'), Receiver, ident, [Function, Signature]
def ShortVarDecl(): return _, r(r'\bvar\b'), IdentifierList, _, '=', ExpressionList def GoStmt(): return _, r(r'\bgo\b'), Expression
def MethodDecl(): return _, r(r'\bfunc\b'), Receiver, ident, [Function, Signature] def Receiver(): return _, '(', Type, Optional(ident), _, ')'
def ReturnStmt(): return _, r(r'\breturn\b'), Optional(ExpressionList) def BreakStmt(): return _, r(r'\bbreak\b'), Optional(ident)
def StructDecl(): return _, r(r'\bstruct\b'), ident, StructBody def InterfaceDecl(): return _, r(r'\binterface\b'), ident, InterfaceBody
def ContinueStmt(): return _, r(r'\bcontinue\b'), Optional(ident) def GotoStmt(): return _, r(r'\bgoto\b'), ident
def InterfaceDecl(): return _, r(r'\binterface\b'), ident, InterfaceBody # expressions def Expression(): return Optional(unary_op), SubExpr, ZeroOrMore(TailExpr)
def FallStmt(): return _, r(r'\bfallthrough\b') def IfStmt(): return _, r(r'\bif\b'), Optional(SimpleStmt, _, ';'), Expression, Block, ZeroOrMore(_, r(r'\belse\b'), _, r(r'\bif\b'), Expression, Block), Optional(_, r(r'\belse\b'), Block)
def StructType(): return _, r(r'\bstruct\b'), StructBody def StructBody(): return _, '{', Optional(FieldDecl, ZeroOrMore(nl, FieldDecl), Optional(nl)), _, '}'
def SwitchStmt(): return _, r(r'\bswitch\b'), Optional(SimpleStmt, _, ';'), [ExprSwitchStmt, TypeSwitchStmt] def ExprSwitchStmt(): return Optional(Expression), _, '{', ZeroOrMore(ExprCaseClause), _, '}'
def imaginary_lit(): return _, [float_lit, r('[0-9]+')], 'i' def rune_lit(): return _, [r(r"r'(\\[^\n]|[^\\\"\n])*'"), r('r"(\\[^\n]|[^\\\'\n])*"')]