2012-09-19 2 views
3

나는 렉서에 매개 변수를 전달하는 것이 가능하다는 것을 알고매개 변수를 내 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 그는 그 (것)들을 창조한다 ... 나는 진짜로이 해결책을 좋아하지 않는다, 그러나 나는 무언가를 더 잘 올 수 없었다.

+0

대답이 아니지만 FParsec을 고려해 보셨습니까? 매개 변수 전달은 쉽게 구워집니다. – Daniel

+0

지금은 아닙니다. 우리는 또 다른 파서 프로젝트가 나오고 거기에 ANTLR을 사용할 것입니다. 우리가 (어느 시점에서) 현재 프로젝트에 ANTLR을 사용하기로 결정했다면, 나는 fsyacc로 이식하기가 더 쉽다. 파서 결합 자 (적어도 필자가 아는 한)는 매우 명확한 문법을 ​​가지고 있지 않으며 모든 것을 공정하게 다르게해야한다. 반면 fsyacc/ANTLR 파서 구조의 대부분은 비슷하게 보인다. – enzi

답변

0

LexBuffer에는 Dictionary<string, obj>이 있으며, parseState을 통해 얻을 수도 있습니다. 더 나은 해결책을 찾지 못하고 결국 매개 변수를 저장하게되었습니다.

나는 fsyacc의 향후 버전에서 이러한 기능을 사용할 수 없을 가능성이 높지만 현재 당분간은이를 고수하고 있음을 알고 있습니다. 아직 답변이 없었다 때문에

type IParseState with 
    member x.LexBuffer() = x.ParserLocalStore.["LexBuffer"] :?> LexBuffer<char> 

type LexBuffer<'a> with 
    member x.SomeParameter 
     with get() = x.BufferLocalStore.["SomeParameter"] :?> SomeParamType 
     and set(v) = x.BufferLocalStore.["SomeParameter"] <- v 

, 나는 이것을 받아 들일 것 : 경우에 누군가가 동일한 작업을 수행 할 필요에서, 나는 깨끗한 방식으로 내 매개 변수에 액세스하기 위해 만든 여기 두 개의 확장 방법을 떠나 하나는 지금. 더 나은 솔루션을 제안 하겠지만 기꺼이 받아 들여진 답변을 변경하겠습니다.

관련 문제