diff options
| Commit | 39a4bd3d1b70e4d800487b79860f9113fb079f84 (patch) | |
|---|---|---|
| Author | 2023-12-05 12:09:14 +0200 | |
| Committer | 2023-12-05 12:09:14 +0200 | |
| Files | 8251e9818bb5ca7199ca4b4450afde6fbd29704a | |
| uni-projects-39a4bd3d1b70e4d800487b79860f9113fb079f84.tar uni-projects-39a4bd3d1b70e4d800487b79860f9113fb079f84.tar.gz uni-projects-39a4bd3d1b70e4d800487b79860f9113fb079f84.zip | ||
| Parent | a607349b22f8a201512582e6341fe020527baf62 (diff) | |
[CI/H5] Solved homework
1 files changed, 63 insertions, 0 deletions
| -rw-r--r-- | Year 3/Compilers, Introduction/Homework05.txt | 63 |
diff --git a/Year 3/Compilers, Introduction/Homework05.txt b/Year 3/Compilers, Introduction/Homework05.txt new file mode 100644 index 0000000..61efb38 --- /dev/null +++ b/Year 3/Compilers, Introduction/Homework05.txt @@ -0,0 +1,63 @@ +# 1 зад + +Foo < Bar < Baz < Object + + case 3 of + y: Int => y; + z: Bool => z; + esac; +lub(Int, Bool) = Object + + if 0 = 1 then new Bar else new Foo fi; +lib(Bar, Foo) = Bar +Връща Bar, понеже Foo < Bar + + let x: Bazz ← new Bar in x; +Bazz + +# 2 зад + +Статична видимост, следователно +foo(z) <-> 5 + z +bar(y) <-> 5 + y + +foo(bar(3)) <-> foo(8) <-> 13 + +# 3 зад + +x = 7 + \ foo(bar(3)) + | + x = 1, z = 2 + \ foo(3) + | + z = 3 + \ x + z <-> 1 + 3 <-> 4 + \ foo(4) + | + z = 4 + \ x + z <-> 7 + 4 <-> 11 + +# 4 зад + +21 bar(): (*MISSING*) { +22 case foo() of +23 f: Foo => f@Foo.foo(); +24 b: Bar => (new Bazz).foo(); +25 o: Object => foo(); +26 esac +27 }; +lub(f@Foo.foo(), (new Bazz).foo(), foo()) +f: Foo => SELF_TYPE = Foo, Foo.foo: Foo +Bazz.foo, SELF_TYPE = Bazz => Baz.foo: Bazz +(new Bar).foo => SELF_TYPE = Bar, foo: Bar + +Bazz < Bar < Foo < IO < Object +lub(Foo, Bazz, Bar) \in { Foo, IO, Object } => a., d., e. са верни + +# 5 зад + +main -> (new Bar).bar() -> case foo() of ... -> foo() -> print "Bar.foo()"; return new Bar; +case new Bar of + ... + b: Bar => (new Bazz).foo() -> pinrt "Bazz.foo()"; (new Bar)@Foo.foo(); -> Foo.foo() -> print "Foo.foo()"; foo() -> Bar.foo() -> print "Bar.foo()" |
