-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathpython-semantics-assignment.k
More file actions
41 lines (32 loc) · 2.41 KB
/
Copy pathpython-semantics-assignment.k
File metadata and controls
41 lines (32 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
require "python-semantics-common.k"
module PYTHON-SEMANTICS-ASSIGNMENT
imports PYTHON-SEMANTICS-COMMON
syntax K ::= "bindList" "(" List "," Object "," Bool ")"
| "unbindList" "(" List ")"
rule (. => bind(X:Id, ref(B:ObjId))) ~> ((X)::Target = Ts:AssignTargets => Ts) = obj(B,_)
rule (. => bindList(Listify(Ts2), O, false)) ~> (tuple(Ts2:Targets) = Ts:AssignTargets => Ts) = O:Object
rule (. => bindList(Listify(Ts2), O, false)) ~> ([ Ts2 ] = Ts:AssignTargets => Ts) = O
rule (. => ref("setattr")(O, Id2String(X), O2) ;) ~> (O:Object . X:Id = Ts:AssignTargets => Ts) = O2:Object
rule (. => (getmember(O, "__setitem__", true, false, false) -> raiseInternal("TypeError", "object does not support item assignment")) (Key:Object, Value:Object) ;) ~> (O:Object [ Key:Object ] = Ts:AssignTargets => Ts) = Value
rule .AssignTargets = _ => .
context HOLE . _:Id = _ = K:Exp when isKResult(K)
context HOLE [ _ ] = _ = K:Exp when isKResult(K)
context K [ HOLE ] = _ = K2:Exp when isKResult(K) andBool isKResult(K2)
rule (. => unbind(X:Id)) ~> del (X , Ts:NeTargets => Ts)
rule (. => unbindList(Listify(Ts2))) ~> del (tuple(Ts2) , Ts => Ts)
rule (. => unbindList(Listify(Ts2))) ~> del ([ Ts2 ] , Ts => Ts)
rule (. => (getmember(O, "__delattr__", true, false, true) (Id2String(X)) ;)) ~> del (O:Object . X:Id , Ts => Ts)
rule (. => (getmember(O, "__delitem__", true, false, false) -> raiseInternal("TypeError", "object does not support item deletion")) (Key) ;) ~> del (O:Object [ Key:Object ] , Ts => Ts)
rule del .NeTargets => .
context del HOLE . _:Id , _
context del HOLE [ _ ] , _
context del K [ HOLE ] , _ when isKResult(K)
rule (. => iterate(O, .)) ~> bindList(_, O, _)
rule (. => T = O:Object) ~> list((ListItem(O) => .) _) ~> bindList((ListItem(T:Target) => .) _, _, _) when getKLabel T =/=KLabel 'Starred
rule (. => T:Target = mutable(list(Refify(Idify(L))), ref("list"))) ~> list((L:List => .) L2:List) ~> bindList((ListItem(* T) => .) L3:List, _, (false => true)) when lengthList L2 ==Int lengthList L3
rule list(.) ~> bindList(., _, _) => .
rule list(ListItem(_) _) ~> bindList(., _, _) => raiseInternal("ValueError", "too many values to unpack")
rule list(.) ~> bindList(ListItem(T) _, _, _) => raiseInternal("ValueError", "need more values to unpack") when getKLabel T =/=KLabel 'Starred
rule (. => del (T ::Target)) ~> unbindList((ListItem(T) => .) _)
rule unbindList(.) => .
endmodule