2011-02-01 8 views
8

Czy są jakieś narzędzia do konwersji składni gramatyki ANTLR na i od innych składni BNF? Istnieje kilka form postaci Backus-Naur (BNF, EBNF, ABNF, W3C-BNF, XBNF ...) ze specyfikacją, np. see this list. Składnia gramatyki ANTLR wydaje się być tylko described by examples. Wiem, że pliki gramatyki ANTLR zawierają więcej niż specyfikację składni bezkontekstowej, ale powinieneś być w stanie przekonwertować przynajmniej wspólny podzbiór - czy ktoś jeszcze zrobił to automatycznie?Czy istnieją narzędzia do konwersji między ANTLR a innymi formami BNF?

Odpowiedz

2

Jakob napisał:

Składnia gramatyki ANTLR tylko wydaje się być opisany za pomocą przykładów.

ANTLR (v3) jest napisane "w jego własnych słów" (jak sam Terence Parr umieścić go) w tej gramatyce:

http://www.antlr.org/grammar/ANTLR/ANTLRv3.g


Jakob napisał:

ale powinieneś być w stanie przekonwertować przynajmniej c ommon podzbiór - czy ktoś zrobił jeszcze automatycznie?

Nie to, co wiem. A jeśli to istnieje, nigdy nie widziałem tego narzędzia omawianego na liście mailingowej ANTLR, którą czytam regularnie.

Należy również zauważyć, że wiele wariantów BNF zezwala na reguły left-recursive, coś, z czym generator parowania LL taki jak ANTLR nie może sobie poradzić. Lewe reguły rekursywne mogą oczywiście zostać ponownie przeanalizowane przez narzędzie, ale może to być raczej trudne i prawdopodobnie spowoduje, że gramatyka "czytelna" będzie znacznie mniejsza niż ta, którą można uzyskać, niż robi to ręcznie.

Jeśli chodzi o przekształcanie gramatyk ANTLR w formę podobną do BNF, to byłoby to łatwiejsze, ale tylko z najbardziej trywialnymi gramatykami. Gdy tylko różne typy predykatów zostaną wprowadzone do gramatyki ANTLR, konwersja może ponownie stać się trudna.

+0

Dzięki temu gramatyka ANTLR napisana w ANTLR była jedną rzeczą, której szukałem. O ile rozumiem ANTLR, możesz * zapisać * gramatyki lewostronne, ale musisz je potem ręcznie skorygować. Konwerter z innych form BNF i ANTLR przynajmniej zmniejszyłby potrzebę ręcznego przyjmowania różnic w punktacji i innych pomniejszych aspektach wariantów składni BNF. – Jakob

+0

Wygląda na to, że ANTLR nie radzi sobie ze znakami Unicode powyżej Podstawowej płaszczyzny wielojęzycznej: ESC: "\\" (... | 'u' XDIGIT XDIGIT XDIGIT XDIGIT) nie może dopasować współrzędnych powyżej \ uFFFF. – Jakob

+0

@Jakob, popraw, obsługiwanym zakresem jest '\ u0000'..' \ uFFFF'. –

5
# Grammar Syntax 

|        | BNF       | ISO EBNF      | ABNF       | ANTLR       | 
|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:| 
| rule definition    | `<name> ::= ...`    | `name = ... ;`    | `name = ...`     | `name : ... ;`    | 
| terminal items    | `...`       | `'...'` or `"..."`   | integer or `"..."`   | `'...'`      | 
| non-terminal items   | `<...>`      | `...`       | `...` or `<...>`    | `...`       | 
| concatenation     | (space)      | `,`       | (space)      | (space)      | 
| choice      | `|`       | `|`       | `/`       | `|`       | 
| optional      | requires choice syntax[^1] | `[...]`      | `*1...` or `[...]`   | `...?`      | 
| 0 or more repititions   | requires choice syntax[^2] | `{...}`      | `*...`      | `...*`      | 
| 1 or more repititions   | requires choice syntax[^3] | `{...}-`      | `1*...`      | `...+`      | 
| n repititions     |        | `n*...`      | `n*n...`      |        | 
| n to m repititions   |        |        | `n*m...`      |        | 
| grouping      |        | `(...)`      | `(...)`      | `(...)`      | 
| comment      |        | `(*...*)`      | `;...`      | `// ...` or `/* ... */`  | 


[^1]: `optionalb ::= a b c d | a c d` 

[^2]: `list ::= | listitem list` 

[^3]: `list ::= listitem | listitem list` 
+0

Proszę, popraw mnie, jeśli się mylę. Jestem nowy w tym.^_^b – Travis

+0

Tak, możesz mapować między różnymi składniami przynajmniej dla prostych gramatyk. Szukałem narzędzia, które wykonuje tę konwersję (BNF, ISO EBNF, ABNF, ANTLR ...). Oczywiście możliwe jest stworzenie własnego narzędzia ;-) – Jakob

Powiązane problemy