过渡表溢出,自动机太大

问题描述

我想在我的Excel公式的词法分析器中添加structured references with Excel tables支持

我向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

| lex_Column'删除let lex_structref使编译工作完成。

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

解决方法

除了有助于优化词法分析器的注释之外,还有一种解决方法:ocamllex -ml不限制状态数,转换数和表大小。在没有其他选择时使用。