func (p *Parser) parseInterface() *ast.Interface { i := &ast.Interface{ Inherits: make([]string, 0), } p.expect(token.Identifier) i.Name = p.current.val if p.peek().typ == token.Extends { p.expect(token.Extends) for { p.expect(token.Identifier) i.Inherits = append(i.Inherits, p.current.val) if p.peek().typ != token.Comma { break } p.expect(token.Comma) } } p.expect(token.BlockBegin) for p.peek().typ != token.BlockEnd { vis, _ := p.parseVisibility() if p.peek().typ == token.Static { p.next() } p.next() switch p.current.typ { case token.Function: f := p.parseFunctionDefinition() m := ast.Method{ Visibility: vis, FunctionStmt: &ast.FunctionStmt{FunctionDefinition: f}, } i.Methods = append(i.Methods, m) p.expect(token.StatementEnd) case token.Const: constant := ast.Constant{} p.expect(token.Identifier) constant.Variable = ast.NewVariable(p.current.val) if p.peek().typ == token.AssignmentOperator { p.expect(token.AssignmentOperator) constant.Value = p.parseNextExpression() } i.Constants = append(i.Constants, constant) p.expect(token.StatementEnd) default: p.errorf("unexpected interface member %v", p.current) } } p.expect(token.BlockEnd) return i }
func (p *Parser) parseClassFields(c ast.Class) ast.Class { // Starting on BlockBegin c.Methods = make([]ast.Method, 0) c.Properties = make([]ast.Property, 0) for p.peek().typ != token.BlockEnd { vis, _, _, abstract := p.parseClassMemberSettings() p.next() switch p.current.typ { case token.Function: if abstract { f := p.parseFunctionDefinition() m := ast.Method{ Visibility: vis, FunctionStmt: &ast.FunctionStmt{FunctionDefinition: f}, } c.Methods = append(c.Methods, m) p.expect(token.StatementEnd) } else { c.Methods = append(c.Methods, ast.Method{ Visibility: vis, FunctionStmt: p.parseFunctionStmt(), }) } case token.Var: p.expect(token.VariableOperator) fallthrough case token.VariableOperator: for { p.expect(token.Identifier) prop := ast.Property{ Visibility: vis, Name: "$" + p.current.val, } if p.peek().typ == token.AssignmentOperator { p.expect(token.AssignmentOperator) prop.Initialization = p.parseNextExpression() } c.Properties = append(c.Properties, prop) if p.accept(token.StatementEnd) { break } p.expect(token.Comma) p.expect(token.VariableOperator) } case token.Const: constant := ast.Constant{} p.expect(token.Identifier) constant.Variable = ast.NewVariable(p.current.val) if p.peek().typ == token.AssignmentOperator { p.expect(token.AssignmentOperator) constant.Value = p.parseNextExpression() } c.Constants = append(c.Constants, constant) p.expect(token.StatementEnd) default: p.errorf("unexpected class member %v", p.current) return c } } p.expect(token.BlockEnd) return c }