Chcę przekonwertować wprowadzone przez użytkownika wyrażenie regularne na NFA, aby móc następnie uruchomić NFA dla łańcucha w celu dopasowania. Jakiej minimalnej maszyny można użyć do parsowania wyrażeń regularnych?
Zakładam, że musi to być automat push, ponieważ obecność nawiasów oznacza konieczność liczenia, a DFA / NFA nie może wykonać dowolnego liczenia. Czy to założenie jest prawidłowe? Na przykład wyrażenie a (bc *) d wymaga PDA, aby podwyrażenie w nawiasach było obsługiwane poprawnie.
Odpowiedzi:
Masz rację. Łatwo jest wykazać, że składnia wyrażeń regularnych nie jest regularna przy użyciu standardowych technik .
Jedną z możliwości jest użycie homomorfizmu (przed którym jest zamknięty), aby pozbyć się wszystkich symboli oprócz nawiasów, co pozostawia język Dyck, o którym wiadomo, że jest nieregularny. W razie wątpliwości użyj lematu Pompowanie na .REG (p)p
To powiedziawszy, prawdopodobnie nie chcesz ręcznie kodować PDA. Rozważ użycie generatora analizatora składni, takiego jak ANTLR lub byacc . Z drugiej strony, jeśli chcesz zbadać parsowanie języków przez samodzielne programowanie parserów, powinieneś przejść do innych podstawowych algorytmów parsowania, takich jak CYK , Earley , zejście rekurencyjne i LR .
źródło
Proponuję również przeczytać przyjemną odpowiedź Jukki na pytanie „ Dopasowywanie wyrażeń regularnych za pomocą wyrażeń regularnych ” również w cstheory. Fragment:
To tylko link do interesującego (według mnie) „innego spojrzenia” na język wyrażeń regularnych; jak podkreślono w komentarzach poniżej, nie jest to przydatne do budowania drzewa składni. Jeśli chcesz ręcznie kodować swój parser, zasugeruję ci ten prosty artykuł na temat projektu kodowego „ Pisanie własnego parsera wyrażeń regularnych ”.
źródło