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