최재승
가입: 2012년 9월 10일 올린 글: 211
|
올려짐: 2015년10월6일 22:50 주제: 숙제 3 공지 및 스펙 보충 (듀 변경 및 뼈대코드 보강) : 10/11 마지막 업데이트 |
|
|
안녕하세요,
숙제 3가 올라왔음을 알려드립니다.
내용 : http://ropas.snu.ac.kr/~kwang/4190.310/15/hw3.pdf
제출 : http://ropas.snu.ac.kr/~ta/4190.310/15/submit/index.pl
기한 : 10/14 밤 12시 --> 10/17 밤 12시로 변경되었습니다
* K- 언어 문법 및 의미구조
http://ropas.snu.ac.kr/~ta/4190.310/15/document/K_doc/k-.pdf
* 뼈대코드
- http://ropas.snu.ac.kr/~ta/4190.310/15/document/K_skel.zip
- 뼈대코드에는 K- 언어로 짜여진 프로그램을 읽어들이는 파서, K- 언어의 정의 및 실행기의 뼈대가 들어있습니다. k.ml 파일에서 TODO 로 표시해 둔 부분을 완성하여 실행기를 완성하시기 바랍니다.
- 뼈대코드에는 여러분이 숙제를 쉽게 하실 수 있도록 보조 모듈과 보조 함수들에 제공됩니다.
- 뼈대코드 디렉토리에서 make 명령을 실행하시면 숙제 전체가 컴파일되고, 'run' 이라는 실행파일이 생성됩니다. run 파일을 다음과 같이 실행하시면 examples 디렉토리에 제공해 드린 예제를 실행기로 돌려볼 수 있습니다.
코드: |
make
./run examples/test1.k-
|
- 10/8 뼈대코드가 업데이트되었습니다.
+ examples 디렉토리의 테스트케이스를 보충했습니다. 그리고 각 테스트케이스에 대해 올바른 출력결과도 제공됩니다. 채점에 사용될 테스트 케이스도 이 예제들의 범위를 크게 벗어나지 않을 것입니다.
다만 제공된 예제들을 약간 응용한 케이스는 채점에 사용될 수 있습니다.
+ 숙제의 방향을 좀 더 감을 잡으실 수 있도록 , 뼈대코드에서 ASSIGN과 LETV의 구현을 추가적으로 제공해 드립니다.
+ Error 에외가 인자로 받는 문자열을 수정했습니다. 아래의 스펙 보충설명을 참고하세요.
- 10/11 뼈대코드의 오타 수정 / 테스트케이스 추가
+ k.ml 의 203번째 줄 : "id"를 "id_list"로 수정합니다. 뼈대코드의 작동이 바뀌는 것은 아니며, 코드 이해를 돕기 위한 수정입니다.
+ examples/test4.k- 의 주석에서 "call by ref"가 아닌 "call by value"입니다
+ Record를 사용하는 테스트케이스 예제 하나를 examples 디렉토리에 추가하였습니다.
* 과제 관련 주의 사항
과제를 하고 제출하기에 앞서 꼭 https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=4922 글의 주의사항을 확인해 주세요.
* 숙제 스펙 보충사항
(질문은 이 글에 답글로 달지 마시고, 별도의 글로 질문해 주시기 바랍니다)
Exercise 1 "K- 실행기"
- 제출시에는 뼈대코드 중 k.ml 파일을 제출합니다. 꼭 주의해 주세요, 엉뚱한 ml 파일을 잘못 제출하시면 조교팀이 해결해 드릴 방법이 없습니다.
- read의 실행의미 구현에는 read_int 를, write의 구현에는 "print_endline (string_of_int n)"을 사용하는 것으로 합니다.
즉, hw3.pdf 에 설명된 대로 정수를 출력한 다음에 개행 문자(newline)를 출력해야 합니다.
마침 숙제의 감을 잡으실 수 있도록 뼈대 코드에 read와 write의 실행 의미를 정의해 두었으므로, 이 정의를 그대로 두시면 되겠습니다.
- K.run 의 결과는 출력 대상이 아닙니다. 입출력은 read/write 로만 이루어집니다.
- 실행 의미 규칙이 정의되지 않은 경우 Error 예외를 발생시킵니다. 몇몇 구체적인 상황과, 각각의 경우 Error 예외의 문자열은 다음과 같이 정하겠습니다.
(1) 타입 에러 - 정수 값이 와야 하는 곳에 하는데 참/거짓(bool) 값이 나오거나, Addr이 나와야 하는데 Procedure가 나온 경우
코드: | raise (Error "TypeError ...") |
(10/8 추가)
TypeError 뒤에 추가적인 정보를 더 붙이셔도 됩니다. 예를 들어 아래와 같이 쓸 수 있습니다. 채점시에는 스트링의 앞글자들만 매칭할 것이므로 모두 정답으로 인정됩니다.
코드: |
Error "TypeError : not int"
Error "TypeError : boolean is expected"
|
(2) Bind되지 않은 변수나 함수가 사용되는 경우
코드: | raise (Error "Unbound") |
(3) callv, callr에서 함수에 넘겨준 인자 개수와 함수 정의에서 받는 인자 개수가 다른 경우 :
코드: | raise (Error "InvalidArg") |
그 외에 실행의미가 정의되지 않은 경우에 대해서는, Error 예외의 문자열은 자유롭게 사용하시면 됩니다.
- (10/8 추가) 어느 예외가 먼저 발생해야 하는지 모호한 경우는 테스트하지 않겠습니다. 예를 들어
코드: |
let proc f (x) = x in
f (1, 2 + true)
|
는 Error "TypeError : ... "를 발생시켜야 하는 케이스에 해당하기도 하고, Error "InvalidArg"를 발생시켜야 하는 케이스에 해당하기도 합니다.
숙제 문서의 실행 의미 정의만으로는 어떤 예외가 우선시되는지 판단하기 애매하므로, 이런 경우는 테스트하지 않을 것입니다.
- (10/11 추가) CALLR의 semantics에서, σ(y)는 항상 메모리 주소(K- 문서의 "Addr", 뼈대 코드의 "Loc.t")인 경우만 가정하겠습니다.
σ(y)에 함수가 bind된 경우는 테스트하지 않겠으며, 이 경우는 예외를 내셔도 좋고 그대로 실행되어도 무방합니다.
---
Exercise 2 "K-프로그래밍: 거스름 방법의 수"
- K- 언어로 프로그램을 작성하신 후, 확장자를 .txt로 하여 제출해 주세요. 중앙전산원에서 .k- 확장자 파일 제출을 차단하기 때문입니다.
- 제공해 드린 뼈대 코드로 실행했을 때 파싱 에러가 발생하지 않도록 해 주세요
- numch 함수 작성 후 in 안에서 정수를 하나 입력으로 받고(input), numch(input) 을 출력하는 코드까지 작성해 주세요.
즉 다음과 같은 형태가 되면 됩니다.
코드: |
...
let proc numch (x) =
...
in
let input := 0 in
read input;
write (numch(input))
|
- numch 함수의 인자로는 양의 정수만 들어온다고 가정하셔도 됩니다.
양의 정수 아닌 값이 인자로 들어올 경우 자유롭게 처리하시기 바랍니다.
- 우리나라에는 50원 동전이 있지만, 본 숙제에서는 hw3.pdf 의 스펙을 따라 50원 동전은 없는 것으로 간주합니다.
--
Exercise 3 "K- 프로그래밍: compound data"
- K- 언어로 프로그램을 작성하신 후, 확장자를 .txt로 하여 제출해 주세요. 중앙전산원에서 .k- 확장자 파일 제출을 차단하기 때문입니다.
- 제공해 드린 뼈대 코드로 실행했을 때 파싱 에러가 발생하지 않도록 해 주세요
- 구현해야 하는 모든 함수 작성 후 마지막에 ... in 2015 로 끝내주세요. 마지막에 숫자 2015로 끝내는 것은 파싱 에러를 피하기 위해서입니다.
즉 다음과 같은 형태가 되면 됩니다.
코드: |
let proc leaf(i) =
...
in
...
...
let proc bft (t) =
...
in
2015
|
- dft 함수는 preorder로 방문하도록 작성해 주세요(https://en.wikipedia.org/wiki/Tree_traversal#Pre-order).
bft 함수를 작성할 때는 왼편 자식 트리를 먼저 방문하도록 작성하시기 바랍니다.
예를 들어, 아래 트리의 dft 방문 순서, bft 방문 순서는 모두 1->2->3 이 됩니다.
- makeLtree/makeRtree에 의해 만들어져서 한쪽에만 subtree를 가지고 있는 tree의 경우, 반대편에 empty tree가 매달려 있는 것으로 하겠습니다.
Leaf 양쪽에도 빈 트리가 달려있다고 볼 수도 있겠지만, 이 과제에서는 그렇지 않은 것으로 정의합니다.
즉, 다음과 같이 계산되어야 합니다
isEmpty(rTree(makeLtree (1, leaf (2)))) = true
isEmpty(Ltree(makeRtree (1, leaf (2)))) = true
- Empty tree는 dft/bft 함수로 방문할 때 아무것도 출력하지 않아야 합니다.
- rTree/lTree의 인자로 empty tree나 leaf가 들어오는 경우, 그리고 nodeVal의 인자로 empty tree가 들어오는 경우는 테스트하지 않겠으니 자유롭게 구현하시면 됩니다.
-- |
|