fslex lexing javascript正则表达式

时间:2010-01-13 03:59:53

标签: f# fsyacc

我试图lex javascript常规的exression文字。它们以“/”开头,以“/”结尾(有时还有其他一些修饰符)。问题是确定它是否是正则表达式而不是除法运算符的唯一方法是读取“/”字符前面的标记。

人们可以在here上阅读更多内容。

实际上,我找不到任何关于如何获取前一个令牌的文档。希望这是可能的,有人可以告诉我如何。

感谢。

2 个答案:

答案 0 :(得分:1)

据我所知,没有办法获得前一个令牌(但我没有尝试过,我很久以前就使用过FSLex)。我猜你可以保留一个参数来指定最后处理过的令牌,然后用它来决定你找到“/”字符时要做什么。

无论如何,您是否可以发布一些您目前拥有的示例代码(例如,只是处理此问题的一部分)?如果我们看到一些示例代码(如果我可以尝试将其粘贴到我的Visual Studio中,看看我是否可以解决问题,那么回答你的问题会容易得多!)

吨。

答案 1 :(得分: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) }

一旦解析完成或者您可能处于不一致状态(因为最后一个标记是静态变量),还需要将标记重置为EOF。