Ao criar o DFA para o analisador léxico da minha linguagem de programação, cada caractere (por exemplo, n
, i
, f
) deve aparecer como um único nó compartilhado em todos os caminhos de token ou devo permitir nós duplicados para o mesmo caractere se eles aparecerem em caminhos diferentes (por exemplo, nós separados n
para int
, return
, e blank
)?
Quais são as compensações entre essas duas abordagens em termos de eficiência de implementação, clareza e correção?
insira a descrição da imagem aqui
Adicionei uma imagem para visualizar o que quis dizer.
Um nó em uma representação DFA corresponde a um estado . Se você quiser representar dois estados distintos, precisará de pelo menos dois nós distintos.
Então, quando sua língua tem as palavras
return
efunc
, e você leu até agoraret
, você está em um estado diferente do que se tivesse lidof
, mesmo que em ambos os estados você tenha uma transição para a letrau
. A questão é que, depois de ter processado isso,u
você ainda deve saber se estava no processo de completar a palavrareturn
oufunc
, caso contrário, você também aceitaria as palavrasfurn
eretunc
. Então, não, você não pode considerar esses dois estados como iguais.Perceba que um estado não se relaciona diretamente com o próximo caractere que você pode aceitar. É mais correto pensar nele como representando o que você já leu.
Então, no seu gráfico DFA, você poderia combinar os nós
i
ei3
em um nó, e então ter duas transições de saída de lá para prosseguir paraif
ouint
. Você já aplicou esse princípio para a letra iniciale
, mas poderia ter continuado fazendo isso para o subsequentel
(mergingl1
andl2
) es
(mergings1
ands2
), de modo que a divisão só ocorreria naquele último estado eme
(forelse
) ei
(forelsif
).