﻿/************************* Pagrindas *************************/
<programa>          	::=     'MIAU' [ <pagrindinisBlokas> ] 'MIAU.'
<pagrindinisBlokas> 		::=     'MAIN' <blokas> { <funkcija> }  
<blokas>             	::=     '{' <sakiniai> '}' | 

/************************* Funkcijos *************************/
<funkcija>          	::=     <returnTipas> <funkcijosPavadinimas> '(' [ <funkcijosParametrai> ] ')' <blokas>
<funkcijosParametrai>	::=     <parametras> { ',' <parametras> }
<parametras>          ::=     <tipas> <kintamasis>

/************************* Sakiniai *************************/

<sakiniai> 			::=  {< sakinysValdymo> | <sakiniaiKiti> '+' } 

<sakiniaiKiti>        	::=  <sakinysPaprastas> | <sakinysFunkcijosKvietimo> | <sakinysReturn>

<sakinysPaprastas>     	::=     <sakinysKintamojoApibrezimas> | <sakinysPriskyrimo> | <sakinysIO>
<sakinysKintamojoApibrezimas> ::=     <tipas> <kintamujuSeka>  [ ':' <reiskinys> ]
<sakinysPriskyrimo>    		::=     <kintamasis> '=' <reiskinys>
<sakinysIO>            	::=     <sakinysRasymo> | <sakinysSkaitymo>
<sakinysSkaitymo>      	::=     'in' <kintamasis>
<sakinysRasymo>          ::=     'out' <reiskinys>

<sakinysValdymo>          ::=     <ciklasFor> | <ciklasWhile> | <sakinysIf>
<ciklasFor>           		::=     'for' <reiskinys> | 'to' <reiskinys> 'step' <reiskinys> <blokas>
<ciklasWhile>         		::=     'while' <reiskinys> <blokas>
<ciklasEach>   	        ::=     'foreach' <kintamasisPaprastas> 'in' <kintamujuSeka>  <block>
<sakinysIf>            	::=     'if' <reiskinys> <blokas> [ 'else' ( <blokas> | <sakinysIf> ) ] 


<sakinysFunkcijosKvietimo>     ::=     <funkcijosPavadinimas> [ <funkcijosKvietimoParametrai> ]
<funkcijosKvietimoParametrai>   ::=     '(' <reiskinys> { ',' <reiskinys> } ')'

<sakinysReturn>         	::=     'return' [ <reiskinys> ]

/************************* Reiškiniai *************************/

/*
 EBNF <reiskinys>        	::=     <reiskinys2> { <operatoriaiLoginiai> <reiskinys> }
 BNF <reiskinys>        	::=     <reiskinys2> <operatoriaiLoginiai> <reiskinys> | <reiskinys2> 
 
 EBNF <reiskinys>        	::=     <reiskinys2> [ <operatoriaiLoginiai> <reiskinys> ]
 BNF <reiskinys>        	::=     <reiskinys2> <operatoriaiLoginiai> <reiskinys> |  <reiskinys2>
*/

<reiskinys>        	::=     <reiskinys2> 
 <operatoriaiLoginiai>  <reiskinys> ]  /* riestiniai pakeisti į laužtinius*/
<reiskinys2>       	::=     <reiskinys3> [ <operatoriaiLyginimo> <reiskinys2> ] /* riestiniai pakeisti į laužtinius*/
<reiskinys3>       	::=     <termas>   [ <operatoriaiSumos>  <reiskinys3> ] /* riestiniai pakeisti į laužtinius*/
<termas>             ::=     <daugiklis>  [ <operatoriaiSandaugos> <termas> ] /* riestiniai pakeisti į laužtinius*/
<daugiklis>        	::=     '(' <reiskinys> ')' | <kintamasis> | <konstanta> | <boolean> | <sakinysFunkcijosKvietimo> | '!' <reiskinys>

/************************* Apibrėžimai *************************/

<kintamujuSeka>       ::=     <kintamasis> { ',' <kintamasis> }
<skaitmenuSeka>         ::=     <skaitmuo> { <skaitmuo> }

<skaicius>            ::=     <int> | <float>
<int>                ::=     [ <zenklas> ] <skaitmenuSeka> 
<float>               ::=     <skaicius> ',' <skaitmenuSeka>
<konstanta>        	::=     <string> | <skaicius>

<kintamasis>          ::=     <kintamasisPaprastas> | <kintamasisMasyvas>
<identifikatorius>   		::=     <raide> { <raide> | <skaitmuo> }
<kintamasisPaprastas>   ::=    '~' <identifikatorius>
<kintamasisMasyvas>    ::=    '#' <identifikatorius> '[' [ <indeksas> ] ']'   
<indeksas>           ::=     <reiskinys>
<funkcijosPavadinimas>  ::=    '@' <identifikatorius>
<returnTipas>         ::=     <tipas> | 'void'

<tipas>              ::=     ( 'int' | 'float' | 'string' | 'bool' )
<zenklas>            ::=     '+' | '-'
<skaitmuo>           ::=     '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<raide>              ::=     'a' | ... | 'z' | 'A' | ... | 'Z'
<operatoriaiLoginiai>     ::=     '&&' | '||' |
<operatoriaiLyginimo>    ::=     '==' | '<'  |  ' <='  |  '>' | '>=' | '!='
<operatoriaiSumos>     ::=     '+' | '-'
<operatoriaiSandaugos>  ::=     '*' | '/'
<boolean>         	::=     'true' | 'false'

<string>           	::=     ' " ' { <char> } ' " '
<char>             	::=     ASCIInuo32Iki126 | ' \" '






/*
Paulius Barzdėnas
Karolis Martinaitis
MIAU grupė
*/