词法分析器中的优先顺序

Order of precedence in lexer

我正在为 Excel 公式编写词法分析器和解析器。

在Excel中,我们可以为单元格指定一个名称。例如,abc 是有效名称,而禁止将单元格命名为 B2,以免与单元格混淆 B2。因此,一旦我们遇到公式 =B2,我们就可以确定 B2 指的是单元格而不是用户定义的名称。

在我的 lexer_formula.mll 中,我定义了标识符:

let lex_cell = ['A' - 'Z']+ ['0' - '9']+ (* regular expressions to include all the cells *)
let lex_name = ['A' - 'Z' '0' - '9']+ (* regular expressions to include all the names *)

但是像 B2 这样的字符串同时匹配 lex_celllex_name,有谁知道我如何告诉词法分析器先考虑 lex_cell,然后 lex_name?在 rule token = parse 中的 lex_name 之前放置 lex_cell 是否足够?

根据ocamllex manual,先放lex_cell即可:

If several regular expressions match a prefix of the input, the “longest match” rule applies: the regular expression that matches the longest prefix of the input is selected. In case of tie, the regular expression that occurs earlier in the rule is selected.