Essa ferramenta foi feita em JavaScript. Utilizando a biblioteca fs
para manipular arquivos. As funções readJSONFile
e readCSVFile
lêem arquivos JSON e CSV para definir o autômato e os testes. runAutomaton
simula execução, seguindo transições até um estado final. A função principal, main
, processa entradas e valida argumentos. Os testes são medidos com process.hrtime()
. Resultados são registrados e escritos em CSV.
Em resumo, o simulador lê definições e entradas de autômatos, executa os autômatos nas entradas, registra os resultados e tempos de execução, e finalmente escreve esses resultados em um arquivo.
Como definido no próprio "arquivo_do_automato.aut" o estado inicial o estado final e as transições, ele faz o teste com os seguintes caracteres inseridos no "arquivo_de_testes.in":
- ba;1
- aaaabbbbbaaaaa;
- abababab;0
- bbbbbbbb;0
- aaaaaaaaaaaa;0
- aaaaabaaaaa;1
Assim, fornecendo no "arquivo_de_saida.out" as seguintes saídas:
- ba;1;1;0.091
- aaaabbbbbaaaaa;1;1;0.015
- abababab;0;0;0.006
- bbbbbbbb;0;0;0.018
- aaaaaaaaaaaa;0;0;0.009
- aaaaabaaaaa;1;1;0.005
Essa é uma ferramenta que diferentemente do autômato finito determinístico (AFD), que possui um único estado de destino para cada combinação de estado atual e entrada, o AFND pode ter múltiplos destinos para a mesma combinação. A ferramenta lê definições de autômatos em JSON e entradas de teste em CSV. A função runAutomaton utiliza conjuntos para rastrear os estados atuais e calcular os próximos estados possíveis com base nas transições. Essa abordagem permite lidar com múltiplos caminhos de execução. Assim como antes, a função principal coordena a execução, mede os tempos de execução e escreve os resultados em um arquivo CSV de saída. Em resumo, essa ferramenta é direcionada a AFNDs, trazendo mais expressividade, mas também maior complexidade em comparação com o simulador anterior para AFDs.
A função runAutomaton
usa conjuntos para rastrear estados atuais e calcular os próximos estados possíveis, considerando todas as transições relevantes para cada entrada. Isso permite lidar com múltiplos caminhos de execução simultaneamente. Ja na função principal, a main
, coordena as operações, verifica argumentos da linha de comando e utiliza as funções de leitura e execução para processar os arquivos. Ela mede os tempos de execução usando process.hrtime()
e registra os resultados, escrevendo-os em um arquivo CSV de saída.
Como também definido no "arquivo_do_automato.aut" o estado inicial o estado final e as transições, ele faz o teste com os seguintes caracteres inseridos no "arquivo_de_testes.in":
- aaaabbbb;1
- aaaaaaaaaaa;1
- aaaabb;1
- cccccccccccccc;0
- a;0
Sendo assim, fornecido no "arquivo_de_saida.out" as seguintes saídas:
- aaaabbbb;0;0;0.172
- aaaaaaaaaaa;1;1;0.218
- aaaabb;0;0;0.022
- cccccccccccccc;0;0;0.007
- a;0;0;0.003
O simulador geral lê qualquer tipo de autômato, tanto não deterministico, quanto determinístico, quanto com movimento vazio. Ela lê definições de autômatos a partir de arquivos JSON e entradas de teste de arquivos CSV, assim como os outros, mas a diferença notável neste código é a capacidade do autômato para transições vazias, onde ele pode se mover sem consumir entrada.
O funcionamento do código baseia-se na utilização de uma pilha para simular as transições do AFND, permitindo movimentos vazios. O movimento vazio é tratado dentro da lógica de filtragem das transições, fazendo com que o código verifique as transições para um determinado estado e caractere de entrada, incluindo a transições em que o caractere de leitura t.read
é igual ao caractere atual char
ou onde o caractere de leitura é vazio ''
. Esta condição é o ponto crucial que permite ao autômato realizar o movimento vazio.
Assim como também foi definido nas outras duas ferramentas o "arquivo_do_automato.aut" contendo o estado inicial o estado final e as transições, ele também faz o teste com os seguintes caracteres inseridos no "arquivo_de_testes.in":
- aaaabbbba;1
- aaaaaaaaaaa;1
- aaaabba;1
- cccccccccccccc;0
- aa;1
- aaaaabbb;0
Sendo assim, também fornecido no "arquivo_de_saida.out" as seguintes saídas:
- aaaabbbba;1;1;0.452
- aaaaaaaaaaa;1;1;0.066
- aaaabba;1;1;0.043
- cccccccccccccc;0;0;0.012
- aa;1;1;0.009
- aaaaabbb;0;0;0.042