편집 :
내 아래의 질문은 여전히 유효하지만 난 그게 코드의 더미를 통해 선별하지 않고 대답하기 어렵다 것을 감사드립니다. 따라서 다소 유사한 질문을하기 위해 누구나 ASH를 구현하는 데 Menhir을 사용하는 예가 있습니까? 계산기와 같은 "장난감"프로젝트가 아닌 것이 좋지만 도움을 얻을 수 있으면 감사하겠습니다.입력 오류 추상 구문 트리와 선돌을 무장 할 때
원래 질문 :
나는 선돌을 사용하여 추상 구문 트리를 구현하기 위해 노력하고있어 내가 해결할 수없는 것 문제가있다. 내 설정은 다음과 같습니다 :
- AST의 사양은 atdgen을 사용하여 생성됩니다. 이것은 기본적으로 모든 문법 규칙이 ATD 형식으로 변환 된 파일입니다. 이것은 내가 AST를 인쇄 할 때 사용하는 JSON을 직렬화 할 수있게 해준다.
- 내 parser.mly 파일에 긴 제작 목록이 있습니다. Menhir을 사용하면서이 제작물을 AST 노드 작성까지 연결할 수 있습니다. 즉, 파서의 각 제작물은 AST에 값을 기록하는 명령과 일치합니다.
두 번째 요점은 내가 진전을 이루기 위해 정말로 고심하고있는 부분입니다. 나는 거대한 문법을 가지고있다. (ast.atd 파일은 ~ 600 행이고 parser.mly 파일은 ~ 1000 파일이다.) 그래서 나는 잘못 가고있는 곳을 찾아 내려고 어렵다. 나는 그 길을 따라 어딘가에 타입 에러가 있다고 생각합니다. 코드의
조각
여기 내 ast.atd 파일의 모습입니다 :
여기...
type star = [ Star ]
type equal = [ Equal ]
type augassign = [
| Plusequal
| Minequal
| Starequal
| Slashequal
| Percentequal
| Amperequal
| Vbarequal
| Circumflexequal
| Leftshiftequal
| Rightshiftequal
| Doublestarequal
| Doubleslashequal
]
...
내 parser.mly 파일의 모습입니다 같은 :
...
and_expr // Used in: xor_expr, and_expr
: shift_expr
{ $1 }
| and_expr AMPERSAND shift_expr
{ `And_shift ($1, `Ampersand, $3) } ;
shift_expr // Used in: and_expr, shift_expr
: arith_expr
{ $1 }
| shift_expr pick_LEFTSHIFT_RIGHTSHIFT arith_expr
{ `Shift_pick_arith ($1, $2, $3) } ;
pick_LEFTSHIFT_RIGHTSHIFT // Used in: shift_expr
: LEFTSHIFT
{ `Leftshift }
| RIGHTSHIFT
{ `Rightshift } ;
...
내가 오류 파일을 컴파일하려고합니다.
는 타입 오류가 나는이 질문에이 같이 추상적으로 답변을 다소 어렵다는 것을 깨닫게하고, 내 코드의 보관에 대한 링크를 제공 할 행복 해요,하지만 난 '
This expression has type [GIANT TYPE CONSTRUCTION] but an expression
was expected of type [DIFFERENT GIANT TYPE CONSTRUCTION]
을 즉 누군가가 올바른 방향으로 나를 가리킬 수 있다면 정말 감사드립니다.
아마도 관심의 대상이 될 수 있습니다. parser.mly의 일부 작품은 ocaml option
유형 (Some
및 None
)을 사용하여 처음에는 "비어있는"작품이었습니다. 아마도 여기에 문제가있을 수 있습니까?
이전 질문을 삭제하고 필요한 경우 다른 질문에서 물을 수 있습니까? 그것은 menhir 예제에 대한 답변을 찾는 사람들을 도울 것입니다. –