다음은 Andrew Appel의 Tiger 언어 (ocaml)에 대한 현재 lexer 및 parser입니다.menhir을 사용하여 표현식 목록을 구문 분석하는 방법은 무엇입니까?
나는 현재 상호 재귀 기능을 지원하기 위해 노력하고있어,하지만 다음 파서 코드가 작동하지 않습니다
decs :
| l = list(dec) { l }
dec :
| t = nonempty_list(loc(tydec)) { S.TypeDec t }
| v = loc(vardec) { S.VarDec v }
| f = nonempty_list(loc(fundec)) { S.FunDec f }
%inline fundec :
| Function fun_name = symbol LPar params = tyfields RPar
Eq body = loc(exp) {
S.{ fun_name; args = params; return_type = None; body }
}
| Function fun_name = symbol LPar params = tyfields RPar
Colon result_type = symbol Eq body = loc(exp) {
S.{ fun_name; args = params; return_type = Some result_type; body }
}
을 작은 예를 들어
let
function f1(x : int) : int =
f2(x)
function f2(x : int) : int =
f1(x)
in
f1 (0)
end
내가 두 FunDec
토큰을 얻을 두 개의 요소로 구성된 목록이있는 단일 FunDec
토큰 대신 싱글 톤 목록.
menhir을 사용하여 fundec
의 목록을 구문 분석하려면 어떻게해야합니까?
PS : 내가 두 번째 패스에서이 목록을 병합 할 수 있습니다 알고 있지만, 가능
질문에 관련 코드를 모두 넣을 수 있습니까? – PatJ
@PatJ fundec 구문 분석 규칙을 추가했지만 원하는 것이 무엇인지 확실하지 않습니다. 두 개의 관련 파일 + 예제 코드를 연결했습니다. 전체 파서 파일을 넣는 것은 질문을 clobber 것입니다, 그렇지 않습니까? – Vinz
링크가 죽은 경우를 대비하여 모든 게시물이 자체 포함되어야한다는 것은 사이트 정책에 명시된 것입니다. github이 곧 사라지지는 않을지라도 저장소가있을 수 있습니다. – PatJ