| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
정영범
가입: 2005년 9월 5일 올린 글: 167
|
올려짐: 2007년10월7일 18:55 주제: HW3 뼈대를 다시 받으세요. |
|
|
제가 실수로 환경에 closure를 빠뜨렸습니다.
또, call by reference parsing도 되지 않습니다.
뼈대를 다시 받으시고, 이미 3.n을 고치신 분은
3.n 파일 313줄을
| 코드: | | env_entry = Addr of Loc.t | Proc of id * exp * env |
317줄의 env_loc 함수를
| 코드: | fun env_loc x e =
(case Env.lookup x e of
Addr l => l
| Proc _ => raise (Error "not allowed")) handle
Env.Not_bound => raise (Error "not bound") |
로 바꿔주세요.
번거롭게 해서 죄송합니다.  |
|
| 위로 |
|
 |
한재화
가입: 2007년 10월 6일 올린 글: 25
|
올려짐: 2007년10월7일 19:32 주제: 왜 env_loc 의 리턴값이 Proc 타입이면 exception을 발생하나요? |
|
|
env_loc이 리턴하는 env_entry에는 Proc 타입도 포함되어 있지 않습니까?
저는 env_loc 이 env_entry 타입을 반환한다 하고 뒤에 Addr l => l 이나 Proc _ => 같은 case 처리 없이 env_loc 을 쓰는 곳에서 저 값을 분류하도록 했는데 상관없는지요 |
|
| 위로 |
|
 |
김경동 손님
|
올려짐: 2007년10월7일 19:41 주제: 뼈대를 바꿨는데요~ |
|
|
조교님이 올려주신 뼈대를 바꾸고 나니
잘되던 test4.k-가 parsing이 안되는데 저만 그런지요..
그리고 작업하던 numch도 되던 parsing이 안되는;;;
그리고 env_loc도 제가 Procedure가 포함된 형태로 바꿨는데 상관없는지요.
밑에 3.n은 마음대로 수정해도 된다고 하셔서 제가 임의로 env_loc도 바꿨거든요. |
|
| 위로 |
|
 |
김현서 손님
|
올려짐: 2007년10월7일 19:54 주제: 저도 파싱 에러가 납니다. |
|
|
저도 새 뼈대를 깔고 실행해 봤더니 예제 4에서 파싱 에러가 납니다.
저만 그런 줄 알고 당황했었는데 다행(?)이네요. |
|
| 위로 |
|
 |
한상욱
가입: 2007년 9월 23일 올린 글: 5
|
올려짐: 2007년10월7일 20:35 주제: 저도 파싱에러가 나네요. |
|
|
뼈대를 바꾸고 나니 윗분들과 마찬가지로 test4.k-에서 파싱에러가 납니다.
그리고 아래글에 어떤 분이 올리셨던 코드도 파싱에러가 나네요.
| 코드: | (* recursive - factorial *)
let
proc fac(x) =
if not (x < 1) then (x * fac(x-1))
else (1)
;
x := 0
in
read x;
write fac(x) |
|
|
| 위로 |
|
 |
남기웅 손님
|
올려짐: 2007년10월7일 21:11 주제: |
|
|
| 헉... 3.n 에서 그 부분은 각자 스스로 해결해 보라는 뜻에서 Proc 은 빼신 것으로 추측했었는데 ㅎㅎ |
|
| 위로 |
|
 |
김지수 손님
|
올려짐: 2007년10월8일 0:37 주제: parsing error |
|
|
추측컨데 parsing error는 "<"의 왼쪽에 문자가 올 때 생기는 듯 하네요.
아래의 코드를 run -pp로 해 보면
두 주석 괄호 중 어느 하나라도 빼면 에러가 납니다.
let x:=0 in
let y:=0 in
0<0;
0<x
(*
;x<0
*)
(*
;x<y
*) |
|
| 위로 |
|
 |
정영범
가입: 2005년 9월 5일 올린 글: 167
|
올려짐: 2007년10월8일 14:57 주제: |
|
|
김지수 학생이 적은대로
x < 0 (* expr < expr *)
f < x > (* ID < ID > *)
둘이 충돌이 나서 parsing이 안되고 있습니다. shift를 할 지 reduce를 시킬건지 결정을 못하고 있습니다.
고쳐서 다시 올리도록 하겠습니다. 죄송합니다.  |
|
| 위로 |
|
 |
정영범
가입: 2005년 9월 5일 올린 글: 167
|
올려짐: 2007년10월8일 15:19 주제: |
|
|
다시 올렸습니다.
다시는 이런 일이 없도록 하겠습니다. 죄송합니다. |
|
| 위로 |
|
 |
한재화
가입: 2007년 10월 6일 올린 글: 25
|
올려짐: 2007년10월8일 16:19 주제: 새로이 올라온 뼈대를 쓰지 않고, 기존에 있는 뼈대를 고쳐서 써도 되나요.. |
|
|
조교님께서 올리신 뼈대는, env_entry 가 Addr과 Proc의 두 개의 방법으로 만들어질 수 있는 타입임에도, env_loc의 리턴값이 Proc 일때는 exception을 raise 하셨더군요.
| 코드: |
fun env_loc x e =
(case Env.lookup x e of
Addr l => l
| Proc _ => raise (Error "not allowed")) handle
Env.Not_bound => raise (Error "not bound")
|
그렇다면, 이런 경우에는 recursive call 같은 것을 구현하기에는 어려움이 있다고 봅니다. 저같은 경우는 env_loc을
| 코드: |
fun env_loc x e = (Env.lookup x e) handle Env.Not_bound=> raise (Error "not bound")
|
와 같이 다시 정의했는데, 제가 만든 것으로 계속 써도 가능할런지요. |
|
| 위로 |
|
 |
정영범
가입: 2005년 9월 5일 올린 글: 167
|
올려짐: 2007년10월8일 16:45 주제: |
|
|
env_proc 함수를 따로 정의하면 되지요.
| 코드: | fun env_proc f e =
(case Env.lookup f e of
Addr _ => raise (Error "not allowed")
| Proc p => p) handle
Env.Not_bound => raise (Error "not bound") |
구분 없이 편하게 사용하기 위해 한재화 학생처럼 사용하셔도 됩니다.
그런데, 혹시라도 location을 꺼내려는데 함수가 나오는 경우에 에러처리를 위해서 구분을 한 것입니다. |
|
| 위로 |
|
 |
남기웅 손님
|
올려짐: 2007년10월8일 19:38 주제: |
|
|
새로 뼈대 파일을 다운로드 받고
nmakegen -f 를 실행하니까
shift reduce conflict 가 1개 있다고 메시지가 나오는데 괜찮은 건가요?
이후의 프로그램 실행에는 문제는 없는거 같은데요. |
|
| 위로 |
|
 |
정영범
가입: 2005년 9월 5일 올린 글: 167
|
올려짐: 2007년10월8일 19:48 주제: |
|
|
예, 문제 없습니다.
shift를 할지 reduce를 할지 conflict가 생기는데 항상 shift해서 parsing을 진행하도록 했습니다.
룰을
EXP < EXP (* LESS *)
| EXP < EXP > (* CALLR *)
로 바꾸고 EXP1 EXP2가 ID가 아니면 parsing error를 내도록 했습니다.
conflict 자체를 없애는 방법은 현재로선 없는 것 같습니다.
함수 호출에 키워드를 넣거나 <>를 다른 것으로 바꾸면 쉽게 해결할 수는 있겠죠.
call f <x> 혹은
f [x]
이런 식으로요. |
|
| 위로 |
|
 |
|