2011-10-19 19 views

Odpowiedz

14

Pozwolę sobie wyjaśnić: nie ma sposobu na wygenerowanie AST programu Scala z samym analizatorem składni. Jest absolutnie konieczne, aby uruchomić typer, a to oznacza wnioskowanie typu i implicits.

Po tym możesz zrobić, co chcesz. Ale te pierwsze kilka etapów kompilatora (cztery w najnowszych wersjach, liczenie typera) są konieczne.

Przypadkowo, to fazy prowadzone przez presentation compiler, który jest używany przez . Wydaje mi się, że może to być idealny interfejs dla ciebie.

ENSIME również uses it, który wydaje się być najlepszym źródłem informacji o nim, a może chcesz również przyjrzeć narzędzia Scala Refactoring, ponieważ używa AST kompilator, jak również.

Na koniec możesz spróbować skompilować kod za pomocą -Ybrowse:typer, aby zobaczyć drzewo po typerie. Użyj -Xshow-phases, aby wyświetlić istniejące fazy, lub -Xprint:typer, aby wydrukować "źródło" po typerie (lub dowolnej innej fazie).

+1

Myślę, że podstawowa odpowiedź jest myląca. Jeśli masz gramatykę, możesz wygenerować AST; w końcu gramatyki i drzewa (składniowe) są o czystej składni. Zgadzam się, często potrzebujesz informacji o typie, aby z pożytkiem interpretować AST. (Nie mam zastrzeżeń do twoich wskazówek do użytecznych maszyn). –

+1

@Ira Przyjmuje, że język może być _parsed_ z gramatyką. Perl, na przykład, [nie może] (http://www.perlmonks.org/?node_id=663393). W Scali, jury nadal nie działa - niektórzy próbowali zbudować parser na podstawie specyfikacji EBNF, ale przekonali się, że nie działa. Może Scala może być analizowana z gramatyki, ale w praktyce, takie parsowanie byłoby bezużyteczne bez typera, ponieważ część kodu źródłowego jest dostarczana pośrednio przez tę fazę. –

+0

Ta sama historia została również opowiedziana o C++. To jest złe. Prawdą jest, że niektóre z pism mogą być niejednoznaczne lokalnie. Mogą być nawet bardzo niejednoznaczni, lokalnie. Przeważnie oznacza to, że technologia parsowania, której używają ludzie (LL (k) i LALR (1)) jest dość kiepska. To nie znaczy, że właściwa technologia analizowania jest kiepska. Zobacz parsowanie GLR, które obsługuje takie niejednoznaczne cechy. W ten sposób parsujemy C++, pomimo twierdzeń ludowych o tym, że jest "twardy". Pracujemy nad parserem Perla, ale z jego tyłu. Mam kłopot z przekonaniem, że Scala jest tak nieprzyjemna jak Perl. –