%{
#include <stdio.h>
#include <stdlib.h>
#include "parse.h"
extern int yylex();
extern int yyparse();
extern FILE *yyin;
void yyerror(const char *s) {
fprintf(stderr, "Error: %s\n", s);
}
%}
%union {
int num_int;
char *id;
char *str;
struct node_tag *node;
}
%token <num_int> NUMBER_INTEGER
%token <id> IDENTIFIER
%token <str> STRING
%token PRINT IF THEN GOTO LT LTE GT GTE EQ
%type <node> line
%type <node> expression
%type <node> statement
%define parse.error verbose
%left '+' '-'
%left '*' '/'
%%
line:
NUMBER_INTEGER statement {
$$ = ast_make_numbered_line($1, $2);
}
;
statement:
PRINT expression {
$$ = ast_make_print($2);
}
| IF expression THEN statement {
$$ = ast_make_if($2, $4);
}
;
expression:
IDENTIFIER {
$$ = ast_make_id($1);
}
| STRING {
$$ = ast_make_string($1);
}
| NUMBER_INTEGER {
$$ = ast_make_number_integer($1);
}
/* | expression '+' expression */
/* | expression '-' expression */
/* | expression '*' expression */
/* | expression '/' expression */
/* | expression LT expression */
/* | expression LTE expression */
/* | expression GT expression */
/* | expression GTE expression */
;
%%