skip to Main Content

Pamiętnik parsera MATLABa cz.3

Post Series: Pamiętnik parsera MATLABa

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:

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.

Paweł Sołtysiak

Programista, domowy kucharz i "amator amerykańskiej polityki".
Zbieram informacje z całej sieci, po odrzuceniu chwastów i dodaniu swojej opinii publikuje na blogu.

Back To Top