From ba042007a9f6b116906960310467f9e2c471b80c Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Tue, 10 Sep 2019 20:29:19 +0900 Subject: [PATCH 1/2] Generate SyntaxError of global declaration Generate SyntaxError instead of SyntaxWarning if global declaration is for priviously used variable Fixes #72 --- symtable/symtable.go | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/symtable/symtable.go b/symtable/symtable.go index daf846be..1513f698 100644 --- a/symtable/symtable.go +++ b/symtable/symtable.go @@ -17,7 +17,6 @@ package symtable import ( "fmt" - "log" "sort" "strings" @@ -229,13 +228,10 @@ func (st *SymTable) Parse(Ast ast.Ast) { cur, ok := st.Symbols[string(name)] if ok { if (cur.Flags & DefLocal) != 0 { - // FIXME this should be a warning - log.Printf("name '%s' is assigned to before nonlocal declaration", name) - + st.panicSyntaxErrorf(node, "name '%s' is assigned to before nonlocal declaration", name) } if (cur.Flags & DefUse) != 0 { - // FIXME this should be a warning - log.Printf("name '%s' is used prior to nonlocal declaration", name) + st.panicSyntaxErrorf(node, "name '%s' is used prior to nonlocal declaration", name) } } st.AddDef(node, name, DefNonlocal) @@ -245,13 +241,11 @@ func (st *SymTable) Parse(Ast ast.Ast) { cur, ok := st.Symbols[string(name)] if ok { if (cur.Flags & DefLocal) != 0 { - // FIXME this should be a warning - log.Printf("name '%s' is assigned to before global declaration", name) + st.panicSyntaxErrorf(node, "name '%s' is assigned to before global declaration", name) } if (cur.Flags & DefUse) != 0 { - // FIXME this should be a warning - log.Printf("name '%s' is used prior to global declaration", name) + st.panicSyntaxErrorf(node, "name '%s' is used prior to global declaration", name) } } st.AddDef(node, name, DefGlobal) From 93a13f1437a55909ba2c1a7da47c907f87eebdfd Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Wed, 11 Sep 2019 22:55:51 +0900 Subject: [PATCH 2/2] Modify symtable test --- symtable/symtable_data_test.go | 260 +-------------------------------- 1 file changed, 5 insertions(+), 255 deletions(-) diff --git a/symtable/symtable_data_test.go b/symtable/symtable_data_test.go index a09e5d85..05ec1da6 100644 --- a/symtable/symtable_data_test.go +++ b/symtable/symtable_data_test.go @@ -514,7 +514,7 @@ var symtableTestData = []struct { Children: Children{}, }, }, - }, nil, ""}, + }, nil,""}, {"def fn(a):\n global b\n global b\n return b", "exec", &SymTable{ Type: ModuleBlock, Name: "top", @@ -568,112 +568,8 @@ var symtableTestData = []struct { }, }, }, nil, ""}, - {"def inner():\n print(x)\n global x\n", "exec", &SymTable{ - Type: ModuleBlock, - Name: "top", - Lineno: 0, - Unoptimized: optTopLevel, - Nested: false, - Free: false, - ChildFree: false, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "inner": Symbol{ - Flags: DefLocal, - Scope: ScopeLocal, - }, - "x": Symbol{ - Flags: DefGlobal, - Scope: ScopeGlobalExplicit, - }, - }, - Children: Children{ - &SymTable{ - Type: FunctionBlock, - Name: "inner", - Lineno: 1, - Unoptimized: 0, - Nested: false, - Free: false, - ChildFree: false, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "print": Symbol{ - Flags: DefUse, - Scope: ScopeGlobalImplicit, - }, - "x": Symbol{ - Flags: DefGlobal | DefUse, - Scope: ScopeGlobalExplicit, - }, - }, - Children: Children{}, - }, - }, - }, nil, ""}, - {"def fn(a):\n b = 6\n global b\n b = a", "exec", &SymTable{ - Type: ModuleBlock, - Name: "top", - Lineno: 0, - Unoptimized: optTopLevel, - Nested: false, - Free: false, - ChildFree: false, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "b": Symbol{ - Flags: DefGlobal, - Scope: ScopeGlobalExplicit, - }, - "fn": Symbol{ - Flags: DefLocal, - Scope: ScopeLocal, - }, - }, - Children: Children{ - &SymTable{ - Type: FunctionBlock, - Name: "fn", - Lineno: 1, - Unoptimized: 0, - Nested: false, - Free: false, - ChildFree: false, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{"a"}, - Symbols: Symbols{ - "a": Symbol{ - Flags: DefParam | DefUse, - Scope: ScopeLocal, - }, - "b": Symbol{ - Flags: DefGlobal | DefLocal, - Scope: ScopeGlobalExplicit, - }, - }, - Children: Children{}, - }, - }, - }, nil, ""}, + {"def inner():\n print(x)\n global x\n", "exec", nil, py.SyntaxError, "name 'x' is used prior to global declaration"}, + {"def fn(a):\n b = 6\n global b\n b = a", "exec", nil, py.SyntaxError, "name 'b' is assigned to before global declaration"}, {"def fn(a=b,c=1):\n return a+b", "exec", &SymTable{ Type: ModuleBlock, Name: "top", @@ -817,154 +713,8 @@ var symtableTestData = []struct { }, nil, ""}, {"def fn(a):\n nonlocal b\n ", "exec", nil, py.SyntaxError, "no binding for nonlocal 'b' found"}, {"def outer():\n def inner():\n nonlocal x\n x = 2", "exec", nil, py.SyntaxError, "no binding for nonlocal 'x' found"}, - {"def outer():\n x = 1\n def inner():\n print(x)\n nonlocal x\n", "exec", &SymTable{ - Type: ModuleBlock, - Name: "top", - Lineno: 0, - Unoptimized: optTopLevel, - Nested: false, - Free: false, - ChildFree: true, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "outer": Symbol{ - Flags: DefLocal, - Scope: ScopeLocal, - }, - }, - Children: Children{ - &SymTable{ - Type: FunctionBlock, - Name: "outer", - Lineno: 1, - Unoptimized: 0, - Nested: false, - Free: false, - ChildFree: true, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "inner": Symbol{ - Flags: DefLocal, - Scope: ScopeLocal, - }, - "x": Symbol{ - Flags: DefLocal, - Scope: ScopeCell, - }, - }, - Children: Children{ - &SymTable{ - Type: FunctionBlock, - Name: "inner", - Lineno: 3, - Unoptimized: 0, - Nested: true, - Free: true, - ChildFree: false, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "print": Symbol{ - Flags: DefUse, - Scope: ScopeGlobalImplicit, - }, - "x": Symbol{ - Flags: DefNonlocal | DefUse, - Scope: ScopeFree, - }, - }, - Children: Children{}, - }, - }, - }, - }, - }, nil, ""}, - {"def outer():\n x = 1\n def inner():\n x = 2\n nonlocal x", "exec", &SymTable{ - Type: ModuleBlock, - Name: "top", - Lineno: 0, - Unoptimized: optTopLevel, - Nested: false, - Free: false, - ChildFree: true, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "outer": Symbol{ - Flags: DefLocal, - Scope: ScopeLocal, - }, - }, - Children: Children{ - &SymTable{ - Type: FunctionBlock, - Name: "outer", - Lineno: 1, - Unoptimized: 0, - Nested: false, - Free: false, - ChildFree: true, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "inner": Symbol{ - Flags: DefLocal, - Scope: ScopeLocal, - }, - "x": Symbol{ - Flags: DefLocal, - Scope: ScopeCell, - }, - }, - Children: Children{ - &SymTable{ - Type: FunctionBlock, - Name: "inner", - Lineno: 3, - Unoptimized: 0, - Nested: true, - Free: true, - ChildFree: false, - Generator: false, - Varargs: false, - Varkeywords: false, - ReturnsValue: false, - NeedsClassClosure: false, - Varnames: []string{}, - Symbols: Symbols{ - "x": Symbol{ - Flags: DefLocal | DefNonlocal, - Scope: ScopeFree, - }, - }, - Children: Children{}, - }, - }, - }, - }, - }, nil, ""}, + {"def outer():\n x = 1\n def inner():\n print(x)\n nonlocal x\n", "exec", nil, py.SyntaxError, "name 'x' is used prior to nonlocal declaration"}, + {"def outer():\n x = 1\n def inner():\n x = 2\n nonlocal x", "exec", nil, py.SyntaxError, "name 'x' is assigned to before nonlocal declaration"}, {"def outer():\n x = 1\n def inner(x):\n nonlocal x", "exec", nil, py.SyntaxError, "name 'x' is parameter and nonlocal"}, {"def outer():\n x = 1\n def inner(x):\n global x", "exec", nil, py.SyntaxError, "name 'x' is parameter and global"}, {"def outer():\n def inner():\n global x\n nonlocal x\n ", "exec", nil, py.SyntaxError, "name 'x' is nonlocal and global"}, 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