2014-02-07 3 views
3

일부 문자열을 토큰에 매핑하는 keyword_table을 정의하고이 테이블을 parser.mlylexer.mll에 대해 표시하고 싶습니다.menhir에서 .mly와 .mll 모두에 대해 토큰을 포함하는 테이블 만들기

테이블 parser.mly에 정의되어야한다는 것,

%{ 
    open Utility (* where hash_table is defined to make a table from a list *) 
    let keyword_table = hash_table [ 
     "Call", CALL; "Case", CASE; "Close", CLOSE; "Const", CONST; 
     "Declare", DECLARE; "DefBool", DEFBOOL; "DefByte", DEFBYTE ] 
%} 

그러나, 나는 this comment으로

{ 
open Parser 
let x = keyword_table (* doesn't work *) 
let x = Parser.keyword_table (* doesn't work *) 
let x = Parsing.keyword_table (* doesn't work *) 
} 

알 수 예를 들어, lexer.mll에서 사용할 수 없습니다, menhir는 솔루션을 이것을 위해, 누군가는 나에게 어떤 세부 사항이라도 말할 수 있었느냐?

답변

0

보통 keyword_tablelexer.mll에 넣고 parser.mly에 넣을 이유가 없습니다. 당신은 lexer.mllparser.mly (하지만 당신은 parser.mly에서 액세스 할? 할 이유), 가장 쉬운 해결책은 세 번째 파일 keyword.ml에 넣어 및 Keyword.keyword_table (또는 open Keywordkeyword_table)를 사용하는 것입니다 모두에서 액세스해야하는 경우.

+0

문제는'keyword_table'에 토큰이 들어있어'keyword.ml' 세 번째 파일에 넣을 수 없습니다 ... – SoftTimur

+1

이것은 문제가되지 않습니다.'--external-tokens'에 대한 문서를 참조하십시오. – Thomash

+0

내가 사용했던 몇 가지 문제로'--external-tokens' (http://www.ii.uni.wroc.pl/~lukstafi/pmwiki/uploads/Functional/functional-lecture09.pdf) 'ocamlbuild'와 함께. 그것은 더 많은 유연성을 제공합니다. – lukstafi

3

첫 번째 옵션은 별도의 .mly 파일에 토큰을 정의하는 것입니다. --only-tokens 옵션을 사용하여이 파일에 대해 menhir을 실행하면 --external-tokens 옵션으로 컴파일 된 파서에 사용할 수있는 type token을 포함하는 모듈이 생성됩니다.

토큰의 문제점을 해결하면 Thomash가 제안한대로 별도의 파일에서 파서와 렉서가 사용하는 다른 모든 기능을 지정할 수 있습니다.

대체 솔루션이 있습니다. 구문 분석기에서 %parameter<module signature> 선언을 사용하여 주어진 서명 내부에 지정된 유형 및 함수 주석에 대해 전체 구문 분석기를 매개 변수화 할 수 있습니다. 주된 장점은이 서명이 파서의 인터페이스 파일에 제공되므로 파서가이 서명을 다른 모듈 (서명을 기반으로 모듈을 구성 할 수 있음)과 공유 할 수 있다는 것입니다.

나는 외부 토큰에 대해 알고 calc-param에 매개 변수화 파서를 만드는 방법을 알게 calc-two를 참조 즉, to menhir examples를 참조하는 것이 좋습니다.