Да би на неком рачунару написали, превели и извршили програм, неопходно је дефинисати шта су исправни програми и шта раде наредбе унутар тих програма. Лексика се бави описивањем основних градивних елемената програмских језика, а синтакса начинима за комбиновање тих основних елемената у исправне програме. Питањем значења програма бави се семантика програмских језика.
Лексика, синтакса и семантика изучавају се и за природне језике. Основни лексички елементи природних језика су речи, при чему се разликује неколико различитих врста речи, нпр. именице, глаголи, придеви…, где речи могу имати различите облике, нпр. падеже, времена…. Задатак лексичке анализе природног језика је да идентификује речи у реченици и сврста их у одговарајуће категорије. Програми су представљени низовима карактера. Појединачни карактери се групишу у недељиве целине које представљају основне лексичке елементе програма. На пример:
if (a < 1)
b = 2;
У овом кôду, разликују се: кључна реч if
, заграде (
и )
, оператори <
и =
, променљиве a
и b
, вредности 1
и 2
и интерпункција ;
. Лексиком програма бави се део компајлера који се назива лексички анализатор.
Синтакса одређује начине на које појединачне речи могу да креирају исправне реченице природних језика, односно, исправне програме у случају програмских језика. Синтакса дефинише релације између елемената програмског језика пружајући описе исправних програма. Синтакса се бави само формом и структуром програмског језика без разматрања значења. У литератури, синтакса програмског језика представља се одређеним метајезицима, синтаксним дијаграмима или бинарним стаблима. Синтаксом програма бави се део компајлера који се назива синтаксни анализатор.
Семантика придружује значења синтакно исправним елементима језика, односно, у случају програмских језика, за дати програм описује акције дефинисане тим програмом. За претходни пример може се придружити значење:
Ако је вредност променљиве a мања од 1,
онда променљивој b треба доделити вредност 2.
Неке семантичке коректности програма се могу проверити током превођења програма (статичка семантика), док се друге могу открити тек у фази извршавања програма (динамичка семантика).
Прагматика језика говори о изражајности језика и о односу различитих начина за исказивање истих ствари. Прагматика програмских језика бави се питањима попут лакоће програмирања, методологији програмирања, ефикасности у примени итд.
Представљање синтаксних конструкција језика
Синтаксне конструкције програмских језика обично представљамо метајезицима или синтаксним дијаграмима. Метајезик је дефинисан језик са скупом правила помоћу којег можемо дефинисати синтаксно правилне конструкције програмског језика. У доступној литератури, још од програмског језика Алгол (енгл. Algol – ALGOrithmic Language), најчешће коришћен метајезик за опис програмских језика зове се Бакус–Наурова форма (Бакусова нотација, Бакусова нормална форма или скраћено БНФ). Џон Бакус и Питер Наур су развили овај метајезик помоћу којег су, са коначним бројем реченица тј. металингвистичких фомула, могли да опишу синтаксна правила било ког програмској језика. Касније је БНФ проширена и названа ЕБНФ (енгл. Extended Backus-Naur form – EBNF) од стране творца програмског језика Паскал, Никлауса Вирта. Након проширења, EBNF је коришћена у неколико варијанти и коначно стандардизована 1996. године од стране Интернационалне организације за стандардизацију у стандарду ISO/IEC 14977.
Металингвистичка формула се састоји из леве и десне стране раздвојене универзалним метасимболом ::=
који се чита по дефиницији је:
<металингвистичка променљива>::=<металингвистички израз>
Металингвистичка променљива може бити реч или група речи које представљају називе синтаксних конструкција. Металингвистички израз се гради од металингвистичких променљивих и металингвистичких константи, уз коришћење симбола или |
. На пример:
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<слово> ::= _ | a | b | c | d | e | f | g | h | i | j | k | l | m
| n | o | p | q | r | s | t | u | v | w | x | y | z
| A | B | C | D | E | F | G | H | I | J | K | L | M
| N | O | P | Q | R | S | T | U | V | W | X | Y | Z
<индентификатор> :== <слово> | <индентификатор><слово> | <индентификатор><цифра>
<оператор-доделе> ::= = | *= | /= | %= | += | -= | <<= | >>= | &= | ^= | |=
<унарни-оператор> ::= & | * | + | - | ~ | !
Можете приметити у металингвистичкој формули идентификатора, да се <индентификатор> појављује и на левој и на десној страни, тј. да имамо случај рекурзивне металингвистичке формуле. Њу тумачимо на следећи начин: индетификатор може бити слово или идентификатор коме је придружено слово или идентификатор коме је придружен број, што значи да идентификатор може бити било који елемент из дефинисаног скупа слова, којем је придружен још један елемент из скупа слова или цифара, којем је придружен још један елемент из скупа слова или цифара, итд. На пример то може бити A11 или _x1y1 итд. а то не може бити 1x јер је први елемент цифра.
Синтаксне конструкције програмских језика представљене метајезиком у БНФ и ЕБНФ, могу се представити и графичким симболима синтаксних дијаграма. Синтаксни дијаграми су наравно знатно прегледнији него металингивстичке формуле. По форми личе на усмерене графове, а чворовима одговарају различити графички симболи у зависности од метасимбола којима су додељени. Разликујемо:
- нетерминале (металингвистичке променљиве), који се приказују у правоугаоницима у које се малим словима уписују њихови називи,
- терминале, који се приказују у круговима или овалима,
- и ланчање, које се постиже повезивањем чворова гранама оријентисаним у складу са смером.
На пример: