나는 렉서에 매개 변수를 전달하는 것이 가능하다는 것을 알고매개 변수를 내 fsyacc 파서에 전달할 수 있습니까?
rule tokenize scope = parse
| whitespace { tokenize scope lexbuf }
| newline { newline lexbuf; tokenize scope lexbuf }
하지만 비슷한 방식으로 내 파서 시작 기호를 정의 할 수 아니에요.
나는 이런 식으로 정의하려고 : (감사 this 질문에)%type < (IScope, AST.Script) Fun > Script
// with the following definition in the head section of the parser:
type ('a,'b) Fun = 'a -> 'b
을하지만이 같은 모든 비 터미널 기호를 정의해야하고 그들은 모두 반환 람다 것. 이것은 달성하기 위해 노력하고있어 아니지만, 여러 non-terminals 내에서 scope
매개 변수에 액세스하고 구문 분석하는 동안 해당 작업을 실행할 수 있기를 바랍니다.
LexBuffer
(디버깅을 통해서만 확인 됨)이 포함 된 유형에 ParserLocalStore
유형이있는 것으로 나타났습니다. 모든 비 터미널에서 parseState
을 통해 액세스 할 수 있기 때문에 매개 변수를 저장할 수 있습니까? 아니면 나쁜 생각입니까?
나는 파서의 머리 부분에서 가변 변수를 사용하는 방법에 대한 생각,하지만 그들은 정적 것 (I 생각?)과 그 ... 동시에 여러 입력을 구문 분석에서 저를 방지 할 수
편집 :
관련 토큰 w에 임베드 나는 렉서에scope
을 통과
%token <string * IScope> IDENT
:
현재 나는 특정 토큰에 scope
매개 변수를 저장 hen 그는 그 (것)들을 창조한다 ... 나는 진짜로이 해결책을 좋아하지 않는다, 그러나 나는 무언가를 더 잘 올 수 없었다.
대답이 아니지만 FParsec을 고려해 보셨습니까? 매개 변수 전달은 쉽게 구워집니다. – Daniel
지금은 아닙니다. 우리는 또 다른 파서 프로젝트가 나오고 거기에 ANTLR을 사용할 것입니다. 우리가 (어느 시점에서) 현재 프로젝트에 ANTLR을 사용하기로 결정했다면, 나는 fsyacc로 이식하기가 더 쉽다. 파서 결합 자 (적어도 필자가 아는 한)는 매우 명확한 문법을 가지고 있지 않으며 모든 것을 공정하게 다르게해야한다. 반면 fsyacc/ANTLR 파서 구조의 대부분은 비슷하게 보인다. – enzi