Jest to część serii pytań, które koncentrują się na siostrzanym projekcie Abstraction Project, którego celem jest wyodrębnienie pojęć używanych w projektowaniu języka w formie ram. Projekt siostrzany nazywa się OILexer, który ma na celu skonstruowanie analizatora składni z plików gramatycznych, bez użycia wstrzykiwania kodu do dopasowań.
Niektóre inne strony związane z tymi pytaniami, związane z typowaniem strukturalnym, można wyświetlić tutaj , a łatwość użycia - tutaj . Meta-temat związany z zapytaniem dotyczącym frameworka i odpowiedniego miejsca do opublikowania można znaleźć tutaj .
Przechodzę do punktu, w którym zaczynam rozpakowywać drzewo parsowania z danej gramatyki, a następnie parser Recursive Descent, który używa DFA do rozpoznawania ścieżek do przodu (podobnie do LL (*) ANTLR 4), więc ja pomyślałem, że otworzę to, aby uzyskać wgląd.
Jakie funkcje są idealne w kompilatorze analizatora składni?
Jak na razie tutaj jest krótki przegląd tego, co zostało wdrożone:
- Szablony
- Spójrz w przyszłość, wiedząc, co jest ważne w danym momencie.
- Reguła „Deliteralizacja” bierze literały w ramach reguł i ustala, z którego tokena pochodzą.
- Niedeterministyczne automaty
- Automaty deterministyczne
- Prosta leksykalna maszyna stanów do rozpoznawania tokenów
- Metody automatyzacji tokenów:
- Skanowanie - przydatne w przypadku komentarzy: Komentarz: = "/ *" Skanowanie („* /”);
- Odejmij - przydatne dla identyfikatorów: Identyfikator: = Odejmij (IdentifierBody, Słowa kluczowe);
- Zapewnia, że identyfikator nie akceptuje słów kluczowych.
- Kodowanie - koduje automatyzację jako liczbę serii X podstawowych przejść N.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
- Powoduje, że Unicode ucieka w systemie szesnastkowym, z 4 przejściami szesnastkowymi. Różnica między tym a: [0-9A-Fa-f] {4} to wynikowa automatyzacja z Encode ogranicza dozwolony zestaw wartości szesnastkowych do zakresu IdentifierCharNoEscape. Więc jeśli podasz go, wersja kodująca nie zaakceptuje wartości. Takie rzeczy mają poważne zastrzeżenie: używaj oszczędnie. Powstała automatyzacja może być dość złożona.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
To, co nie jest zaimplementowane, to generowanie CST, muszę dostosować deterministyczne automatyzacje, aby przenieść odpowiedni kontekst, aby to zadziałało.
Dla wszystkich zainteresowanych przesłałem dość wydrukowaną oryginalną formę projektu T * y♯ . Każdy plik powinien zawierać link do każdego innego pliku, zacząłem linkować w poszczególnych regułach, aby ich przestrzegać, ale zajęłoby to zbyt długo (łatwiej byłoby zautomatyzować!)
Jeśli potrzebujesz więcej kontekstu, opublikuj odpowiednio.
Edytuj 5-14-2013 : Napisałem kod do tworzenia wykresów GraphViz dla automatów stanów w danym języku. Oto wykres GraphViz z AssemblyPart . Członkowie powiązani w opisie języka powinni mieć nazwę pliku nazwa_pliku.txt w swoim folderze względnym z wykresem dla tej reguły. Część opisu języka zmieniła się od czasu opublikowania przykładu, wynika to z uproszczenia gramatyki. Oto interesujący obraz graphviz .