Skip to content

Commit 8ed83d0

Browse files
committed
Class definition
1 parent 6ae1b00 commit 8ed83d0

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

parser/grammar.y

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ func setCtx(exprs []ast.Expr, ctx ast.ExprContext) {
8686
%type <stmts> simple_stmt stmt nl_or_stmt small_stmts stmts suite optional_else
8787
%type <stmt> compound_stmt small_stmt expr_stmt del_stmt pass_stmt flow_stmt import_stmt global_stmt nonlocal_stmt assert_stmt break_stmt continue_stmt return_stmt raise_stmt yield_stmt import_name import_from while_stmt if_stmt for_stmt try_stmt with_stmt funcdef classdef classdef_or_funcdef decorated
8888
%type <op> augassign
89-
%type <expr> expr_or_star_expr expr star_expr xor_expr and_expr shift_expr arith_expr term factor power trailer atom test_or_star_expr test not_test lambdef test_nocond lambdef_nocond or_test and_test comparison testlist testlist_star_expr yield_expr_or_testlist yield_expr yield_expr_or_testlist_star_expr dictorsetmaker sliceop arglist except_clause optional_return_type decorator
89+
%type <expr> expr_or_star_expr expr star_expr xor_expr and_expr shift_expr arith_expr term factor power trailer atom test_or_star_expr test not_test lambdef test_nocond lambdef_nocond or_test and_test comparison testlist testlist_star_expr yield_expr_or_testlist yield_expr yield_expr_or_testlist_star_expr dictorsetmaker sliceop except_clause optional_return_type decorator
9090
%type <exprs> exprlist testlistraw comp_if comp_iter expr_or_star_exprs test_or_star_exprs tests test_colon_tests trailers equals_yield_expr_or_testlist_star_expr decorators
9191
%type <cmpop> comp_op
9292
%type <comma> optional_comma
9393
%type <comprehensions> comp_for
9494
%type <slice> subscript subscriptlist subscripts
95-
%type <call> argument arguments optional_arguments arguments2
95+
%type <call> argument arguments optional_arguments arguments2 arglist optional_arglist_call optional_arglist
9696
%type <level> dot dots
9797
%type <str> dotted_name from_arg
9898
%type <identifiers> names
@@ -260,20 +260,20 @@ nls:
260260

261261
optional_arglist:
262262
{
263-
// FIXME
263+
$$ = nil
264264
}
265265
| arglist
266266
{
267-
// FIXME
267+
$$ = $1
268268
}
269269

270270
optional_arglist_call:
271271
{
272-
// FIXME
272+
$$ = nil
273273
}
274274
| '(' optional_arglist ')'
275275
{
276-
// FIXME
276+
$$ = $2
277277
}
278278

279279
decorator:
@@ -1763,8 +1763,15 @@ dictorsetmaker:
17631763
classdef:
17641764
CLASS NAME optional_arglist_call ':' suite
17651765
{
1766-
// FIXME
1767-
// $$ = &ast.ClassDef{StmtBase: ast.StmtBase{$<pos>$}, Name: ast.Identifier($2), Args: $3, Body: $5}
1766+
classDef := &ast.ClassDef{StmtBase: ast.StmtBase{$<pos>$}, Name: ast.Identifier($2), Body: $5}
1767+
$$ = classDef
1768+
args := $3
1769+
if args != nil {
1770+
classDef.Bases = args.Args
1771+
classDef.Keywords = args.Keywords
1772+
classDef.Starargs = args.Starargs
1773+
classDef.Kwargs = args.Kwargs
1774+
}
17681775
}
17691776

17701777
arguments:

parser/grammar_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,12 @@ func TestGrammar(t *testing.T) {
261261
{"def fn(*args, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"},
262262
{"def fn(*args, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"},
263263
{"def fn(**kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"},
264+
{"class A: pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
265+
{"class A(): pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
266+
{"class A(B): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
267+
{"class A(B,C): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
268+
{"class A(B,C,D=F): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
269+
{"class A(B,C,D=F,*AS,**KWS): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=Name(id='AS', ctx=Load()), kwargs=Name(id='KWS', ctx=Load()), body=[Pass()], decorator_list=[])])"},
264270
// END TESTS
265271
} {
266272
Ast, err := ParseString(test.in, test.mode)

parser/make_grammar_test.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,16 @@
366366
("def fn(*args, c=d): pass", "exec"),
367367
("def fn(*args, c=d, **kws): pass", "exec"),
368368
("def fn(**kws): pass", "exec"),
369+
370+
# class
371+
("class A: pass", "exec"),
372+
("class A(): pass", "exec"),
373+
("class A(B): pass", "exec"),
374+
("class A(B,C): pass", "exec"),
375+
("class A(B,C,D=F): pass", "exec"),
376+
("class A(B,C,D=F,*AS,**KWS): pass", "exec"),
377+
378+
# decorators
369379
]
370380

371381
def dump(source, mode):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy