Я хочу добавить поддержку структурированные ссылки с таблицами Excel на мой лексер и парсер формул 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
Удаление | lex_Column'
из let lex_structref
усложнило компиляцию.
Есть ли что-то, что я пишу неправильно, или это потому, что мой предыдущий лексер и парсер (который отлично работает) уже был большим, и добавление небольшого количества вещей взрывает его? Как я мог это диагностировать?
{n,m}
(если ваш инструмент поддерживает его), но его также можно написать вручную, просто повторив один и тот же подкомпонент несколько раз. Например:id | id "." id | id "." id "." id | id "." id "." id "." id
, которое можно было бы записать какid ( "." id ( "." id ("." id)?)?)?)?
, но в любом случае ожидается взрыв состояния. Бесконечное повторение производится операторами Клини*
или+
(или их эквивалентами) и не приводит к взрыву состояния. - person rici   schedule 14.08.2020