F# fslex lexing javascript正则表达式
我正在尝试lex javascript正则表达式文本。它们以“/”开头,以“/”结尾(有时还有其他一些修饰语)。问题是确定它是否是正则表达式而不是除法运算符的唯一方法是读取“/”字符前面的标记 关于这一点,我们可以多读一点 事实上,我找不到任何关于如何获取上一个令牌的文档。希望这是可能的,有人能告诉我怎么做F# fslex lexing javascript正则表达式,f#,fsyacc,F#,Fsyacc,我正在尝试lex javascript正则表达式文本。它们以“/”开头,以“/”结尾(有时还有其他一些修饰语)。问题是确定它是否是正则表达式而不是除法运算符的唯一方法是读取“/”字符前面的标记 关于这一点,我们可以多读一点 事实上,我找不到任何关于如何获取上一个令牌的文档。希望这是可能的,有人能告诉我怎么做 谢谢。据我所知,没有办法获得之前的令牌(但我还没有尝试过,我很久以前就使用过FSLex)。我想您可以保留一个参数来指定最后处理的令牌,然后使用它来决定在找到“/”字符时要做什么 无论如何,您
谢谢。据我所知,没有办法获得之前的令牌(但我还没有尝试过,我很久以前就使用过FSLex)。我想您可以保留一个参数来指定最后处理的令牌,然后使用它来决定在找到“/”字符时要做什么 无论如何,您是否可以发布一些您当前拥有的示例代码(例如,只是处理此问题的一部分)?如果我们能看到一些示例代码(如果我能尝试将其粘贴到我的VisualStudio中,看看是否能找到一些解决方案),那么回答您的问题就会容易得多
T.为了解决这个问题,我创建了一个模块来跟踪最后一个令牌,并查看有效令牌列表,查看“/”运算符是除法运算符还是正则表达式 代码如下:
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设置最后一个标记并返回刚刚设置的标记,这只是为了减少对实际lexer代码的干扰
“/”字符的实际规则是:
| "/" { setToken (parseDivision lexbuf token regex) }
解析完成后,还需要将令牌重置为EOF,否则可能处于不一致状态(因为最后一个令牌是静态变量)
| "/" { setToken (parseDivision lexbuf token regex) }