Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
#pragma once
#include "Instruction.h"
#include "Expression/ExpressionBool.h"
class InstructionConditionalJump : public Instruction
{
private:
Instruction* if_true;
ExpressionBool* condition;
public:
InstructionConditionalJump(ExpressionBool* condition, Instruction* if_true);
Instruction* Run() override;
};
#include "InstructionReturn.h"
InstructionReturn::InstructionReturn(Variable* return_var)
: return_pointer(return_var->getValue())
{}
InstructionReturnInt::InstructionReturnInt(ExpressionInt* expr, Variable* return_var)
: InstructionReturn(return_var), expr(expr)
{}
InstructionReturnBool::InstructionReturnBool(ExpressionBool* expr, Variable* return_var)
: InstructionReturn(return_var), expr(expr)
{}
Instruction* InstructionReturnVoid::Run()
{
return NULL;
}
Instruction* InstructionReturnInt::Run()
{
*(int*)return_pointer = expr->evaluate();
return NULL;
}
Instruction* InstructionReturnBool::Run()
{
*(bool*)return_pointer = expr->evaluate();
return NULL;
}
#pragma once
#include "Instruction.h"
#include "Expression/ExpressionInt.h"
#include "Expression/ExpressionBool.h"
#include "../../DataSet/DataSet.h"
class InstructionReturn : public Instruction
{
protected:
void* return_pointer;
public:
InstructionReturn(Variable* return_var);
};
class InstructionReturnVoid: public Instruction
{
public:
Instruction* Run() override;
};
class InstructionReturnInt : public InstructionReturn
{
private:
ExpressionInt* expr;
public:
InstructionReturnInt(ExpressionInt* expr, Variable* return_var);
Instruction* Run() override;
};
class InstructionReturnBool : public InstructionReturn
{
private:
ExpressionBool* expr;
public:
InstructionReturnBool(ExpressionBool* expr, Variable* return_var);
Instruction* Run() override;
};
#include "InstructionBlock.h"
InstructionBlock::InstructionBlock(Instruction* entry, VAR_TYPE return_type)
: entry_point(entry)//, return_type(return_type)
{
return_value = new Variable(return_type);
}
void InstructionBlock::RunBlock()
{
Instruction* instr = entry_point;
while (instr)
instr = instr->Run();
// TODO: get return value
}
void InstructionBlock::setEntryPoint(Instruction* entry_point)
{
this->entry_point = entry_point;
}
Variable* InstructionBlock::getReturnVariable()
{
return return_value;
}
#pragma once
#include <iostream>
#include "Instruction/Instruction.h"
#include "Instruction/InstructionAssign.h"
#include "Instruction/InstructionReturn.h"
#include "Instruction/InstructionConditionalJump.h"
#include "../DataSet/DataSet.h"
class InstructionBlock
{
private:
Instruction* entry_point;
//void* return_ptr = NULL;
//VAR_TYPE return_type;
Variable* return_value;
public:
InstructionBlock(Instruction* entry, VAR_TYPE return_type);
void RunBlock();
void setEntryPoint(Instruction* entry_point);
Variable* getReturnVariable();
};
#include "Common.h"
void SyntaxTree_print(SyntaxTree* st, int depth)
const char* getTypeName(Type type)
{
const char* symbols[] = { "id", "op_add", "op_mul", "open", "close", "expr" };
switch (type)
{
case kw_main_rule: return "kw_main_rule";
case tmp_state: return "tmp_state";
case tmp_moves: return "tmp_moves";
case kw_players: return "kw_players";
case tmp_players_list: return "tmp_players_list";
case kw_state: return "kw_state";
case kw_int: return "kw_int";
case kw_bool: return "kw_bool";
case kw_return: return "kw_return";
case identifier: return "identifier";
case integer: return "integer";
case boolean: return "boolean";
case syntax_char: return "syntax_char";
case tmp: return "tmp";
case game: return "game";
case main_rule: return "main_rule";
case players: return "players";
case players_list: return "players_list";
case player: return "player";
case state: return "state";
case moves: return "moves";
case data_set: return "data_set";
case var_list: return "var_list";
case var_list_tail: return "var_list_tail";
case var_declaration: return "var_declaration";
case var_type: return "var_type";
case var_definition: return "var_definition";
case instruction_block: return "instruction_block";
case instruction_list: return "instruction_list";
case instruction_list_tail: return "instruction_list_tail";
case instruction: return "instruction";
case assign_instr: return "assign_instr";
case return_instr: return "return_instr";
case if_instr: return "if_instr";
case while_instr: return "while_instr";
case expr: return "expr";
case expr_ref: return "expr_ref";
case expr_literal: return "expr_literal";
case expr_add: return "expr_add";
case expr_sub: return "expr_sub";
case expr_mul: return "expr_mul";
case expr_div: return "expr_div";
case expr_mod: return "expr_mod";
case expr_neg: return "expr_neg";
case expr_equal: return "expr_equal";
case expr_not_equal: return "expr_not_equal";
case expr_less_equal: return "expr_less_equal";
case expr_greater_equal: return "expr_greater_equal";
case expr_greater: return "expr_greater";
case expr_less: return "expr_less";
case expr_and: return "expr_and";
case expr_or: return "expr_or";
case expr_not: return "expr_not";
case var_reference: return "var_reference";
case local_scope: return "local_scope";
case state_scope: return "state_scope";
case move_scope: return "move_scope";
case m_rule_list: return "m_rule_list";
case m_rule: return "m_rule";
case payoff_list: return "payoff_list";
case payoff: return "payoff";
case move_list: return "move_list";
case move: return "move";
case players_scope: return "players_scope";
case identifier_list: return "identifier_list";
default: return "Name not assigned";
}
}
void SyntaxTree_print(SyntaxTree* st, int depth)
{
for (int i = 0; i < depth; i++) printf(" ");
printf("%s: ", symbols[st->type]);
printf("%s: ", getTypeName(st->type));
if (st->children_num == 0)
{
......
......@@ -7,13 +7,26 @@
typedef enum Type
{
id,
op_add,
op_mul,
open,
close,
expr
kw_main_rule, tmp_state, tmp_moves,
kw_players,
tmp_players_list,
kw_state, kw_int, kw_bool, kw_return,
kw_if, kw_while,
identifier, integer, boolean, syntax_char,
tmp,
game, main_rule, players, players_list, player, state, moves,
data_set, var_list, var_list_tail, var_declaration, var_type, var_definition,
instruction_block, instruction_list,
instruction, assign_instr, return_instr, if_instr, while_instr,
expr, expr_ref, expr_literal, expr_add, expr_sub, expr_mul, expr_div, expr_mod, expr_neg,
expr_equal, expr_not_equal, expr_less_equal, expr_greater_equal, expr_greater, expr_less, expr_and, expr_or, expr_not,
var_reference, local_scope, state_scope, move_scope,
m_rule_list, m_rule,
payoff_list, payoff,
move_list, move, players_scope,
identifier_list, instruction_list_tail
} Type;
......@@ -27,5 +40,6 @@ struct SyntaxTree{
};
void SyntaxTree_print(SyntaxTree* st, int depth);
const char* getTypeName(Type type);
#endif // ifndef __COMMON_H__
\ No newline at end of file
......@@ -286,30 +286,37 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
*yy_cp = '\0'; \
yy_c_buf_p = yy_cp;
#define YY_NUM_RULES 7
#define YY_END_OF_BUFFER 8
static yyconst short int yy_accept[13] =
#define YY_NUM_RULES 23
#define YY_END_OF_BUFFER 24
static yyconst short int yy_accept[85] =
{ 0,
0, 0, 8, 6, 7, 4, 5, 3, 2, 1,
1, 0
0, 0, 24, 23, 22, 21, 21, 23, 16, 21,
21, 21, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 23, 11, 14, 16, 12, 10, 13,
20, 20, 8, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 15, 20, 5, 20, 20, 20, 20,
20, 19, 20, 20, 20, 6, 20, 20, 20, 20,
20, 20, 20, 20, 17, 20, 4, 20, 20, 2,
20, 9, 20, 20, 7, 20, 20, 1, 20, 20,
20, 3, 18, 0
} ;
static yyconst int yy_ec[256] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
4, 5, 6, 1, 1, 1, 1, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 1, 1, 1,
1, 1, 1, 1, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
1, 1, 1, 1, 8, 1, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 3, 1, 4, 4, 4, 5, 1, 4,
4, 4, 4, 4, 4, 4, 4, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 1, 4, 7,
8, 9, 1, 1, 10, 11, 12, 12, 13, 14,
12, 15, 16, 12, 12, 17, 18, 19, 20, 21,
12, 22, 23, 24, 25, 26, 27, 12, 28, 12,
4, 1, 4, 1, 29, 1, 30, 12, 12, 12,
31, 32, 12, 12, 12, 12, 12, 33, 12, 12,
12, 12, 12, 34, 35, 36, 37, 12, 12, 12,
12, 12, 4, 38, 4, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
......@@ -326,33 +333,76 @@ static yyconst int yy_ec[256] =
1, 1, 1, 1, 1
} ;
static yyconst int yy_meta[9] =
static yyconst int yy_meta[39] =
{ 0,
1, 1, 1, 1, 1, 1, 2, 2
1, 1, 1, 1, 1, 2, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1
} ;
static yyconst short int yy_base[14] =
static yyconst short int yy_base[86] =
{ 0,
0, 0, 10, 11, 11, 11, 11, 11, 11, 0,
0, 11, 7
0, 0, 100, 101, 101, 91, 101, 93, 91, 88,
87, 86, 0, 73, 25, 30, 75, 78, 66, 71,
73, 57, 52, 47, 101, 101, 78, 101, 101, 101,
0, 63, 0, 58, 65, 54, 69, 54, 67, 55,
59, 41, 36, 101, 55, 0, 52, 57, 41, 43,
43, 37, 48, 29, 32, 0, 33, 38, 47, 37,
45, 34, 43, 24, 0, 32, 0, 31, 33, 0,
27, 0, 24, 25, 0, 37, 29, 0, 21, 30,
29, 0, 0, 101, 39
} ;
static yyconst short int yy_def[14] =
static yyconst short int yy_def[86] =
{ 0,
12, 1, 12, 12, 12, 12, 12, 12, 12, 13,
13, 0, 12
84, 1, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 85, 85, 85, 85, 85, 85, 85, 85,
85, 85, 85, 84, 84, 84, 84, 84, 84, 84,
85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
85, 85, 85, 84, 85, 85, 85, 85, 85, 85,
85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
85, 85, 85, 0, 84
} ;
static yyconst short int yy_nxt[20] =
static yyconst short int yy_nxt[140] =
{ 0,
4, 5, 6, 7, 8, 9, 4, 10, 11, 12,
3, 12, 12, 12, 12, 12, 12, 12, 12
4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 13, 13, 13, 13, 15, 13, 16, 13, 13,
17, 18, 19, 20, 13, 13, 21, 13, 13, 13,
13, 22, 13, 13, 13, 23, 13, 24, 33, 35,
31, 83, 82, 34, 81, 80, 79, 78, 77, 36,
76, 75, 74, 73, 65, 72, 71, 70, 69, 68,
67, 66, 65, 64, 63, 62, 61, 60, 59, 58,
57, 56, 55, 54, 53, 52, 51, 50, 49, 48,
47, 46, 45, 27, 44, 43, 42, 41, 40, 39,
38, 37, 32, 30, 29, 28, 27, 26, 25, 84,
3, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84
} ;
static yyconst short int yy_chk[20] =
static yyconst short int yy_chk[140] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 13, 3,
12, 12, 12, 12, 12, 12, 12, 12, 12
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 15, 16,
85, 81, 80, 15, 79, 77, 76, 74, 73, 16,
71, 69, 68, 66, 64, 63, 62, 61, 60, 59,
58, 57, 55, 54, 53, 52, 51, 50, 49, 48,
47, 45, 43, 42, 41, 40, 39, 38, 37, 36,
35, 34, 32, 27, 24, 23, 22, 21, 20, 19,
18, 17, 14, 12, 11, 10, 9, 8, 6, 3,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84
} ;
static yy_state_type yy_last_accepting_state;
......@@ -379,7 +429,7 @@ char *yytext;
#define fileno _fileno
#line 383 "Lexer.c"
#line 433 "Lexer.c"
/* Macros after this point can all be overridden by user definitions in
* section 1.
......@@ -533,7 +583,8 @@ YY_DECL
#line 16 "Lexer.l"
#line 537 "Lexer.c"
#line 588 "Lexer.c"
if ( yy_init )
{
......@@ -584,13 +635,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 13 )
if ( yy_current_state >= 85 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
while ( yy_base[yy_current_state] != 11 );
while ( yy_base[yy_current_state] != 101 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
......@@ -618,65 +669,180 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
YY_RULE_SETUP
#line 18 "Lexer.l"
#line 19 "Lexer.l"
{
yylval.t = SyntaxTree_init(id, yytext, 0);
//yylval.t = st;
yylval.t = SyntaxTree_init(kw_players, yytext, 0);
return ID;
return KW_PLAYERS;
}
YY_BREAK
case 2:
YY_RULE_SETUP
#line 25 "Lexer.l"
{
SyntaxTree* st = SyntaxTree_init(op_add, yytext, 0);
yylval.t = st;
yylval.t = SyntaxTree_init(kw_state, yytext, 0);
return '+';
return KW_STATE;
}
YY_BREAK
case 3:
YY_RULE_SETUP
#line 32 "Lexer.l"
#line 31 "Lexer.l"
{
SyntaxTree* st = SyntaxTree_init(op_mul, yytext, 0);
yylval.t = st;
yylval.t = SyntaxTree_init(main_rule, yytext, 0);
return '*';
return KW_MAIN_RULE;
}
YY_BREAK
case 4:
YY_RULE_SETUP
#line 39 "Lexer.l"
#line 37 "Lexer.l"
{
SyntaxTree* st = SyntaxTree_init(open, yytext, 0);
yylval.t = st;
yylval.t = SyntaxTree_init(moves, yytext, 0);
return '(';
return KW_MOVES;
}
YY_BREAK
case 5:
YY_RULE_SETUP
#line 46 "Lexer.l"
#line 44 "Lexer.l"
{
SyntaxTree* st = SyntaxTree_init(close, yytext, 0);
yylval.t = st;
yylval.t = SyntaxTree_init(kw_int, yytext, 0);
return ')';
return KW_INT;
}
YY_BREAK
case 6:
YY_RULE_SETUP
#line 54 "Lexer.l"
{ }
#line 50 "Lexer.l"
{
yylval.t = SyntaxTree_init(kw_bool, yytext, 0);
return KW_BOOL;
}
YY_BREAK
case 7:
YY_RULE_SETUP
#line 56 "Lexer.l"
{
yylval.t = SyntaxTree_init(kw_return, yytext, 0);
return KW_RETURN;
}
YY_BREAK
case 8:
YY_RULE_SETUP
#line 62 "Lexer.l"
{
yylval.t = SyntaxTree_init(kw_if, yytext, 0);
return KW_IF;
}
YY_BREAK
case 9:
YY_RULE_SETUP
#line 68 "Lexer.l"
{
yylval.t = SyntaxTree_init(kw_while, yytext, 0);
return KW_WHILE;
}
YY_BREAK
case 10:
YY_RULE_SETUP
#line 75 "Lexer.l"
{ return OPERATOR_EQUAL; }
YY_BREAK
case 11:
YY_RULE_SETUP
#line 77 "Lexer.l"
{ return OPERATOR_NOT_EQUAL; }
YY_BREAK
case 12:
YY_RULE_SETUP
#line 79 "Lexer.l"
{ return OPERATOR_LESS_EQUAL; }
YY_BREAK
case 13:
YY_RULE_SETUP
#line 81 "Lexer.l"
{ return OPERATOR_GREATER_EQUAL; }
YY_BREAK
case 14:
YY_RULE_SETUP
#line 83 "Lexer.l"
{ return OPERATOR_AND; }
YY_BREAK
case 15:
YY_RULE_SETUP
#line 85 "Lexer.l"
{ return OPERATOR_OR; }
YY_BREAK
case 16:
YY_RULE_SETUP
#line 88 "Lexer.l"
{
yylval.t = SyntaxTree_init(integer, yytext, 0);
return INTEGER;
}
YY_BREAK
case 17:
YY_RULE_SETUP
#line 95 "Lexer.l"
{
yylval.t = SyntaxTree_init(boolean, yytext, 0);
return BOOLEAN;
}
YY_BREAK
case 18:
YY_RULE_SETUP
#line 102 "Lexer.l"
{
yylval.t = SyntaxTree_init(state, yytext, 0);
return TMP_STATE;
}
YY_BREAK
case 19:
YY_RULE_SETUP
#line 110 "Lexer.l"
{
yylval.t = SyntaxTree_init(tmp, yytext, 0);
return TMP;
}
YY_BREAK
case 20:
YY_RULE_SETUP
#line 118 "Lexer.l"
{
yylval.t = SyntaxTree_init(identifier, yytext, 0);
return IDENTIFIER;
}
YY_BREAK
case 21:
YY_RULE_SETUP
#line 125 "Lexer.l"
{
yylval.t = SyntaxTree_init(syntax_char, yytext, 0);
return yytext[0];
}
YY_BREAK
case 22:
YY_RULE_SETUP
#line 132 "Lexer.l"
{ }
YY_BREAK
case 23:
YY_RULE_SETUP
#line 134 "Lexer.l"
ECHO;
YY_BREAK
#line 680 "Lexer.c"
#line 846 "Lexer.c"
case YY_STATE_EOF(INITIAL):
yyterminate();
......@@ -968,7 +1134,7 @@ static yy_state_type yy_get_previous_state()
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 13 )
if ( yy_current_state >= 85 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
......@@ -1003,11 +1169,11 @@ yy_state_type yy_current_state;
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 13 )
if ( yy_current_state >= 85 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
yy_is_jam = (yy_current_state == 12);
yy_is_jam = (yy_current_state == 84);
return yy_is_jam ? 0 : yy_current_state;
}
......@@ -1562,5 +1728,5 @@ int main()
return 0;
}
#endif
#line 56 "Lexer.l"
#line 134 "Lexer.l"
......@@ -15,42 +15,120 @@
%%
[a-zA-Z_][a-zA-Z0-9_]* {
yylval.t = SyntaxTree_init(id, yytext, 0);
//yylval.t = st;
PLAYERS {
yylval.t = SyntaxTree_init(kw_players, yytext, 0);
return ID;
return KW_PLAYERS;
}
\+ {
SyntaxTree* st = SyntaxTree_init(op_add, yytext, 0);
yylval.t = st;
STATE {
yylval.t = SyntaxTree_init(kw_state, yytext, 0);
return '+';
return KW_STATE;
}
\* {
SyntaxTree* st = SyntaxTree_init(op_mul, yytext, 0);
yylval.t = st;
MAIN_RULE {
yylval.t = SyntaxTree_init(main_rule, yytext, 0);
return '*';
return KW_MAIN_RULE;
}
\( {
SyntaxTree* st = SyntaxTree_init(open, yytext, 0);
yylval.t = st;
MOVES {
yylval.t = SyntaxTree_init(moves, yytext, 0);
return '(';
return KW_MOVES;
}
\) {
SyntaxTree* st = SyntaxTree_init(close, yytext, 0);
yylval.t = st;
INT {
yylval.t = SyntaxTree_init(kw_int, yytext, 0);
return KW_INT;
}
BOOL {
yylval.t = SyntaxTree_init(kw_bool, yytext, 0);
return KW_BOOL;
}
RETURN {
yylval.t = SyntaxTree_init(kw_return, yytext, 0);
return KW_RETURN;
}
IF {
yylval.t = SyntaxTree_init(kw_if, yytext, 0);
return KW_IF;
}
WHILE {
yylval.t = SyntaxTree_init(kw_while, yytext, 0);
return KW_WHILE;
}
"==" { return OPERATOR_EQUAL; }
"!=" { return OPERATOR_NOT_EQUAL; }
"<=" { return OPERATOR_LESS_EQUAL; }
">=" { return OPERATOR_GREATER_EQUAL; }
"&&" { return OPERATOR_AND; }
"||" { return OPERATOR_OR; }
[0-9]+ {
yylval.t = SyntaxTree_init(integer, yytext, 0);
return INTEGER;
}
(true)|(false) {
yylval.t = SyntaxTree_init(boolean, yytext, 0);
return BOOLEAN;
}
TMP_STATE {
yylval.t = SyntaxTree_init(state, yytext, 0);
return TMP_STATE;
}
TMP {
yylval.t = SyntaxTree_init(tmp, yytext, 0);
return TMP;
}
[a-zA-Z_][a-zA-Z0-9_]* {
yylval.t = SyntaxTree_init(identifier, yytext, 0);
return IDENTIFIER;
}
[\[\]{}<>()+\-*/=!,;%$#\.] {
yylval.t = SyntaxTree_init(syntax_char, yytext, 0);
return ')';
return yytext[0];
}
. { }
[ \t\n] { }
%%
This diff is collapsed.
......@@ -39,7 +39,26 @@
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
ID = 258
KW_MAIN_RULE = 258,
TMP_STATE = 259,
KW_MOVES = 260,
KW_PLAYERS = 261,
KW_STATE = 262,
KW_INT = 263,
KW_BOOL = 264,
KW_RETURN = 265,
KW_IF = 266,
KW_WHILE = 267,
IDENTIFIER = 268,
INTEGER = 269,
BOOLEAN = 270,
OPERATOR_EQUAL = 271,
OPERATOR_NOT_EQUAL = 272,
OPERATOR_LESS_EQUAL = 273,
OPERATOR_GREATER_EQUAL = 274,
OPERATOR_AND = 275,
OPERATOR_OR = 276,
TMP = 277
};
#endif
......@@ -60,7 +79,7 @@ symval
/* Line 1676 of yacc.c */
#line 64 "Parser.tab.h"
#line 83 "Parser.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
......
......@@ -19,79 +19,515 @@ SyntaxTree* root;
%token <t> ID '(' ')'
%type <t> EXPR
%token <t> KW_MAIN_RULE TMP_STATE KW_MOVES
KW_PLAYERS
KW_STATE KW_INT KW_BOOL KW_RETURN
KW_IF KW_WHILE
IDENTIFIER INTEGER BOOLEAN
OPERATOR_EQUAL OPERATOR_NOT_EQUAL OPERATOR_LESS_EQUAL OPERATOR_GREATER_EQUAL OPERATOR_AND OPERATOR_OR
TMP
%left<t> '+'
%left<t> '*'
%type <t> GAME MAIN_RULE PLAYERS STATE MOVES
PLAYERS_LIST PLAYER
DATA_SET VAR_LIST VAR_DECLARATION VAR_TYPE VAR_DEFINITION
INSTRUCTION_BLOCK INSTRUCTION_LIST
INSTRUCTION ASSIGN_INSTR RETURN_INSTR IF_INSTR WHILE_INSTR EXPR
VAR_REFERENCE SCOPE
M_RULE_LIST M_RULE
PAYOFF_LIST PAYOFF
MOVE_LIST MOVE PLAYERS_SCOPE
IDENTIFIER_LIST
%left OPERATOR_OR
%left OPERATOR_AND
%left '!'
%left OPERATOR_EQUAL OPERATOR_NOT_EQUAL
%left OPERATOR_GREATER_EQUAL OPERATOR_LESS_EQUAL '<' '>'
%left '+' '-'
%left '*' '/' '%'
%start GAME
%%
EXPR: ID {
SyntaxTree* st = SyntaxTree_init(expr, "", 1);
yylval.t = st;
GAME: PLAYERS STATE MAIN_RULE MOVES {
SyntaxTree* st = SyntaxTree_init(game, "", 4);
root = st;
st->children[0] = $1;
st->children[1] = $2;
st->children[2] = $3;
st->children[3] = $4;
}
// Main components
PLAYERS: KW_PLAYERS '[' PLAYERS_LIST ']'{
SyntaxTree* st = SyntaxTree_init(players, "", 1);
$$ = st;
st->children[0] = $3;
}
STATE: KW_STATE DATA_SET '(' INSTRUCTION_BLOCK ')' {
SyntaxTree* st = SyntaxTree_init(state, "", 2);
$$ = st;
root = st;
st->children[0] = $2;
st->children[1] = $4;
}
| '(' EXPR ')' {
SyntaxTree* st = SyntaxTree_init(expr, "", 3);
yylval.t = st;
MAIN_RULE: KW_MAIN_RULE '[' M_RULE_LIST ']' {
SyntaxTree* st = SyntaxTree_init(main_rule, "", 1);
$$ = st;
st->children[0] = $3;
}
MOVES: KW_MOVES '[' MOVE_LIST ']' {
SyntaxTree* st = SyntaxTree_init(moves, "", 1);
$$ = st;
st->children[0] = $3;
}
// Players
PLAYERS_LIST: PLAYER {
SyntaxTree* st = SyntaxTree_init(players_list, "", 1);
$$ = st;
st->children[0] = $1;
}
| PLAYER PLAYERS_LIST {
SyntaxTree* st = SyntaxTree_init(players_list, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $2;
st->children[2] = $3;
}
PLAYER: IDENTIFIER '[' INTEGER ']' ';' {
SyntaxTree* st = SyntaxTree_init(player, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
// Data
DATA_SET: '[' VAR_LIST ']' {
SyntaxTree* st = SyntaxTree_init(data_set, "", 1);
$$ = st;
root = st;
st->children[0] = $2;
}
| EXPR '+' EXPR {
SyntaxTree* st = SyntaxTree_init(expr, "", 3);
yylval.t = st;
VAR_LIST: {
SyntaxTree* st = SyntaxTree_init(var_list_tail, "", 0);
$$ = st;
}
| VAR_DECLARATION VAR_LIST {
SyntaxTree* st = SyntaxTree_init(var_list, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $2;
st->children[2] = $3;
}
VAR_DECLARATION: VAR_TYPE IDENTIFIER '=' VAR_DEFINITION ';' {
SyntaxTree* st = SyntaxTree_init(var_declaration, "", 3);
$$ = st;
st->children[0] = $1;
st->children[1] = $2;
st->children[2] = $4;
}
VAR_TYPE: KW_INT {
SyntaxTree* st = SyntaxTree_init(var_type, "", 1);
$$ = st;
st->children[0] = $1;
}
| KW_BOOL {
SyntaxTree* st = SyntaxTree_init(var_type, "", 1);
$$ = st;
root = st;
st->children[0] = $1;
}
VAR_DEFINITION: INTEGER {
SyntaxTree* st = SyntaxTree_init(var_definition, "", 1);
$$ = st;
st->children[0] = $1;
}
| BOOLEAN {
SyntaxTree* st = SyntaxTree_init(var_definition, "", 1);
$$ = st;
st->children[0] = $1;
}
| EXPR '*' EXPR {
SyntaxTree* st = SyntaxTree_init(expr, "", 3);
yylval.t = st;
// INSTRUCTIONS
INSTRUCTION_BLOCK: DATA_SET '{' INSTRUCTION_LIST '}' {
SyntaxTree* st = SyntaxTree_init(instruction_block, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
INSTRUCTION_LIST: {
SyntaxTree* st = SyntaxTree_init(instruction_list_tail, "", 0);
$$ = st;
}
| INSTRUCTION INSTRUCTION_LIST {
SyntaxTree* st = SyntaxTree_init(instruction_list, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $2;
st->children[2] = $3;
}
INSTRUCTION: ASSIGN_INSTR {
SyntaxTree* st = SyntaxTree_init(instruction, "", 1);
$$ = st;
st->children[0] = $1;
}
| RETURN_INSTR {
SyntaxTree* st = SyntaxTree_init(instruction, "", 1);
$$ = st;
root = st;
st->children[0] = $1;
}
| IF_INSTR {
SyntaxTree* st = SyntaxTree_init(instruction, "", 1);
$$ = st;
st->children[0] = $1;
}
| WHILE_INSTR {
SyntaxTree* st = SyntaxTree_init(instruction, "", 1);
$$ = st;
st->children[0] = $1;
}
ASSIGN_INSTR: VAR_REFERENCE '=' EXPR ';' {
SyntaxTree* st = SyntaxTree_init(assign_instr, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
RETURN_INSTR: KW_RETURN ';' {
SyntaxTree* st = SyntaxTree_init(return_instr, "", 0);
$$ = st;
}
| KW_RETURN EXPR ';' {
SyntaxTree* st = SyntaxTree_init(return_instr, "", 1);
$$ = st;
st->children[0] = $2;
}
IF_INSTR: KW_IF '(' EXPR ')' '{' INSTRUCTION_LIST '}' {
SyntaxTree* st = SyntaxTree_init(if_instr, "", 2);
$$ = st;
st->children[0] = $3;
st->children[1] = $6;
}
WHILE_INSTR: KW_WHILE '(' EXPR ')' '{' INSTRUCTION_LIST '}' {
SyntaxTree* st = SyntaxTree_init(while_instr, "", 2);
$$ = st;
st->children[0] = $3;
st->children[1] = $6;
}
EXPR: VAR_REFERENCE {
SyntaxTree* st = SyntaxTree_init(expr_ref, "", 1);
$$ = st;
st->children[0] = $1;
}
| VAR_DEFINITION{
SyntaxTree* st = SyntaxTree_init(expr_literal, "", 1);
$$ = st;
st->children[0] = $1;
}
| '(' EXPR ')'{
SyntaxTree* st = SyntaxTree_init(expr, "", 1);
$$ = st;
st->children[0] = $2;
}
| EXPR '+' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_add, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR '-' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_sub, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR '*' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_mul, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR '/' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_div, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR '%' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_mod, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| '-' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_neg, "", 1);
$$ = st;
st->children[0] = $2;
}
| EXPR OPERATOR_EQUAL EXPR{
SyntaxTree* st = SyntaxTree_init(expr_equal, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR OPERATOR_NOT_EQUAL EXPR{
SyntaxTree* st = SyntaxTree_init(expr_not_equal, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR OPERATOR_GREATER_EQUAL EXPR{
SyntaxTree* st = SyntaxTree_init(expr_greater_equal, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR OPERATOR_LESS_EQUAL EXPR{
SyntaxTree* st = SyntaxTree_init(expr_greater_equal, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR '>' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_greater, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR '<' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_less, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR OPERATOR_AND EXPR{
SyntaxTree* st = SyntaxTree_init(expr_and, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| EXPR OPERATOR_OR EXPR{
SyntaxTree* st = SyntaxTree_init(expr_or, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
| '!' EXPR{
SyntaxTree* st = SyntaxTree_init(expr_not, "", 1);
$$ = st;
st->children[0] = $2;
}
VAR_REFERENCE: SCOPE IDENTIFIER {
SyntaxTree* st = SyntaxTree_init(var_reference, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $2;
}
SCOPE: {
SyntaxTree* st = SyntaxTree_init(local_scope, "", 0);
$$ = st;
}
| '$' '.' {
SyntaxTree* st = SyntaxTree_init(state_scope, "", 0);
$$ = st;
}
| '#' '.' {
SyntaxTree* st = SyntaxTree_init(move_scope, "", 0);
$$ = st;
}
// MAIN_RULE
M_RULE_LIST: M_RULE {
SyntaxTree* st = SyntaxTree_init(m_rule_list, "", 1);
$$ = st;
st->children[0] = $1;
}
| M_RULE '%' M_RULE_LIST {
SyntaxTree* st = SyntaxTree_init(m_rule_list, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
M_RULE: IDENTIFIER '(' INSTRUCTION_BLOCK ')' PAYOFF_LIST {
SyntaxTree* st = SyntaxTree_init(m_rule, "", 3);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
st->children[2] = $5;
}
PAYOFF_LIST: PAYOFF {
SyntaxTree* st = SyntaxTree_init(payoff_list, "", 1);
$$ = st;
st->children[0] = $1;
}
| PAYOFF PAYOFF_LIST {
SyntaxTree* st = SyntaxTree_init(payoff_list, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $2;
}
PAYOFF: IDENTIFIER INSTRUCTION_BLOCK{
SyntaxTree* st = SyntaxTree_init(payoff, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $2;
}
MOVE_LIST: MOVE {
SyntaxTree* st = SyntaxTree_init(move_list, "", 1);
$$ = st;
st->children[0] = $1;
}
| MOVE '%' MOVE_LIST {
SyntaxTree* st = SyntaxTree_init(move_list, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
MOVE: IDENTIFIER '<' PLAYERS_SCOPE '>' DATA_SET '(' INSTRUCTION_BLOCK ')' INSTRUCTION_BLOCK{
SyntaxTree* st = SyntaxTree_init(move, "", 5);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
st->children[2] = $5;
st->children[3] = $7;
st->children[4] = $9;
}
PLAYERS_SCOPE: '*' {
SyntaxTree* st = SyntaxTree_init(players_scope, "", 0);
$$ = st;
}
| IDENTIFIER_LIST {
SyntaxTree* st = SyntaxTree_init(players_scope, "", 1);
$$ = st;
st->children[0] = $1;
}
IDENTIFIER_LIST: IDENTIFIER {
SyntaxTree* st = SyntaxTree_init(identifier_list, "", 1);
$$ = st;
st->children[0] = $1;
}
| IDENTIFIER ',' IDENTIFIER_LIST {
SyntaxTree* st = SyntaxTree_init(identifier_list, "", 2);
$$ = st;
st->children[0] = $1;
st->children[1] = $3;
}
// TMP { SyntaxTree* st = SyntaxTree_init(tmp, "", 1); $$ = st; st->children[0] = $1; }
%%
SyntaxTree* parser_main(int argc, char *argv[])
SyntaxTree* parser_main(char *file_path)
{
FILE *fp = NULL;
if (argc == 2)
fopen_s(&fp, file_path, "rb");
if (fp == NULL)
{
perror("Failed to open file");
return NULL;
}
else
{
fopen_s(&fp, argv[1], "rb");
if (fp == NULL)
{
perror("Failed to open file");
return NULL;
}
else
{
yyin = fp;
}
yyin = fp;
}
yyparse();
......
a + ( a * d) * b
\ No newline at end of file
PLAYERS
[
players[4];
masters[2];
]
STATE
[
INT a = 1547;
INT b = 1463;
INT result = 0;
]
(
[
INT a = 1;
INT b = 2;
]
{
IF(!true)
{
$.result = -$.a;
}
})
MAIN_RULE
[
r1
([]{ RETURN true; })
players
[]{RETURN 1;}
masters
[]{#.a = 2; RETURN a;}
]
MOVES
[
m1<*> [ INT a = 0;] ([]{ RETURN; })
[]
{
RETURN;
}
%
m2<masters> [ BOOL b = false; ] ([]{ RETURN; })
[]
{
a = a > b || w >= 7 && 8 != a;
}
]
\ No newline at end of file
#include <iostream>
#include "Grammar/Common.h"
#include "Grammar/Parser.tab.h"
extern "C" SyntaxTree* parser_main(int argc, char* argv[]);
#include "Game/Compiler.h"
extern "C" SyntaxTree* parser_main(char* file_path);
int main(int argc, char* argv[])
void parse_test()
{
char* tab[2];
char str[20] = "Source/source.txt";
tab[1] = str;
SyntaxTree* st = parser_main(2, tab);
char path[20] = "Source/source.txt";
SyntaxTree* st = parser_main(path);
SyntaxTree_print(st, 0);
//yytokentype::ELEM;
std::cout << "\n\n";
Compiler compiler = Compiler();
compiler.createGame(st);
}
void DataSet_test()
{
int size = 0;
size += sizeof(bool);
size += sizeof(int);
size += sizeof(double);
std::cout << "Size: " << size << '\n';
DataSet* ds = new DataSet(size);
ds->defineVariable("b", VAR_TYPE::UNKNOWN, sizeof(bool));
ds->defineVariable("i", VAR_TYPE::UNKNOWN, sizeof(int));
ds->defineVariable("d", VAR_TYPE::UNKNOWN, sizeof(double));
*(bool*)(ds->getValuePtr("b")) = true;
*(int*)(ds->getValuePtr("i")) = 7;
*(double*)(ds->getValuePtr("d")) = 1.5;
std::cout << "Int: \t" << *(int*)(ds->getValuePtr("i")) << "\nBool: \t" << *(bool*)(ds->getValuePtr("b")) << "\nDouble: \t" << *(double*)(ds->getValuePtr("d")) << '\n';
//ds->~DataSet();
}
int main(int argc, char* argv[])
{
parse_test();
//DataSet_test();
return 0;
}
\ No newline at end of file