2013-05-29 2 views
4

은 내가 JSON 파일에서 직접 기록 값을 구축 할 수 있도록camlp4 구문 확장, 파서 오류

type.yjson type_name { 
    /* type_declaration */ 
} 

같은 유형의 정의를 허용 구문 확장을 만들었습니다. 구문 확장 모듈과이를 수행하는 데 필요한 함수를 삽입하십시오. 여기까지 아무런 문제가 없습니다. 구문 확장은 내가 원한 것과 똑같습니다. (: 함수 매개 변수 즉) 내 코드에서 다른 장소에서 "yjson"를 사용하려는 경우

나는 몇 가지 문제를 가지고 시작합니다. 내가 뭘하려 여기

:

여기
EXTEND Gram 
str_item: 
    [ 
     [ KEYWORD "type"; KEYWORD "."; "yjson"; tdl_raw = type_declaration -> 

내가 정말 여기에서 무슨 일이 이해하지 않는 함수 매개 변수

[fun_binding] expected after [ipatt] (in [let_binding]) 

로 "yjson"를 사용할 때 내가 오류. 규칙이 일치했기 때문에 구문 분석 오류가 발생하는 이유는 무엇입니까?

답변

5

내가 완벽이 주위에 P4의 메커니즘을 이해하지 않지만, [ [ "blahblah" -> ... 언어의 새로운 키워드로 blahblah 수 있습니다, 그래서 당신은 더 이상 함수 인수로 blahblah을 사용할 수 없습니다.

이것을 보려면 camlp4of로 pa _ *. ml 사전 처리를 시도하고 "blahblah"Gram.Skeyword "blahblah"으로 어떻게 확장되는지 확인하십시오. 이 Skeyword _는 P4의 Insert.insert을 통해 Structure.using에 전달하고, 문자열이 새로운 키워드로 등록되어있는 것으로 보인다. 정상적인 변수로 사용할 수 yjson을 유지 규칙에 id = LIDENT 대신 "yjson"를 사용하여 다음 id의 내용을 확인하려면

은 당신의 행동 "yjson" 여부입니다.

4

약간 주제를 벗어난 발언을 할 수 있다면, 유형 지향 코드 생성을위한 맞춤 구문을 디자인하는 것이 바람직합니다. 두 가지 구문이 이미 존재할 때 (하나는 type_conv이고 하나는 파생), 이는 (유형 전환)는 사실상 표준이되고있다.

type foo = { 
    ... 
} with json 

이에 대한 구문을 선택하는 경우, 당신은 매우 좋은 이유가되지는에이하지 않는 해야 사용이 하나. 실제로 type-conv 자체는 타입 지향 코드 생성기를 작성할 수있게 해주는 도우미 유틸리티이기 때문에 수행하려는 작업에 직접 type-conv를 사용할 수 있습니다.

,

합니다 (OCaml의 구문에 직접 주석을 지원하는 알랭 프리 슈에 의해 지속적인 연구가 있지만 아직 소비에 대 한 준비 아니다 당신은 아마 마틴 Jambon의 Atdgen, Camlp4를 사용하지 않는 의식적인 선택을하는에 대해 알고있다.)

+0

전적으로 동의합니다. 사실 이미 파생 생성기로 모든 것을 다시 썼습니다. 그러나이 오류는 잠시 나를 괴롭혔다. –