Formális nyelv

A HupWiki-ből...

Számításelméletben használt, jelsorozatok és képzési szabályok kapcsán emlegetett konstrukció. Egy nagyon rövid és felületes áttekintés:

Képzési szabály (production rule): egy jelsorozatnak egy másik jelsorozattal helyettesítését előíró szabály. Pl.: aSb --> aAbc. A nagybetűs szimbólumokat "nemterminális"-nak, a kisbetűseket "terminális"-nak nevezik (a kettő közti különbség: a terminálist már nem lehet további helyettesítésben lecserélni).
Nyelvtan (grammar): képzési szabályok összessége.
Mondat (sentence): képzési szabályok alapján generált, csak terminálisokból álló jelsorozat.
Nyelv (language): az összes lehetséges mondat összessége.

Ezeket a képzési szabályokat a szerkezetük bonyolultsága szerint négyféle osztályba szokták sorolni (ezek az ún, Chomsky-féle nyelvosztályok, Noam Chomsky nyelvész 1956-ban publikálta őket):

  • Chomsky 3-as osztály (reguláris): csak A --> Bc vagy A --> bC alakú szabályai lehetnek, az egész nyelvtanban egységesen.
  • Chomsky 2-es osztály (környezetfüggetlen (Context Free, CF)): A --> sABcd... alakú szabályok. A bal oldalon még mindig csak egy nemterminális lehet, a jobb oldalon azonban már nincs megkötés: terminálisok és nemterminálisok tetszőleges kombinációja állhat.
  • Chomsky 1-es osztály (környezetfüggő (Context Sensitive, CS)): sAcd --> sABcd... Az egyetlen megkötés, hogy a jobb oldalon a bal oldalinál hosszabb jelsorozatnak kell állnia.
  • Chomsky 0-ás osztály: nincs megkötés, bármit bármire enged helyettesíteni.

Ilyen szabályokat két irányban használhatunk: egy kezdeti jelből (az ún. "mondatszimbólumból" -- "sentence symbol") képzési szabályokkal le akarunk vezetni egy adott jelsorozatot; illetve fordítva, egy adott jelsorozatból visszafelé végzett összevonásokkal akarunk eljutni a mondatszimbólumba.

Mire is jó ez az egész: a második irányt csinálják a fordítóprogramok. Egy adott programszövegből építik fel visszafelé azt a képzési sorozatot (az ún. "értelmezési fát" -- "parse tree"), ami a program forráskódját generálja. Ezen a fán (optimalizáció céljából) végzett összevonások és átalakítások után az eredményt egy gépi kódú utasítássorozatként írják ki, ez a lefordított program.

A programozási nyelvek tehát a Chomsky 2-es osztályba tartoznak.

Nyilván kell, hogy a nyelvtan egyértelmű legyen, vagyis minden programszöveget csak egyféle értelmezési fával lehessen generálni.