이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
서성현
가입: 2005년 9월 29일 올린 글: 54
|
올려짐: 2005년10월29일 2:09 주제: [HW4-3] 복잡한 구조의 설탕 테스트셋 |
|
|
제출기한이 지나긴 했습니다만,
딜레이로 제출하는 분들도 계시죠? (전 딜레이입니다 ㅠㅠ)
아니면 제때 제출한 분이더라도
자기 알고리즘이 맞는지 확인하고 싶은 분도 있을 수 있고..
이것은 다음의 5가지 경우를 모두 포함하는 테스트셋입니다.
1. fac의 외부에서 fac을 call-by-reference로 호출하는 경우
2. fac의 외부에서 fac을 call-by-value로 호출하는 경우
3. fac의 내부에서 fac을 call-by-reference로 recursive하게 호출하는 경우
4. fac의 내부에서 fac을 call-by-value로 recursive하게 호출하는 경우
5. fac 실행 도중 또다른 함수를 call-by-reference로 호출하는 경우
참, 다음의 두 가지 경우도 추가했습니다.
6. call-by-reference에 사용되었던 변수가 한 문장 여유를 두고 사용되는 경우
ex) write call fac< num > ; write num
7. call-by-reference에 사용되었던 변수가, call이 이루어진 그 문장에서 곧바로 사용되는 경우
ex) n := n + (call addOne< arg >) + arg - 2
설탕 녹이기를 조금 특이하게 구현한다는 분도 있어서, (전역 변수를 이용한 구현 등..)
그런 경우까지도 고려하여 테스트셋을 작성해 보았습니다.
이 테스트셋을 통과한다면 거의 안심해도 좋을 것 같네요.
코드: | let procedure addOne( n ) =
0
; n := n + 1
; n
in
let procedure fac( n ) =
let arg := n - 1 in
let return := 0 in
0
; if n = 0 then
return := 1
else
0
; if ( (n/2)*2 = n ) then
return := n * (call fac< arg >)
else
return := n * (call fac( arg ))
end
; n := n + (call addOne< arg >) + arg - 2 (* n := n + arg * 2 *)
; write n
end
; return
end end
in
let
num := 10
in
0
; write call fac< num > (* fac< 10 > = 10! = 3628800 *)
; write num (* num = 60 *)
; write call fac( 10 ) (* fac( 10 ) = 10! = 3628800 *)
end
end
end |
코드: | <neoseo@martini examples> ../run sugar.k-
1
4
7
18
13
32
19
46
25
60
3628800
60
1
4
7
18
13
32
19
46
25
60
3628800
<neoseo@martini examples> |
_________________ http://snupl.wo.to |
|
위로 |
|
|
조성문
가입: 2005년 10월 21일 올린 글: 5
|
올려짐: 2005년10월29일 11:27 주제: Re: [HW4-3] 복잡한 구조의 설탕 테스트셋 |
|
|
코드: | let procedure addOne( n ) =
0
; n := n + 1
; n
in
let procedure fac( n ) =
let arg := n - 1 in
let return := 0 in
0
; if n = 0 then
return := 1
else
0
; if ( (n/2)*2 = n ) then
return := n * (call fac< arg >)
else
return := n * (call fac( arg ))
end
; n := n + (call addOne< arg >) + arg - 2 (* n := n + arg * 2 *)
; write n
end
; return
end end
in
let
num := 10
in
0
; write call fac< num > (* fac< 10 > = 10! = 3628800 *)
; write num (* num = 60 *)
; write call fac( 10 ) (* fac( 10 ) = 10! = 3628800 *)
end
end
end |
아. 숙제내고 잊어버릴라 했는데, 한번 돌려봐야겠네요 ㅠ.ㅠ 두근두근
근데, K-에서 주석은 /* */ 인데요, 위에서는 nml형식으로 주석을..
아마 parse 에러 날거라는.. 쿨럭.
테스트셋 잘 쓰겠습니다. ^^ |
|
위로 |
|
|
서성현
가입: 2005년 9월 29일 올린 글: 54
|
올려짐: 2005년10월29일 11:57 주제: Re: [HW4-3] 복잡한 구조의 설탕 테스트셋 |
|
|
조성문 씀: | 근데, K-에서 주석은 /* */ 인데요, 위에서는 nml형식으로 주석을..
아마 parse 에러 날거라는.. 쿨럭. |
음.. hw3의 파서를 사용하는 숙제가 아니었던가요?
hw3에서는 주석 형태가 (* *) 이잖아요.
숙제 문서에
인용: | program은 숙제3의 KMINUS 꼴에 정의된 대로이다. |
이렇게 나와 있길래 당연히 hw3의 파서를 사용하는 숙제인 줄 알았는데..
그럼, 고쳐야 할 주석 수도 몇 개 안 되니까
hw4용 K- 코드도 적어두도록 하죠 뭐 ^^ㆀ
코드: | let procedure addOne( n ) =
0
; n := n + 1
; n
in
let procedure fac( n ) =
let arg := n - 1 in
let return := 0 in
0
; if n = 0 then
return := 1
else
0
; if ( (n/2)*2 = n ) then
return := n * (call fac< arg >)
else
return := n * (call fac( arg ))
end
; n := n + (call addOne< arg >) + arg - 2 /* n := n + arg * 2 */
; write n
end
; return
end end
in
let
num := 10
in
0
; write call fac< num > /* fac< 10 > = 10! = 3628800 */
; write num /* num = 60 */
; write call fac( 10 ) /* fac( 10 ) = 10! = 3628800 */
end
end
end |
_________________ http://snupl.wo.to |
|
위로 |
|
|
김남중 손님
|
올려짐: 2005년10월29일 11:58 주제: exception Failure("lexing: empty token") |
|
|
위 코드를 돌렸을 때,
exception Failure("lexing: empty token")
에러가 난다면 제 구현이 잘 못 된건가요?
사실 위 코드를 보면 당연히 돌아야 하는데,
돌지 않고 렉싱에러가 나네요.
가끔 저 에러를 보기는 했지만, 코드를 잡아주면 다 고쳐졌었거든요.
근데 지금 코드에서는 뭐가 잘 못인지 모르겠어서
질문드립니다.
위 에러는 언제 발생하게 되는건가요?
그리고 제가 잘 못 구현해서 나는 에러인가요? |
|
위로 |
|
|
서성현
가입: 2005년 9월 29일 올린 글: 54
|
올려짐: 2005년10월29일 12:13 주제: Re: exception Failure("lexing: empty token") |
|
|
김남중 씀: | 위 코드를 돌렸을 때,
exception Failure("lexing: empty token")
에러가 난다면 제 구현이 잘 못 된건가요? |
이상하네요..
저 코드를 복사해다가 vi에디터 안에 붙여넣기 해서 다시 돌려봤는데
전 hw3의 K-, hw4의 K- 둘 다에서 제대로 작동하거든요.
(물론 설탕을 녹이기 이전의 상태에서 제대로 작동한다는 겁니다)
질문하신 분의 상황이 어떤 상황인지 잘 모르겠네요.
아무래도 렉싱에러 같은 건 조교님이 답변해주셔야 하겠는데요.. ^^; _________________ http://snupl.wo.to |
|
위로 |
|
|
김남중 손님
|
올려짐: 2005년10월29일 12:50 주제: lexing error 알아냈내요. |
|
|
아마도 파일이 저장된 형식 때문에 데이타 읽기가 안 된 것 같습니다.
처음에 노트패드에 코드를 복사한 다음에 .k- 확장자 붙여서 sftp로 올려서 했었는데
아무리 코드를 잡고, 고쳐도 안되더군요.
vi열고 처음부터 코드 다시 짰더니 되었습니다.
렉서가 코드 읽을때 문자형식을 가려서 그런 것 같습니다. |
|
위로 |
|
|
김덕환
가입: 2005년 8월 29일 올린 글: 190
|
올려짐: 2005년10월29일 14:13 주제: Re: lexing error 알아냈내요. |
|
|
김남중 씀: | 아마도 파일이 저장된 형식 때문에 데이타 읽기가 안 된 것 같습니다.
처음에 노트패드에 코드를 복사한 다음에 .k- 확장자 붙여서 sftp로 올려서 했었는데
아무리 코드를 잡고, 고쳐도 안되더군요.
vi열고 처음부터 코드 다시 짰더니 되었습니다.
렉서가 코드 읽을때 문자형식을 가려서 그런 것 같습니다. |
윈도우 환경과 유닉스 환경은 라인 끝을 나타내는 문자(들)가 다릅니다. 그래서, 두 환경 사이에서 (s)ftp 프로토콜을 사용하여 텍스트 모드 전송을 하면 라인 끝 문자(들)를 변환하게 됩니다. 남중 님께서 겪은 문제는 텍스트 모드가 아닌 바이너리 모드로 전송을 함으로써 라인 끝 문자 변환이 이루어지지 않아 생긴 문제로 보입니다.
See also The End of Line Puzzle |
|
위로 |
|
|
|