96
unknown
plain_text
a year ago
9.6 kB
6
Indexable
/* Definition section */
%{
#include "compiler_common.h"
#include "compiler_util.h"
#include "main.h"
int yydebug = 1;
%}
/* Union to define types for semantic values */
%union {
ObjectType var_type;
bool b_var;
int i_var;
float f_var;
char *s_var;
Object object_val;
}
/* Token definitions without return types */
%token COUT
%token SHR SHL BAN BOR BNT BXO ADD SUB MUL DIV REM NOT GTR LES GEQ LEQ EQL NEQ LAN LOR
%token VAL_ASSIGN ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN REM_ASSIGN BAN_ASSIGN BOR_ASSIGN BXO_ASSIGN SHR_ASSIGN SHL_ASSIGN INC_ASSIGN DEC_ASSIGN
%token IF ELSE FOR WHILE RETURN BREAK CONTINUE
%token '{' '}' '(' ')' '[' ']'
%token ',' ':' ';'
/* Token definitions with return types */
%token <var_type> VARIABLE_T
%token <b_var> BOOL_LIT
%token <i_var> INT_LIT
%token <f_var> FLOAT_LIT
%token <s_var> STR_LIT
%token <s_var> IDENT
%token <var_type> AUTO
/* Nonterminal definitions with return types */
%type <object_val> Expression
%type <object_val> Assign
%type <object_val> ARG
%type <object_val> num
%type <object_val> CALL
%type <object_val> boolean
%type <object_val> id
/* Operator precedence and associativity */
%left LOR
%left LAN
%left GEQ
%left NEQ EQL
%left GTR LES
%left ADD SUB
%left MUL DIV REM
%left VAL_ASSIGN
%left '(' ')'
/* Start symbol */
%start Program
%%
/* Grammar section */
Program
: { pushScope(); } GlobalStmtList { dumpScope(); }
| /* Empty file */
;
GlobalStmtList
: GlobalStmtList GlobalStmt
| GlobalStmt
;
GlobalStmt
: FunctionDefStmt
;
/* Function definitions */
FunctionDefStmt
: VARIABLE_T IDENT { createFunction($<var_type>1, $<s_var>2);} { pushScope(); } '(' FunctionParameterStmtList ')' '{' StmtList '}' { dumpScope(); }
| VARIABLE_T IDENT '[' ']' { createFunction($<var_type>1, $<s_var>2); } '(' FunctionParameterStmtList ')' '{' StmtList '}' { dumpScope(); }
;
FunctionParameterStmtList
: FunctionParameterStmtList ',' FunctionParameterStmt
| FunctionParameterStmt
| /* Empty function parameter */
;
FunctionParameterStmt
: VARIABLE_T IDENT { pushFunParm($<var_type>1, $<s_var>2, VAR_FLAG_DEFAULT); }
| VARIABLE_T IDENT '[' ']' { pushFunParm($<var_type>1, $<s_var>2, VAR_FLAG_DEFAULT); }
;
/* Statement lists and individual statements */
StmtList
: StmtList Stmt
| Stmt
;
Stmt
: ';'
| COUT CoutParmListStmt ';' { stdoutPrint(); }
| RETURN Expression ';' { printf("RETURN\n"); }
| VARIABLE_T {setVarT($<var_type>1);} MultiVar';'
| Assign ';'
| IF '(' Expression ')' {printf("IF\n");} {pushScope();} '{' StmtList '}' {dumpScope();} Elsepart
| WHILE {printf("WHILE\n");}'(' Expression ')' {pushScope();} '{' StmtList '}' {dumpScope();}
| FOR {printf("FOR\n");} {pushScope();} '(' StmtForList ')' '{' StmtList '}' {dumpScope();}
| BREAK {printf("BREAK\n");}
;
StmtForList
: StmtForList StmtFor
| StmtFor
;
StmtFor
:';'
| VARIABLE_T {setVarT($<var_type>1);} MultiVar';'
| Expression ';'
| Expression
| Assign
| VARIABLE_T
;
Elsepart
: ELSE {printf("ELSE\n");} {pushScope();} '{' StmtList '}' {dumpScope();}
|
;
MultiVar
: MultiVar ',' IDENT {createVNoT($<s_var>3, VAR_FLAG_DEFAULT); }
| MultiVar ',' IDENT VAL_ASSIGN Expression {
createVNoT($<s_var>3, VAR_FLAG_DEFAULT);
Object *variable = findVariable($<s_var>3);
if (variable != NULL) {
objectValueAssign(variable, &$<object_val>5, NULL);
}
}
| IDENT VAL_ASSIGN Expression {
createVNoT($<s_var>1, VAR_FLAG_DEFAULT);
Object *variable = findVariable($<s_var>1);
if (variable != NULL) {
objectValueAssign(variable, &$<object_val>3, NULL);
}
}
| IDENT { createVNoT($<s_var>1, VAR_FLAG_DEFAULT);}
| '(' IDENT ')'{ createVNoT($<s_var>2, VAR_FLAG_DEFAULT);}
| IDENT '[' num ']' VAL_ASSIGN '{' ARGS '}' {PrintArrParam();createVNoT($<s_var>1, VAR_FLAG_DEFAULT);}
| IDENT '[' num ']' '[' num ']' {createVNoT($<s_var>1, VAR_FLAG_DEFAULT);}
| IDENT ':' IDENT {createVNoT($<s_var>1, VAR_FLAG_DEFAULT);} {idFunc($3);}
;
/* Print statement parameter list */
CoutParmListStmt
: CoutParmListStmt SHL Expression { pushFunInParm(&$<object_val>3); }
| SHL Expression { pushFunInParm(&$<object_val>2); }
;
/* Expressions */
Expression
: Assign ';'
| '(' Expression ')' {Object obj; obj.type = $2.type; $$ = obj;}
| Expression LOR Expression {printf("LOR\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression LAN Expression {printf("LAN\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression BOR Expression {printf("BOR\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression BXO Expression {printf("BXO\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression BAN Expression {printf("BAN\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression NEQ Expression {printf("NEQ\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression EQL Expression {printf("EQL\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression GTR Expression {printf("GTR\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression LES Expression {printf("LES\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression GEQ Expression {printf("GEQ\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression LEQ Expression {printf("LEQ\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression SHR Expression {printf("SHR\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression SUB Expression {printf("SUB\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression ADD Expression {printf("ADD\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression REM Expression {printf("REM\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression DIV Expression {printf("DIV\n");Object obj; obj.type = $3.type; $$ = obj;}
| Expression MUL Expression {printf("MUL\n");Object obj; obj.type = $3.type; $$ = obj;}
| ARG {Object obj; obj.type = $1.type; $$ = obj;}
| Expression INC_ASSIGN { printf("INC_ASSIGN\n"); Object obj; obj.type = $1.type; $$ = obj; }
| Expression DEC_ASSIGN { printf("DEC_ASSIGN\n"); Object obj; obj.type = $1.type; $$ = obj; }
| CALL { Object obj; obj.type = $1.type; $$ = obj; }
| '(' VARIABLE_T ')' '(' IDENT ')'{ idFunc($<s_var>5); Object obj; obj.type = findVarType($<s_var>5); $$ = obj; } {changeVType($<var_type>2);} // this is the focus
| '(' VARIABLE_T ')' IDENT { idFunc($<s_var>4); Object obj; obj.type = findVarType($<s_var>4); $$ = obj; } {changeVType($<var_type>2);}
| '(' VARIABLE_T ')' num { Object obj; obj.type = $2; $$ = obj; }{changeVType($<var_type>2);}
| '(' VARIABLE_T ')' '(' num ')'{ Object obj; obj.type = $2; $$ = obj; }{changeVType($<var_type>2);}
| IDENT '(' ARGS ')' {idFunc($1); printcall($1);}
| IDENT '[' num ']' {idFunc($1); Object obj; obj.type = findVariable($<s_var>1)->type; $$ = obj;}
| IDENT '[' num ']' '[' num ']' {idFunc($1);Object obj; obj.type = findVariable($<s_var>1)->type; $$ = obj;}
;
/* Assignment expressions */
Assign
: Expression VAL_ASSIGN Expression { printf("EQL_ASSIGN\n"); }
| Expression ADD_ASSIGN Expression { printf("ADD_ASSIGN\n"); }
| Expression SUB_ASSIGN Expression { printf("SUB_ASSIGN\n"); }
| Expression MUL_ASSIGN Expression { printf("MUL_ASSIGN\n"); }
| Expression DIV_ASSIGN Expression { printf("DIV_ASSIGN\n"); }
| Expression REM_ASSIGN Expression { printf("REM_ASSIGN\n"); }
| Expression SHR_ASSIGN Expression { printf("SHR_ASSIGN\n"); }
| Expression SHL_ASSIGN Expression { printf("SHL_ASSIGN\n"); }
| Expression BAN_ASSIGN Expression { printf("BAN_ASSIGN\n"); }
| Expression BOR_ASSIGN Expression { printf("BOR_ASSIGN\n"); }
| Expression BXO_ASSIGN Expression { printf("BOX_ASSIGN\n"); }
| Expression INC_ASSIGN Expression { printf("INC_ASSIGN\n"); }
| Expression DEC_ASSIGN Expression { printf("DEC_ASSIGN\n"); }
;
/* Function call expressions */
CALL
: IDENT '(' ARGS ')' { Object obj; obj.type = OBJECT_TYPE_FLOAT; $$ = obj; }
;
/* Numeric expressions */
num
: SUB num { printf("NEG\n"); }
| NOT num { printf("NOT\n"); }
| BNT num { printf("BNT\n"); }
| FLOAT_LIT {printf("FLOAT_LIT %f\n", $1);Object obj; obj.type = OBJECT_TYPE_FLOAT; $$ = obj;}
| INT_LIT {printf("INT_LIT %d\n", $1);Object obj; obj.value = $1 ; obj.type = OBJECT_TYPE_INT; $$ = obj;}
;
/* Argument list for function calls */
ARGS
: ARGS ',' ARG {countParam();}
| ARG {countParam();}
|
;
/* Individual argument in a function call */
ARG
: STR_LIT { printf("STR_LIT \"%s\"\n", $1); Object obj; obj.type = OBJECT_TYPE_STR; $$ = obj;}
| boolean { $$ = $1; Object obj; obj.type = $1.type; $$ = obj; }
| num {$$ = $1; Object obj; obj.type = $1.type; $$ = obj; }
| id {$$ = $1; Object obj; obj.type = $1.type; $$ = obj; }
;
/* Boolean expressions */
boolean
: NOT boolean { printf("NOT\n"); Object obj; obj.type = OBJECT_TYPE_BOOL; $$ = obj; }
| BNT boolean { printf("BNT\n"); Object obj; obj.type = OBJECT_TYPE_BOOL; $$ = obj; }
| BOOL_LIT { printf("BOOL_LIT %s\n", $1 ? "TRUE" : "FALSE"); Object obj; obj.type = OBJECT_TYPE_BOOL; $$ = obj; }
;
/* Identifier expressions */
id
: SUB id { printf("NEG\n"); }
| NOT id { printf("NOT\n"); }
| BNT id { printf("BNT\n"); }
| IDENT { idFunc($<s_var>1); Object obj; obj.type = findVarType($<s_var>1); $$ = obj; }
;
%%
/* C code section for supporting functions and utilities */
Editor is loading...
Leave a Comment