词法分析器中的优先顺序
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_cell
和 lex_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.
我正在为 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_cell
和 lex_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.