Выполняет ли flex или lex минимизацию DFA?
Если да, то у меня есть следующие вопросы:
какой алгоритм используется?
скажем, у нас есть спецификация, как показано ниже
%{
#include <stdio.h>
%}
%%
a printf("a\n");
b printf("b\n");
%%
Это соответствует регулярному выражению a|b
, и конструкция DFA может привести к DFA с 3 состояниями, которые анализируют это выражение (в формате JSON):
{states: [0, 1, 2],
moves: [
{from: 0, char: 'a', to: 1},
{from: 0, char: 'b', to: 2}
],
start: 0,
final: [1, 2]
}
Хотя этот DFA работает хорошо и для каждого принимающего состояния он правильно вызывает необходимое действие, алгоритм Хопкрофта для минимизации DFA объединит два принимающих состояния в одно, что приведет к DFA с двумя состояниями. Это может быть проблемой, потому что тогда мы не будем знать, какое действие вызывать в принимающем состоянии. Как с этим справляются flex или lex?