에게 이 문제를 해결하기 위해 마지막 토큰을 추적하는 모듈을 만들었으며 올바른 토큰 목록에서 "/"연산자가 나눗셈 연산자인지 또는 정규식인지 확인합니다.
코드
은 다음과 같습니다 :
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) }
하나 또한 구문 분석이 완료되면를 끝까지 토큰을 재설정 할 필요가 또는 마지막 토큰이기 때문에 당신은 (일관성없는 상태에있을 수 있습니다 정적 변수).