Transitiontable溢出,自动机太大

Transition table overflow, automaton is too big

我想将 structured references with Excel tables 的支持添加到我的 Excel 公式的词法分析器和解析器中。

我在 lexer_structref.mll 中添加了以下正则表达式:

let lex_table_name = "DeptSales"
let lex_column_header = "Sales Amount"

(* EG: =[Sales Amount] *)
let lex_ColumnWOTable = "[" lex_column_header "]"

(* EG: =[Region]:[% Commission] *)
let lex_RangeWOTable = lex_ColumnWOTable ":" lex_ColumnWOTable

(* EG: =DeptSales[Sales Amount] *)
let lex_Column' = lex_table_name lex_ColumnWOTable

let lex_structref = lex_ColumnWOTable | lex_RangeWOTable | lex_Column'

lexer_e.mll中,我添加了标识符如下。 parser_e.mly 将调用 Parser_structref.mly 来解析结构化引用。

| lex_structref as r           { STRUCTREF r }

但是,编译整个程序时出现以下错误:

741 states, 34313 transitions, table size 141698 bytes
File "frontend/gen/lexer_e.mll":
transition table overflow, automaton is too big
make: *** [frontend/gen/lexer_e.ml] Error 3

let lex_structref 中删除 | lex_Column' 进行了编译。

有没有我写错的地方,或者是因为我以前的词法分析器和解析器(工作正常)已经很大并且添加一些东西会爆炸吗?我该如何诊断?

除了有助于优化词法分析器的注释之外,还有一个解决方法:ocamllex -ml 不限制状态、转换的数量,table 大小。在没有其他选择的情况下使用它。