%{ #include #include "y.tab.h" %} %option noyywrap %% "int"|"float"|"char"|"string" {return TIP;} "const" {return CONST;} "begin_progr" {return BGIN;} "end_progr" {return END;} @[_a-zA-Z][_a-zA-Z0-9]* {return ID;} ":=" {return ASSIGN;} [0-9]+ {return NR;} "+" {return PLUS;} "-" {return MINUS;} "*" {return ORI;} "/" {return IMPARTIRE;} [ \t] ; \n {yylineno++;} . {return yytext[0];} %{ #include extern FILE* yyin; extern char* yytext; extern int yylineno; %} %token ID TIP BGIN END ASSIGN NR OPERATOR CONST %token PLUS MINUS ORI IMPARTIRE %start progr %left PLUS %left MINUS %left ORI %left IMPARTIRE %% progr: declaratii bloc {printf("program corect sintactic\n");} ; declaratii : declaratie ';' | declaratii declaratie ';' declaratie : TIP seq | CONST TIP seq | TIP ID '(' lista_param ')' | TIP ID '(' ')' ; seq : seq ',' se | se ; se : ID | ID ASSIGN AExp ; AExp : NR | ID | AExp PLUS AExp | AExp MINUS AExp | AExp ORI AExp | AExp IMPARTIRE AExp | '(' AExp ')' ; lista_param : param | lista_param ',' param ; param : TIP ID ; /* bloc */ bloc : BGIN list END ; /* lista instructiuni */ list : statement ';' | list statement ';' ; /* instructiune */ statement: ID ASSIGN AExp | ID '(' lista_apel ')' ; lista_apel : AExp | lista_apel ',' AExp ; %% void yyerror(char * s){ printf("eroare: %s la linia:%d\n",s,yylineno); } int main(int argc, char** argv){ yyin=fopen(argv[1],"r"); yyparse(); }