Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions builtin/builtin.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include "../include/share.h"
#include "../compiler/summoner.h"

typedef struct
{
const char *name;
BasicType *parameters;
int parameter_count;
BasicType return_type;
const char *op_codes;
} BuiltinFun;

static BasicType sha3_params[] = {HEX_TYPE};
static BasicType sha256_params[] = {HEX_TYPE};
static BasicType abs_params[] = {INT_TYPE};
static BasicType min_params[] = {INT_TYPE, INT_TYPE};
static BasicType max_params[] = {INT_TYPE, INT_TYPE};
static BasicType check_tx_sig_params[] = {PUBKEY_TYPE, SIG_TYPE};
static BasicType check_msg_sig_params[] = {PUBKEY_TYPE, HASH_TYPE, SIG_TYPE};
static BasicType below_params[] = {INT_TYPE, BOOLEAN_TYPE};
static BasicType above_params[] = {INT_TYPE, BOOLEAN_TYPE};
static BasicType lock_params[] = {AMOUNT_TYPE, ASSET_TYPE, HEX_TYPE, HEX_TYPE};
static BasicType verify_params[] = {BOOLEAN_TYPE};

BuiltinFun builtin_funs[] = {
{"sha3", sha3_params, ARRAY_SIZE(sha3_params), HASH_TYPE, "SHA3"},
{"sha256", sha256_params, ARRAY_SIZE(sha256_params), HASH_TYPE, "SHA256"},
{"abs", abs_params, ARRAY_SIZE(abs_params), INT_TYPE, "ABS"},
{"min", min_params, ARRAY_SIZE(min_params), INT_TYPE, "MIN"},
{"max", max_params, ARRAY_SIZE(max_params), INT_TYPE, "MAX"},
{"check_tx_sig", check_tx_sig_params, ARRAY_SIZE(check_tx_sig_params), BOOLEAN_TYPE, "TXSIGHASH SWAP CHECKSIG"},
{"check_msg_sig", check_msg_sig_params, ARRAY_SIZE(check_msg_sig_params), BOOLEAN_TYPE, "CHECKSIG"},
{"below", below_params, ARRAY_SIZE(below_params), BOOLEAN_TYPE, "BLOCKHEIGHT GREATERTHAN"},
{"above", above_params, ARRAY_SIZE(above_params), BOOLEAN_TYPE, "BLOCKHEIGHT LESSTHAN"},
{"lock", lock_params, ARRAY_SIZE(lock_params), VOID_TYPE, ""},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lock的op组合逻辑:

index  (index)
addAmount (amount)
addAsset  (asset)
addInt64 (version)
addCheckOutput (stmt中取program及state)
addVerify   (验证栈顶结果)

{"verify", verify_params, ARRAY_SIZE(verify_params), VOID_TYPE, ""},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

op就是对应的VERIFY

};
5 changes: 5 additions & 0 deletions compiler/create.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ Statement *alloc_assign_stmt(char *variable, Expression *operand)
return stmt;
}

Statement *alloc_compound_assign_stmt(char *variable, ExpressionKind kind, Expression *operand)
{
return alloc_assign_stmt(variable, alloc_binary_expression(kind, alloc_identifier_expression(variable), operand));
}

