Zadanie #1387
Składnia całego pliku CCL w ANTLR-ze
Status: | Zamknięty | Start date: | 08 Apr 2011 | ||
---|---|---|---|---|---|
Priority: | Niski | Due date: | |||
Assignee: | Adam Radziszewski | % Done: | 80% | ||
Category: | - | ||||
Target version: | - |
Description
Przejrzyjcie propozycję składni, uwagi mile widziane. Składnię trzeba zaimplementować w gramatyce.
History
#1 Updated by Adam Radziszewski almost 12 years ago
- Priority changed from Normalny to Niski
#2 Updated by Adam Radziszewski almost 12 years ago
- Assignee changed from Paweł Kędzia to Adam Wardyński
W związku z obciążeniem Pawła (i w pewnym zakresie Tomka) opakowaniami pytonowymi przypisuję to zadanie Adamowi.
Bardziej precyzyjnie, chodzić będzie o:
1. Implementację samej składni w gramatyce.
2. Dodanie trzeciego argumentu (resources/lexicons) do wszystkich reguł składni wymagających tagsetu i variables.
3. Implementację operacji „import” — na etapie parsowania uruchamiane jest ładowanie leksykonu.
4. Dodanie do leksykonu operatora „lex”, który bierze zbiór stringów i nazwę leksykonu, zwraca zbiór stringów. Na etapie parsowania z przekazanego regule argumentu resources/lexicons powinien być wyciągnięty obiekt leksykonu znajdujący się pod podaną nazwą i przekazywany do konstruktora operatora lex.
#3 Updated by Adam Radziszewski almost 12 years ago
Prawdopodobnie trzeba będzie zmienić parser.cpp, by w tych pozostałych funkcjach (parsujących pojedyncze wyrażenia) tworzone było puste odwzorowanie nazwa->leksykon (odpowiednik resources/lexicons z reguł), bo tam i tak nie mamy możliwości przekazania leksykonu operatorom, a coś trzeba przekazać.
#4 Updated by Adam Wardyński almost 12 years ago
- Status changed from Nowy to Przypisany
Parsowanie składni całego pliku chciałbym umieścić całkowicie w gramatyce.
Teraz mamy parseAnyOperator poza gramatyką i robiona jest specjalna obsługa błędów w kodzie C++ wywołującymi reguły gramatyki jak parse_symset_operator, parse_strset_operator, aby pokazać, jakie błędy wyskakiwały, gdy była próba parsowania jako Function<TSet>, jakie przy próbie <Function<StrSet> > itd.
W składni całego pliku jest sekcja ANY_FUNC_OP no i właśnie parsowanie byłoby zaszyte głębiej w gramatyce, przez co byłby problem, że raportowany błąd byłby tylko z ostatniej alternatywy, czego staraliśmy się uniknąć (chyba?) pisząc parseAnyOperator w C++ a nie w grammar.g
Próbowałem trochę bawić się z obsługą błędów, ale tak jak mamy, ze składniowymi predykatami, to może się nie dać.
Generalnie o co mi chodzi: mimo tego, że przy parsowaniu całego pliku straci się raportowanie błędu ze wszystkich badanych alternatyw (TSet, StrSet, Bool... tylko ostatnia alternatywa będzie zgłaszała błąd) w sekcji ANY_FUNC_OP, jednak wolę ująć parsowanie całego pliku całkiem w gramatyce, a nie kodzie C++ na zewnątrz, gdyż tak jest szybciej/prościej coś zmienić
#5 Updated by Tomasz Śniatowski almost 12 years ago
Moim zdaniem brak raportowania prawdziwego błędu skutecznie upośledzi narzędzia do pracy ,,eksploracyjnej'' (wccl-run, wccl-features)
#6 Updated by Adam Radziszewski almost 12 years ago
Mi się wydaje, że to nie jest duży problem, o ile raportowane będą rzeczywiste błędy (choć nie wszystkie) — zawsze można sukcesywnie naprawiać raportowane błędy, aż zostaną wykryte wszystkie. Podobnie jak z g++ — tylko najstarsi górale potrafią od razu naprawić wszystkie błędy i po kolejnej kompilacji nie dostać ni warninga.
#7 Updated by Adam Wardyński almost 12 years ago
- Assignee changed from Adam Wardyński to Adam Radziszewski
- % Done changed from 0 to 70
Zrobiłem pierwszą wersję składni pliku, bez sekcji imports jeszcze.
Pozwoliłem sobie nieco zmienić składnię - operatory w nazwanej sekcji muszą kończyć się średnikami. Separator nie jest wprost ujety w definicji składni, ale podane przykłady mają przecinki. Jeśli pomysł się nie podoba, mogę napisać gramatykę tak, by jednak były przecinki. Dałem średniki po to, by w prosty sposób można było skorzystać z istniejących reguł parse_xxx_operator (pierwotnie oczekiwały EOF, więc nie można było z nich skorzystać; teraz oczekują EOF albo średnika, co pozwala na ich skorzystanie w XXX_operator_sequence, ale oczywiście to nie jest wielki problem napisać gramatykę tak, aby sekwencje miały operatory oddzielone jednak przecinkami i ostatni operator nie wymagał przecinka na koniec; nie mógłbym wtedy skorzystać z dotychczasowych parse_xxx_operator chyba żeby wyrzucić EOF, ale to nie problem zrobić kopie, które EOF nie wymagają, a obsługę przecinków dodać do XXX_operator_sequence). Średniki też wydają mi się lepiej rozdzielać osobne operatory.
No ale właśnie, jeśli ze średnikami pomysł się podoba, to może również dać go do sekcji rules? Oddzielając poszczególne reguły nie przecinkami, a średnikami.
Gramatyka pozwala tylko na jedną sekcję rules.
Dodałem parse_match_operator i takoweż sekcje w pliku. Co prawda same funkcje zwracające Match (Value type Match) nie mają wiele sensu poza apply, ale i tak mogą być przemycone poza apply poprzez predykaty (Function<Bool>). Dodałem je więc oficjalnie do poziomu korzenia gramatyki też, żeby w ramach debugowania jakiegoś nie trzeba było ich przemycać.
Na razie przepisuję tobie, Adamie R., w celu skomentowania, głównie kwestii średników. Bo to raczej powinno być spójne z sekcją rules, albo w obu miejscach średniki, albo przecinki, mnie się osobiście te średniki podobają, lepiej pozwolą wizualnie oddzielić osobne operatory, ale jak wolisz przecinki, to zmienię. Jak średniki są okay, to raczej powinny też być i w rules, gdzie też mogę zmienić, wliczając ewentualne pliki testowe, które obecnie mają przecinki.
Nadal jednak muszę dodać do gramatyki sekcję IMPORTS
#8 Updated by Adam Radziszewski almost 12 years ago
- % Done changed from 70 to 80
Składnia ze średnikami zatwierdzona. Uwzględniłem to w całej specyfikacji, którą swoją drogą przeredagowałem.
#9 Updated by Adam Radziszewski almost 12 years ago
- Status changed from Przypisany to Zamknięty
Wszystko gra :)