| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
이준희
가입: 2006년 9월 18일 올린 글: 43
|
올려짐: 2006년10월13일 22:38 주제: K-언어의 정의가 이상합니다. |
|
|
포인터 관련 테스트를 하던 중 오류를 발견하고 해결을 위해 씨름하다 보니, 정의에 이상한 점이 보이더군요.
| 코드: |
let
x := malloc(5)
in
(*x) := 1
end
|
와 같이 할 경우, x := malloc(5)를 하면서 ASSIGNV가 호출되고, malloc을 수행한 결과는 (Location, memory)이므로 x의 주소에 Location이 들어갑니다.
그리고 (*x) := 1을 수행할 때, *x를 수행하면 x에 들어있는 값, 즉 Location을 먼저 얻어내서 메모리상에 이 Location에 들어있는 값을 인출하게 되는데, malloc을 하면서 메모리가 초기화되지 않은 상태이므로 Bot를 반환합니다. 그러면 ASSIGNG가 이를 받아서 Location이 아니므로 예외를 띄우게 되네요.
이를 해결하는 방법이 없는건 아니지만, *x의 반환값을 *x가 Lvalue로 쓰이는지, Rvalue로 쓰이는지에 따라 이원화하게 되어서 정의에는 어긋난 구현을 하게 되는데요, 그래도 상관없을까 하는 생각이 듭니다. Rvalue로 쓰일 경우에 문제가 생기는 부분도 있는 것 같구요.
그리고 파싱에도 문제가 있는지, *x := 5라고 쓰면 *(x := 5)로 인식해서 예외가 발생하네요. _________________ ... |
|
| 위로 |
|
 |
서상민
가입: 2006년 9월 11일 올린 글: 25
|
올려짐: 2006년10월13일 23:03 주제: K-언어의 정의가 이상합니다. |
|
|
K-의 정의, 우선순위 및 파싱하는 것을 잘 보면 메모리 allocation을 하고 나서는
| 코드: | let
x := malloc(5)
in
(*x) := 1
end |
이 코드는 다음과 같이 수정되어야 원하는 동작을 보실 수 있을 겁니다.
저도 많이 고민했습니다.
| 코드: | let
x := malloc(5)
in
(x) := 1;
(x+1) := 2;
write *x;
write *(x+1)
end |
왜 이렇게 해야 되냐면 왼쪽이 먼저 실행되기 위해서는 ()로 우선순위를 높여주어야 되고, 그래야 하나의 expression이 되므로 ASSIGNG가 됩니다.
그리고 (x)의 값은 allocate한 location이 되므로 그 location에 값을 assign할 수 있는 것입니다.
도움 되셨기를... ^^ |
|
| 위로 |
|
 |
이준희
가입: 2006년 9월 18일 올린 글: 43
|
올려짐: 2006년10월13일 23:06 주제: |
|
|
저역시 그런 스타일로 고쳐서 효과를 봤었습니다.
결국 *x를 Lvalue로는 쓰지 않는게 최선일까요 역시^^;;
근데 그런 경우도, E1 := E2에서 E1에 올수 없는 exp의 제한이 늘어나는 것이라 문제가 될것 같아서 말이죠... _________________ ... |
|
| 위로 |
|
 |
이광근 손님
|
올려짐: 2006년10월14일 4:40 주제: |
|
|
훌륭합니다. 준희/상민씨의 질문답변 정확히 맞습니다. 역시!
고백: 의도하지 않은 퀴즈가 숨어있었던 K-의 정의였습니다.
- 강의에서는 *E 의 의미를 두가지(L-value, R-value)로 설명했지요.
:= 의 어느쪽에 나타나는 지에 따라 달라지는.
- 숙제의 K- 정의에는 한가지로만 한정시켰습니다.
- Quiz:
C프로그램 " x = malloc(1); *x = 1"의 효과를 가지는 K-의 프로그램을
작성하면?
-K |
|
| 위로 |
|
 |
|