Najlepszy / najszybszy sposób zapisu parsera w c#

Jaki jest najlepszy sposób na zbudowanie parsera w c# do analizy własnego języka? Idealnie chciałbym dostarczyć gramatykę i uzyskać abstrakcyjne drzewa składni jako wynik. Wielkie dzięki, Nestor

Author: lillq, 2009-10-01

7 answers

Miałem dobre doświadczenie z ANTLR v3 . Zdecydowanie największą korzyścią jest to, że pozwala pisać parsery LL (*) z nieskończonym wyglądem - mogą być one dość nieoptymalne, ale gramatyka może być napisana w najprostszy i naturalny sposób, bez konieczności refaktorowania, aby obejść ograniczenia parsera, a wydajność parsera często nie jest wielka (mam nadzieję, że nie piszesz kompilatora C++), szczególnie w projektach edukacyjnych.

Zapewnia również całkiem dobre środki konstruowanie znaczącego ASTs bez konieczności pisania żadnego kodu - dla każdej produkcji gramatycznej wskazuje się" kluczowy " token lub podprodukcję, a ten staje się węzłem drzewa. Albo możesz napisać produkcję drzewa.

Spójrz na następujące gramatyki ANTLR (wymienione tutaj w kolejności rosnącej złożoności), aby dowiedzieć się, jak wygląda i czuje

 18
Author: Pavel Minaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 19:46:59

Grałem w wtih ironia . Wygląda prosto i użytecznie.

 11
Author: Ball,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 19:43:50

Możesz przestudiować kod źródłowy kompilatora Mono C # .

 1
Author: Robert Harvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 19:30:32

Choć jest jeszcze we wczesnej wersji beta, Oslo język modelowania i narzędzia Mgrammar od Microsoftu są obiecujące.

 1
Author: Mike Two,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 19:39:27

Rzuciłbym też okiem na SableCC . Bardzo łatwo jest stworzyć EBNF grammer. Tutaj {[2] } jest prosty przykład kalkulatora C#.

 1
Author: SwDevMan81,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 19:52:16

Jest tu krótki artykuł na temat konstruowania parsera LL(1), Oczywiście możesz też użyć generatora.

 1
Author: L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-22 02:16:39

Lex i yacc są nadal moimi ulubieńcami. Niejasne, jeśli dopiero zaczynasz, ale niezwykle proste, szybkie i łatwe, gdy już opanujesz żargon.

Możesz zrobić, co chcesz; generować kod C#, budować inne gramatyki, emulować instrukcje, cokolwiek.

Nie jest ładny, jest to format tekstowy i LL1, więc twoja składnia musi to zaakceptować.

Na plus, to jest wszędzie. Są o tym świetne książki O ' Reilly, dużo przykładowego kodu, dużo gotowych gramatyki i wiele bibliotek języka ojczystego.

 0
Author: davenpcj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-02 15:42:18