80 lines
1.4 KiB
Plaintext
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;
|
|
}
|