게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

[HW4-3] 복잡한 구조의 설탕 테스트셋

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2005)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
서성현



가입: 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
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2005) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay