Files
zut-n1-kompilatory/def.yy
2025-12-04 00:03:08 +01:00

80 lines
1.4 KiB
Plaintext

%{
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <FlexLexer.h>
#define INFILE_ERROR 1
#define OUTFILE_ERROR 2
extern yyFlexLexer lexer;
void yyerror(const char *s);
int yylex();
%}
%union {
char *text;
int ival;
}
%token <text> ID
%token <ival> INT_LIT
%token LET
%token INT_TYPE
%token SEMICOLON COLON
%left '+' '-'
%left '*' '/'
%start program
%%
program
: statement_list { printf("koniec\n"); }
;
statement_list
: statement
| statement_list statement
;
statement
: variable_declaration { printf("Deklaracja zmiennej\n"); }
| expression SEMICOLON { printf("instrukcja\n"); }
;
variable_declaration
: LET ID COLON INT_TYPE '=' expression SEMICOLON
{ printf("Deklaracja zmiennej: %s\n", $2); free($2); }
;
expression
: expression '+' expression { printf("Wyrazenie z +\n"); }
| expression '-' expression { printf("Wyrazenie z -\n"); }
| expression '*' expression { printf("Wyrazenie z *\n"); }
| expression '/' expression { printf("Wyrazenie z /\n"); }
| '(' expression ')' { printf("Wyrazenie w nawiasach\n"); }
| INT_LIT { printf("Literal calkowity: %d\n", $1); }
| ID { printf("Identyfikator: %s\n", $1); free($1); }
;
%%
yyFlexLexer lexer;
int yylex() {
return lexer.yylex();
}
void yyerror(const char *s) {
fprintf(stderr, "Blad: %s w linii %d\n", s, lexer.lineno());
}
int main(int argc, char *argv[]) {
yyparse();
return 0;
}