Pamiętnik parsera MATLABa cz.3
Przygotowanie do pisania gramatyki
Pierwszą rzeczą jaką należy zrobić podczas pisania gramatyki dla jakiegoś języka jest sprawdzenie czy ktoś takiej gramatyki nie napisał.
Repozytorium: https://github.com/antlr/grammars-v4. Posiada kilkanaście gramatyk dla różnych języków.
Czy jest dla MATLABa? Nie ma.
Czy jest dla języka Octave [1]? Nie ma.
Który z dostępnych języków przypomina MATLABa? Lua.
Lua to język skryptowy wykorzystywany przez twórców gier komputerowych np. do programowania sztucznej inteligencji.
Warto z takich „gotowców” brać garściami, zawsze przydatne rzeczy to:
- Definicja identyfikatora (czyli że np. nazwy zmiennych i funkcji składają się liter i liczb, ale mogą zaczynać od liczby)
- Definicja liczby (liczba całkowita, zmiennoprzecinkowa, liczby w zapisie szesnastkowym)
- Obsługa komentarzy
- Obsługa białych znaków
[1] Octave –Taki opensourcowy MATLAB
Gramatyka
Spójrzmy na taki kod:
function [out1,out2] = humps(x) end
Dla osób, które MATLABa na oczy nie widziały, już tłumaczę. Jest to definicja funkcji o nazwie humps, która przy wywołaniu przyjmuje 1 argument i zwraca dwie zmienne out1 i out2. Ciało funkcji zostało pomięte, ponieważ nie będziemy parsowali ciała funkcji w tym odcinku.
Gramatyka, która radzi sobie z taką składnią wygląda mniej więcej tak:
[code]
program
: block EOF
;
block
: statement*
;
statement
: 'function’ function_return_parameters '=’ function_name function_parameters block 'end’
function_return_parameters
: '[’ parameters_list ’]’
;
function_name
: NAME
;
function_parameters
: '(’ parameters_list ’)’
;
parameters_list
: NAME? (’,’ NAME)*
;
[/code]
program – punkt startowy dla naszej gramatyki składa się z pojedynczego bloku, za nim znajduje się EOF, czyli End of file – koniec pliku, koniec danych.
block – w naszej gramatyce składa się block składa się z 0 lub wielu instrukcji. ANTLR do opisu swojej gramatyki wykorzystuje symbole z wyrażeń regularnych. Warto jest znać wyrażenia regularne, jakkolwiek dziwne i niezrozumiałe potrafią być.
statement – definicja, co rozpoznajemy, jako instrukcję, na razie mamy tylko jedną, do niej dojdą kolejne rozgałęzienia, kiedy nasza gramatyka stanie się bardziej kompletna.
function declaration statement – Tutaj definiujemy jak deklaracja funkcji wygląda w MATLABie, każda definicja funkcji zaczyna się od słowa kluczowego ’function’. ANTLR pozwala na definicję słów kluczowych osobno i następnie odwoływać się poprzez nazwę lub w sposób inline. ja korzystam z tego drugiego rozwiązania.
parameters_list -
Trzeba zadbać, że lista parametrów składa od zera do wielu, ale każda nazwa rozdzielona jest przecinkiem. Znowu przykład, wykorzystania symboliki z wyrażeń regularnych w tworzeniu gramatyki. Znak ’?’ oznacza opcjonalność takiego wyrażenia (może wystąpić, ale nie musi), następnie nawiasy są wykorzystane do grupowania wyrażeń i nakładaniu na nich pewnej „wymagań”. (',' NAME)*
przecinek i nazwa muszą się jednocześnie wystąpić do spełniania tej części gramatyki.
Dalej…
W kolejnym odcinku pokarzę jak wykorzystać tą gramatykę do budowy struktury INode omawianej w pierwszym odcinku.