게시판 인덱스

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

숙제 4-1 테스트 하다가 파싱에러

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



가입: 2008년 9월 2일
올린 글: 40

올리기올려짐: 2008년10월17일 16:48    주제: 숙제 4-1 테스트 하다가 파싱에러 인용과 함께 답변

지금의 malloc 의 정의대로라면

아무거나 저장할 수 있는 n개의 배열을 잡는것처럼 동작합니다.(정확하게는 value형식의 n 배열이겠지만...)

그래서 테스트 10번을

let x := malloc(10)
in *x := 1;
*(x+1) := *x + 2; write *(x+1);
*(x+2) := {a := 1, b:= {}, c:= {}, d:= 4};
write *(x+2).d

이렇게 해봤더니 *(x+2)에 레코드를 넣는것 까지는 잘 되는데

*(x+2).d 가

STAR(
FIELD(
ADD(
VAR("x" ),
NUM(2)
),
"d"
)
)
로 파싱이 되네요


FIELD(
STAR(
ADD(
VAR( "x" ),
NUM( 2 )
)
),
"d"
)

가 되어야 하는데 저렇게 파싱이 되서 Location이 Record로 사용되는 오류가 발생합니다.

그래서 (*(x+2)).d 로 해서 실행하면 Fatal error: exception Lexer.Lexer.Eof 가 발생합니다. [..]

((*(x+2)).d )를 해도 마찬가지;

포인터에 레코드 넣고 쓸 수 있는 방법은 없을까요
시멘틱스 상으로도 사용할 수 있을것이라고 보이는데..

y:=x+2; write (*y).d

라고 해도 lexer.eof 가 발생하네요 *y.d라고 하면 위와같은 문제가 또 발생하구요--;;


y := *(x+2);
write y.d

이렇게 했을때라야 비로소 동작하는데 파서문제 때문에 변수를 일일히 하나하나 만드는 수고를 해야 하는건지 -_-;;
ㅠㅠ
위로
사용자 정보 보기 비밀 메시지 보내기
최종식



가입: 2008년 9월 2일
올린 글: 40

올리기올려짐: 2008년10월17일 16:53    주제: 그리고 11번 테스트셋 인용과 함께 답변

11번 테스트 셋은 일부러 오류를 내려고 만든 건가요?

다른 오류 테스트 셋은 오류를 낼 의도가 명백해서 상관이 없었는데

11번은 의도가 애매합니다.;
위로
사용자 정보 보기 비밀 메시지 보내기
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년10월18일 23:12    주제: 인용과 함께 답변

1.
파싱에러는 기존의 언어 정의에서 (* *) 이 주석을 나타내는 문법이기 때문에 발생합니다.
(* ) 로 생긴 것은, 주석을 열었는데 닫지 않은 경우로 해석되는 것이지요.
뼈대를 급히 수정하여 /* */을 주석으로 인식하도록 변경하였습니다.

기존 뼈대를 쓰시는 분들은 lexer.nl 파일을 다음과 같이 패치해주세요.
수정전 코드
코드:
 47  parse blank { start lexbuf }
 48      | "(*" { comment_depth :=1;
 49               comment lexbuf;

 77 and comment = parse
 78      "(*" {comment_depth := !comment_depth+1; comment lexbuf}
 79    | "*)" {comment_depth := !comment_depth-1;

수정후 코드
코드:
 47  parse blank { start lexbuf }
 48      | "/*" { comment_depth :=1;
 49               comment lexbuf;

 77 and comment = parse
 78      "/*" {comment_depth := !comment_depth+1; comment lexbuf}
 79    | "*/" {comment_depth := !comment_depth-1;


2.
예제 11번은 &y가 아니라 y가 나와야 맞을 것 같군요.

주 : 두가지 변경사항 모두 최신 뼈대에는 반영되어 있습니다
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
최준원



가입: 2007년 3월 30일
올린 글: 149

올리기올려짐: 2008년10월18일 23:45    주제: 11번 테스트 셋에서... 인용과 함께 답변

&y 를 y 로 고치는 것 외에도 변수 x,y 를 let 구문에서 선언하지 않는 것 같습니다...

let arr := malloc(10); x:=0; y:=0
in
...

와 같이 선언하는 것이 맞지 않을까요..? Smile
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2008) 시간대: GMT + 9 시간(한국)
페이지 11

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


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