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.