2015-12-01 7 views
9

Uwaga: Znalazłem to pytanie w narzędziu do śledzenia problemów Babel (https://phabricator.babeljs.io/T2653) i zostało ono odrzucone, ale autor AFAIK go o to nie poprosił.Babel v6: Jak/Czy mogę napisać wtyczkę, która dodaje nową składnię (np. Nowy operator)?

Sprawdziłem wtyczek Babel jak packages/babel-plugin-syntax-do-expressions i wydawało się, że te ES6 + nowa składnia/operatorzy nie zostały właściwie zdefiniowane w plugin w ogóle, ale jest implemented in Babylon i po prostu bycie toggled on przez tych wtyczek.

Zostawiając roszczenie w numerze newest blog post: "Deweloperzy zbudowali wszystko, od debugowania narzędzi [...] do eksperymentalnych nowych składni [...] w celu wymuszenia skomplikowanych reguł w ich bazach kodowych" wątpliwe - w rzeczywistości przeszukałem cały ekosystem pluginów, ale nie znalazł wtyczki, która mogłaby zaoferować nowe operatory/składnię, i tylko jedną wtyczkę, która jest w stanie zaoferować operatorowi przeładowanie dla kilku istniejących operatorów.

Czy to prawda, że ​​dzięki Babel v6 będziemy mogli zobaczyć nowe operatory/składnię zdefiniowaną w przestrzeni użytkownika i jak?

To także moja okazja, aby podziękować całemu zespołowi Babel za dobrą pracę!

PS: Zacząłem szukać, jak rozszerzyć składnię parsera Babylon, aby zaimplementować wtyczkę, która implementowałaby "dopasowywanie wzorców", jak w przypadku Julia methods.

+0

Mam to samo pytanie, ale udało mi się uzyskać wtyczkę składni działającą bez hakowania żadnych podstawowych plików. Jest to wtyczka dla [DCI] (http://fulloo.info/) i wciąż jest rozwijana, ale [TransferMoney.js] (https://github.com/mbrowne/babel-dci/blob/master/babel- Plik przykładowy plugin-transform-dci/examples/TransferMoney/TransferMoney.js) analizuje poprawnie: https://github.com/mbrowne/babel-dci. Sposób, w jaki zaimportowałem bibliotekę 'babylon', wydaje się jednak kruchy; mam nadzieję, że jest lepszy/bardziej oficjalny sposób na zrobienie tego. Prawdopodobnie skontaktuję się ze społecznością Slack ... –

+0

Pamiętaj, że aby to zadziałało, musisz pobrać instancję 'babylon' używaną przez aktualnie załadowany analizator składni ... więc nie możesz po prostu zrobić 'npm install babylon' wewnątrz folderu wtyczki - to ładowałoby oddzielną kopię babilonu. Dlatego zaimportowałem go jako 'babel-cli/node_modules/babel-core/node_modules/babylon/...'. –

+0

Pamiętaj, że zespół Babel nie udostępnił jeszcze interfejsu API wtyczki dla parsera, więc wszystko to i tak może ulec zmianie. Jestem pewien, że będzie lepszy sposób na pisanie wtyczek parsera w przyszłości. –

Odpowiedz

0

Wtyczka dodaje nowy operator (**). Wygląda na to, że powinieneś zacząć od swojego kodu (to całkiem proste), aby zbudować swój własny, inny operator.

+1

'**' nie jest nowym operatorem. Jest to poprawny typ ['BinaryExpression'] (https://github.com/babel/babel/tree/master/packages/babel-types#binaryexpression). Wspiera go Babilon. – Gajus

+0

Operator "potęgowania" został wprowadzony w ES7. Z MDN: "To jest eksperymentalna technologia, część propozycji ECMAScript 2016 (ES7)." (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Exponentiation_(**)). Oczywiście, to, co Babel robi, to sprawa Babel, ale dlaczego ta wtyczka istniałaby nawet, gdyby '**' było obsługiwane w bazie Babel? – machineghost

+2

Niestety, moje frazowanie jest błędne. Jeśli chodzi o "nie nowego operatora", miałem na myśli - to operator, który obsługuje Babylon, a nie nowy operator, który dodaje wtyczka. "ale dlaczego", ponieważ Babilon jest parserem, a Babel jest transpilerem. Wtyczki Babel są transpilatorami. – Gajus

0

Jako opcja z Babel v6.18.0, parserOpts, można przekazać konfigurację do analizatora składni, tj. Do Babylon.

Babylon akceptuje opcje plugins, za pomocą których można określić listę nazw wtyczek, które należy włączyć. W chwili pisania tego tekstu można odwołać się tylko do jednego z plugins built into Babylon.

Było wiele sugestii, aby zezwolić na zewnętrzne wtyczki, np.

Konsensus jest ~

Byliśmy przeciwko idei pozwalając zewnętrznych rozszerzeń do Babilonu w przeszłości. Byłoby znacznie trudniej wspierać niestandardowe przetwarzanie, niż wspierać niestandardowe transformacje. Babel ma już wiele do zaoferowania, więc nie chcieliśmy tego otwierać.

- https://github.com/babel/babylon/pull/5#issuecomment-195801336

Aby włączyć niestandardowy analizowania, trzeba:

1

Jakiś czas temu zbudowałem cienka owijka wokół Babel v6 włączyć "Zaawansowane" wtyczek (tzn wtyczki, które dodać nową składnię):

https://github.com/lukehorvat/babby

Babby jest czysto eksperyment, a nie coś, co powinno się naprawdę wykorzystać. Ale pokazuje minimalne zmiany, które należy wprowadzić do Babel/Babilonu, aby wspierać rodzaje wtyczek, o których mówi OP.

Powiązane problemy