2012-07-15 3 views
2

은 내가 도메인특정언어 (논리)에 대한 menhir 기반 구문 분석기를 포함하는 몇 가지 코드가 있습니다. 디버깅하는 동안 내 정신을 위해, 바로 지금과 같은 최상위이 언어의 경우 (공식)을 입력 할 수 있도록 좋은 것 :OCaml 최상위 도메인에서 Camlp4로 도메인 특정 언어 포함하기.

# f = << P(x,y) & x!=y >> 

campl4/5 내 유일한 옵션인가? 그렇다면 협박하는 문서를 찾습니다. 내 유스 케이스에 충분히 가깝고 적응할 수있는 예제/튜토리얼이 있습니까? 예를 들어 새 키워드를 소개하는 구문 확장은 적합하지 않은 것으로 보입니다. 감사!

답변

4

파싱을 수행 할 함수를 호출하려는 경우 ocamlmktop을 사용하여 파서를 최상위 수준에 포함 할 수 있습니다. 그런 다음 #install_printer을 사용하여 유형에 맞는 프린터를 설치할 수 있습니다. 그러면 세션은 다음과 같이 보일 수 있습니다.

# let x = parse() 
<< type your expression here >> 
# x : type = <<formatted version>> 

저는 특수 프린터를 사용했으며 복잡한 유형의 경우 많은 도움이되었습니다. 나는 결코 주위에 ocamlmktop을 사용하는 것을 얻지 않고 있었다. 나는 항상 내 코드에 #load#use을로드한다.

이것은 camlp4/5 (IMHO)를 마스터하는 것보다 훨씬 쉽습니다. 그러나 어쩌면 너무 조잡한 것일 수도 있습니다.

+0

감사합니다. 유지 관리가 거의 필요하지 않은 점은 좋습니다. 문자열 파서를 사용하면 다음과 같이 요청할 때와 거의 비슷하게 향상시킬 수 있습니다 :'# f = parse_str ("P (x, y) & x! = y") ;;' – Nikos

3

예, camlp4를 사용할 수 있으며 정상적으로 작동 할 수 있지만 정상적으로 문서화되지는 않으며 이에 대처해야합니다.

사용 사례와 가까운 예를 보려면 Camlp4 wiki의 Lambda calculus quotation 예제를 참조하십시오.

최상위로는 쉽게 작동합니다. 동적으로 "camlp4o.cmo"를 구문 최상위에로드하거나 findlib을 사용하여 다음을 처리 할 수 ​​있습니다. 최상위 수준에서 #use "topfind";;, #camlp4o;;, #require "myfoo.syntax";; 여기서 myfoo.syntax은 배포하기 위해 생성 한 findlib 패키지의 이름입니다. 귀하의 확장.

관련 문제