2010-01-13 2 views
2

나는 lex javascript 정규 표현식 리터럴을 시도하고있다. 이것들은 "/"로 끝나고 "/"(때로는 다른 수식어로 끝남)로 끝납니다. 문제는 나누기 연산자가 아닌 일반 표현식인지 여부를 확인하는 유일한 방법은 "/"문자 이전에 토큰을 읽는 것입니다.fslex lexing javascript 정규 표현식

좀 더 자세한 내용은 here에서 읽을 수 있습니다.

그렇듯이 이전 토큰을 얻는 방법에 대한 문서를 찾을 수 없습니다. 희망적으로 이것은 가능하고 누군가는 저에게 방법을 말할 수있다.

감사합니다.

답변

1

에게 이 문제를 해결하기 위해 마지막 토큰을 추적하는 모듈을 만들었으며 올바른 토큰 목록에서 "/"연산자가 나눗셈 연산자인지 또는 정규식인지 확인합니다.

코드

은 다음과 같습니다 :

let mutable lastToken:token = EOF 

let setToken token = 
    lastToken <- token 
    token 

let parseDivision (lexbuf:Lexing.lexbuf) (tokenizer:Lexing.LexBuffer<'a> -> JavascriptParser.token) regexer = 
    match lastToken.GetType().Name with 
    | x when invalidRegexPrefix |> List.contains(x) -> DIVIDE 
    | _ -> 
     let result = (regexer lexbuf.StartPos "" lexbuf) 
     REGEX(result) 

그리고 다음 렉서 안에 내가 규칙의 결과에 setToken를 호출합니다. 예를 들어 :

| '(' { setToken LPAREN } 

setToken 모두이 그것을 실제 렉서 코드에 덜 방해가 될 수 있도록 만했다, 마지막 토큰을 설정하고 단지 설정되어있는 토큰을 반환합니다.

은 "/"문자에 대한 실제 규칙은 다음과 같습니다

| "/" { setToken (parseDivision lexbuf token regex) } 

하나 또한 구문 분석이 완료되면를 끝까지 토큰을 재설정 할 필요가 또는 마지막 토큰이기 때문에 당신은 (일관성없는 상태에있을 수 있습니다 정적 변수).

1

내가 아는 한, 이전 토큰을 얻을 수있는 방법이 없습니다. (하지만 필자는 그것을 시도하지 않았고 꽤 오래 전에 FSLex를 사용했습니다). 마지막으로 처리 된 토큰을 지정하는 매개 변수를 유지 한 다음 "/"문자를 찾을 때이 매개 변수를 사용하여 수행 할 작업을 결정할 수 있습니다.

어쨌든 현재 가지고있는 샘플 코드를 게시 할 수 있습니까 (예 :이 문제를 다루는 부분 만)? (내가 뭔가를 알아낼 수 있다면 내 비주얼 스튜디오에 붙여 시도하고 볼 수있는 경우!) 우리가 몇 가지 예제 코드를 볼 수있을 경우 질문에 대한 답을 훨씬 쉬울 것

T.