2017-03-20 21 views
0

편집 :

내 아래의 질문은 여전히 ​​유효하지만 난 그게 코드의 더미를 통해 선별하지 않고 대답하기 어렵다 것을 감사드립니다. 따라서 다소 유사한 질문을하기 위해 누구나 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 유형 (SomeNone)을 사용하여 처음에는 "비어있는"작품이었습니다. 아마도 여기에 문제가있을 수 있습니까?

+0

이전 질문을 삭제하고 필요한 경우 다른 질문에서 물을 수 있습니까? 그것은 menhir 예제에 대한 답변을 찾는 사람들을 도울 것입니다. –

답변

1

menhir을 사용하는 코드의 예에 대해서는 menhir에 의존하는 OPAM menhir page에있는 오른쪽 목록을 참조하십시오.

+0

불행히도이 설명서는 "장난감"프로그램의 범위를 넘어서는 예제를 제공하지 않습니다 (그들은 내가 생각하는 모든 계산기입니다). 내가 찾고있는 것은 좀 더 정교한 것, 어쩌면 전체 언어 구현이 아닌 그 규모에 가까운 것일 수도 있습니다. – daire16

+0

필자는 "필요한 사용자"목록을 의미했습니다. 예를 들어 [menhir 파서] (https://github.com/darioteixeira/ccss/blob/master/src/parser.mly)가있는 CCSS가 포함되어 있습니다. –

+1

오우 와우 거의 내가 뭘 찾고 있었는지, 고마워, 백만! 일찍 이해하지 못한 것에 대해 사과드립니다. – daire16