Statement *alloc_if_stmt(Expression *condition, Block *then_block, Elseif *elseif_list, Block *else_block)
{
Statement *stmt = alloc_stmt(IF_STATEMENT);
Expand Down
28 changes: 23 additions & 5 deletions compiler/grammar.y
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ int yyerror(const char *s);
%token <str_value> STRING_LITERAL
%token <identifier> IDENTIFIER
%token VAR CONST FUNCTION IF ELSE FOR RETURN BREAK CONTINUE NIL
%token BOOL_T INT_T DOUBLE_T STRING_T
%token BOOL_T INT_T DOUBLE_T STRING_T ASSET_T HASH_T AMOUNT_T PUBKEY_T SIG_T HEX_T

%type <expression> expr bool_expr func_call_expr literal
%type <declaration> variable_declaration variable_declaration_list
%type <statement> stmt if_stmt return_stmt declaration_stmt variable_declaration_stmt const_stmt
%type <statement> stmt if_stmt return_stmt declaration_stmt assign_stmt compound_assign_stmt variable_declaration_stmt const_stmt
%type <statement_list> stmt_list
%type <block> block
%type <elseif> elseif elseif_list
Expand All @@ -44,7 +44,7 @@ int yyerror(const char *s);
%type <definition_list> definition_list
%type <argument_list> argument_list

%nonassoc '=' DECL_ASSIGN
%nonassoc '=' ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN DECL_ASSIGN
%left AND OR
%nonassoc EQ NE
%nonassoc '>' '<' LE GE
Expand Down Expand Up @@ -100,14 +100,26 @@ stmt_list:
;

stmt:
IDENTIFIER '=' expr { $$ = alloc_assign_stmt($1, $3); }
| expr { $$ = alloc_expression_stmt($1); }
expr { $$ = alloc_expression_stmt($1); }
| block { $$ = alloc_block_stmt($1); }
| assign_stmt
| if_stmt
| declaration_stmt
| return_stmt
;

assign_stmt:
IDENTIFIER '=' expr { $$ = alloc_assign_stmt($1, $3); }
| compound_assign_stmt
;

compound_assign_stmt:
IDENTIFIER ADD_ASSIGN expr { $$ = alloc_compound_assign_stmt($1, ADD_EXPRESSION, $3); }
| IDENTIFIER SUB_ASSIGN expr { $$ = alloc_compound_assign_stmt($1, SUB_EXPRESSION, $3); }
| IDENTIFIER MUL_ASSIGN expr { $$ = alloc_compound_assign_stmt($1, MUL_EXPRESSION, $3); }
| IDENTIFIER DIV_ASSIGN expr { $$ = alloc_compound_assign_stmt($1, DIV_EXPRESSION, $3); }
;

const_stmt:
CONST IDENTIFIER '=' expr { $$ = alloc_const_declaration_stmt($2, NULL, $4); }
| CONST IDENTIFIER type_specifier '=' expr { $$ = alloc_const_declaration_stmt($2, $3, $5); }
Expand Down Expand Up @@ -139,6 +151,12 @@ type_specifier:
| INT_T { $$ = alloc_type_specifier(INT_TYPE, NULL); }
| DOUBLE_T { $$ = alloc_type_specifier(DOUBLE_TYPE, NULL); }
| STRING_T { $$ = alloc_type_specifier(STRING_TYPE, NULL); }
| ASSET_T { $$ = alloc_type_specifier(ASSET_TYPE, NULL); }
| HASH_T { $$ = alloc_type_specifier(HASH_TYPE, NULL); }
| AMOUNT_T { $$ = alloc_type_specifier(AMOUNT_TYPE, NULL); }
| PUBKEY_T { $$ = alloc_type_specifier(PUBKEY_TYPE, NULL); }
| SIG_T { $$ = alloc_type_specifier(SIG_TYPE, NULL); }
| HEX_T { $$ = alloc_type_specifier(HEX_TYPE, NULL); }
;

return_stmt:
Expand Down
9 changes: 9 additions & 0 deletions compiler/lex.l
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ void lex_err(char *str) {
}

":=" return DECL_ASSIGN;
"+=" return ADD_ASSIGN;
"-=" return SUB_ASSIGN;
"*=" return MUL_ASSIGN;
"/=" return DIV_ASSIGN;
">=" return GE;
"<=" return LE;
"==" return EQ;
Expand All @@ -78,6 +82,11 @@ void lex_err(char *str) {
"int" return INT_T;
"double" return DOUBLE_T;
"string" return STRING_T;
"asset" return ASSET_T;
"hash" return HASH_T;
"amount" return AMOUNT_T;
"pubkey" return PUBKEY_T;
"hex" return HEX_T;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"sig" return SIG_T;

"true"|"false" {
yylval.int_value = strcmp(yytext, "false");
Expand Down
8 changes: 8 additions & 0 deletions compiler/summoner.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ typedef enum
INT_TYPE,
DOUBLE_TYPE,
STRING_TYPE,
ASSET_TYPE,
HASH_TYPE,
AMOUNT_TYPE,
PUBKEY_TYPE,
SIG_TYPE,
HEX_TYPE,
VOID_TYPE,
STRUCT_TYPE,
} BasicType;

Expand Down Expand Up @@ -159,6 +166,7 @@ typedef struct IfStatement

Statement *alloc_stmt(StatementKind kind);
Statement *alloc_assign_stmt(char *variable, Expression *operand);
Statement *alloc_compound_assign_stmt(char *variable, ExpressionKind kind, Expression *operand);
Statement *alloc_block_stmt(Block *block);
Statement *alloc_if_stmt(Expression *condition, Block *then_block, Elseif *elseif_list, Block *else_block);
Declaration *alloc_declaration(char *name, TypeSpecifier *type, Expression *initializer);
Expand Down
6 changes: 6 additions & 0 deletions include/share.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef PRIVATE_SHARE_H_INCLUDED
#define PRIVATE_SHARE_H_INCLUDED

#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))

#endif