我有一个词法分析器和解析器,用 OCaml 中的 sedlex 和 menhir 构建,用于解析电子表格公式。
词法分析器的以下部分在引用之前定义了路径+工作簿+工作表部分的正则表达式。例如,'C:\Users\Pictures\[Book1.xlsx]Sheet1'!
的='C:\Users\Pictures\[Book1.xlsx]Sheet1'!A1:B2
。
let first_Latin_identifier_character = [%sedlex.regexp? ('a'..'z') | ('A'..'Z') ]
let path_identifier_character = [%sedlex.regexp? first_Latin_identifier_character | decimal_digit | '_' | '-' | ':' | '\x5C' (* \ *) | ' ' | '&' | '@']
let file_identifier_character = [%sedlex.regexp? first_Latin_identifier_character | decimal_digit | '_' | '-' | ' ' | '.']
let file_suffix = [%sedlex.regexp? ".xls" | ".xlsm" | ".xlsx" | ".XLS" | ".XLSM" | ".XLSX" | ".xlsb" | ".XLSB"]
let sheet_identifier_character_in_quote = [%sedlex.regexp? Compl ('\x3A' | '\x5C' | '\x2F' | '\x3F' | '\x2A' | '\x5B' | '\x5D' | '\x27')]
let sheet_identifier_character_out_quote = [%sedlex.regexp? Compl ('\x3A' | '\x5C' | '\x2F' | '\x3F' | '\x2A' | '\x27' | '\x28' | '\x29' | '\x2B' | '\x2D' | '\x2F' | '\x2C' |'\x3D' | '\x3E' | '\x3C' | '\x3b')]
let lex_file = [%sedlex.regexp? (Star path_identifier_character), '[', (Plus file_identifier_character), file_suffix, ']']
let lex_file_wo_brackets = [%sedlex.regexp? (Star path_identifier_character), (Plus file_identifier_character), file_suffix]
let lex_sheet_in_quote = [%sedlex.regexp? Plus sheet_identifier_character_in_quote]
let lex_file_sheet_in_quote = [%sedlex.regexp? lex_file, lex_sheet_in_quote]
let lex_before = [%sedlex.regexp?
("'", lex_file_sheet_in_quote, "'!") |
("'", lex_sheet_in_quote, "'!") |
(lex_sheet_out_quote, '!') |
(lex_file, "!") |
(lex_file_wo_brackets, "!") |
("'", lex_file, "'!") |
("'", lex_file_wo_brackets, "'!")]
没有最后4个lex_before
(即(lex_file, "!") | (lex_file_wo_brackets, "!") | ("'", lex_file, "'!") | ("'", lex_file_wo_brackets, "'!")
),项目编译(by)的总时间ocamlc
是3分30秒(耗时是编译的lexer.ml
)。加上这 4 个案例,编译的总时间是 13 分 40 秒。需要时间的总是编译lexer.ml
。
有谁知道我们如何确定是什么减慢了编译速度?
我编写命名正则表达式的方式有什么问题会减慢编译速度吗?