grammar Pepina; options { k=1; } start : blokprikazu; /* P A R S E R - syntaktický analyzátor */ blokprikazu : prirazeni | forcykl | whilecykl | docykl | ifpodm | deklarace | konzole | ukonceni | switch | ; //definice vyrazu, asiciativita zleva, priorita: ( ) * / % \ + - //asociativitou zleva vznika problem leve rekurze - tu jsem odstranil zavedenim dalsich pomocnych symbolu vyraz : ndmd vyrazc //plus, minus | UVOZOVKY STROBSAH UVOZOVKY; //nastaveni string hodnoty vyrazc : PLUS ndmd vyrazc //vyraz s carkou | MINUS ndmd vyrazc | ; ndmd : zavrk ndmdc; //násobeni, deleni, modulo, celociselne deleni ndmdc : TIMES zavrk ndmdc //ndmd s carkou | DIVIDED zavrk ndmdc | MODULO zavrk ndmdc | INTDIV zavrk ndmdc | ; //Puvodni deklarace, bez odstraneni leverekurze /*vyraz : vyraz PLUS ndmd | vyraz MINUS ndmd | ndmd; ndmd : (ndmd TIMES zavrk) //nasobeni, deleni, modulo, celociselne deleni | (ndmd DIVIDED zavrk | (ndmd MODULO zavrk) | (ndmd INTDIV zavrk) | zavrk; */ zavrk : LPAR vyraz RPAR //uzavorkovani, cisla, identifikatory | IDENT | znamenko hodnota; hodnota : INTEGER_CONST | DOUBLE_CONST; //switch - v basicu SELECT CASE(ident) CASE INTEGER_CONST: blokprikazu CASE .... (CASE ELSE: ...) ENDSELECT switch : SELECT CASE LPAR IDENT RPAR case caseelse ENDSELECT blokprikazu; case : CASE znamenko INTEGER_CONST COLON blokprikazu case | ; caseelse : DEFAULT COLON blokprikazu | ; //prirazeni (a=10;) prirazeni: IDENT ASSIGN vyraz SEMICOLON blokprikazu; //podminka - u cyklu, if (a+3 < b+a-9) podminka : vyraz porovnani vyraz; //cyklus FOR: for ( a = 1 to 5 step 2 ) prikazy.... next forcykl : FOR LPAR IDENT ASSIGN znamenko INTEGER_CONST TO znamenko INTEGER_CONST forstep RPAR blokprikazu NEXT blokprikazu; forstep : STEP znamenko INTEGER_CONST | ; //nepovinny doplnek for cyklu STEP 2 //cyklus while while (a < 5) .... wend whilecykl: WHILE LPAR podminka RPAR blokprikazu WEND blokprikazu; //cyklus do do .... dowhile(a<=5) docykl : DO blokprikazu DOWHILE LPAR podminka RPAR blokprikazu; //podminky if (podminka) then .... (else ....) endif ifpodm : IF LPAR podminka RPAR THEN blokprikazu ifelse ENDIF blokprikazu; ifelse : ELSE blokprikazu | ; //dekarace promennych (INTEGER a;) deklarace: typy IDENT listident SEMICOLON blokprikazu; typy : INTEGER | DOUBLE | STRING; listident: COMMA IDENT listident /* list identifikatoru: tj. INTEGER a,b,c35;*/ | ; //vypis do konzole ( print(a+3) print(50) ) konzole : vypis LPAR vyraz RPAR SEMICOLON blokprikazu; vypis : PRINT | PRINTLN; //definice cisla znamenko : PLUS | MINUS | ; porovnani: EQ | NE | GT | LT | GE | LE ; //ukonceni probihani ukonceni : END SEMICOLON blokprikazu | BREAK SEMICOLON blokprikazu; /*********************************************************************************************************/ /* L E X E R - popis klicovych slov */ //switch SELECT : 'select'; CASE : 'case'; ENDSELECT : 'endselect'; COLON : ':'; DEFAULT : 'default'; //cisla a string INTEGER : 'integer'; DOUBLE : 'double'; STRING : 'string'; //podminky IF : 'if'; THEN : 'then'; ELSE : 'else'; ENDIF : 'endif'; //for cyklus FOR : 'for'; TO : 'to'; STEP : 'step'; NEXT : 'next'; //while cyklus WHILE : 'while'; WEND : 'wend'; //do cyklus DO : 'do'; DOWHILE : 'dowhile'; //vypis do konzole PRINT : 'print'; PRINTLN : 'println'; //ukonceni provadeni END : 'end'; BREAK : 'break'; //zavorky , prirazeni, porovnani LPAR : '('; //parenthesis RPAR : ')'; ASSIGN : '='; PLUS : '+'; MINUS : '-'; TIMES : '*'; DIVIDED : '/'; MODULO : '%'; INTDIV : '\\'; //celociselne deleni EQ : '=='; NE : '!='; GT : '>'; LT : '<'; GE : '>='; LE : '<='; //konec prikazu SEMICOLON: ';'; //deklarace cisel, identifikátoru INTEGER_CONST: CISLICE+; //definice celeho cisla DOUBLE_CONST : CISLICE+ DOT CISLICE*; //definice desetinneho cisla IDENT : PISMENO (PISMENO | CISLICE)*; //definice identifikátoru DOT : '.'; COMMA : ','; //pro oddeleni deklaraci //pomocne deklarace fragment CISLICE : '0'..'9'; fragment PISMENO : ( 'a'..'z' ) | ( 'A'..'Z' ); //STRING fragment STROBSAH : (' ' | '!' | '#'..'~')*; //libovolne znaky ruzne od chr(34) a enteru (\n) UVOZOVKY : '\"'; //vynechavani bilych znaku WS : (' ' | '\t' | '\r' | '\n')+ { skip(); };