2
나는 미니 파스칼 파서를 만들고있어

을 함께 즉시 순환 참조를 수정 :는 <a href="https://www.cs.helsinki.fi/u/vihavain/k06/okk/items/minipascalsyntax.html" rel="nofollow noreferrer">this Pascal syntax</a> 무한 유형 선언 지원, 차별 노동 조합

프로그램 :: = 프로그램 식별자 을; 블록 .

블록 :: = 변수 선언 부분 절차 선언 부분 문 부분

절차 선언 부분 :: = {절차 선언 ;}

절차 선언 :: = 절차 식별자 ;

type Program = Identifier * Block 
and Block = VariableDeclaration list option * ProcedureDeclaration list option * Statement list 
and ProcedureDeclaration = Identifier * Block 

하지만 유형 별칭을 사용하기 때문에 컴파일러는 오류를 던질 것이며, 그들은 컴파일시 삭제됩니다 :

을 차단 나는이 구문 AST 도메인 유형을 만들려고

이러한 유형의 정의는 약어

통한 즉각적인 순환 참조를 포함

일부는 wrapped discriminated union 유형으로이 문제를 해결할 수 있다고 말했는데 어떻게해야합니까?

답변

4
and ProcedureDeclaration = ProcedureDeclaration of Identifier * Block 

이제는 튜플이 아니라 단일 케이스 DU 유형입니다. 예를 들어 다음과 같이 만들 수 있습니다.

match somePD with 
| ProcedureDeclaration(i,b) -> ... 
으로

ProcedureDeclaration(someID, someBlock) 

및 분해

관련 문제