Adapting for Ethereym as a library style:
+ Serpent remove - should not be there
This commit is contained in:
parent
28012ac1c8
commit
a7ef7d4f7e
|
@ -1,242 +0,0 @@
|
||||||
|
|
||||||
// www.ethereumj.com
|
|
||||||
// @author Roman Mandeleil
|
|
||||||
// Created on: 22/03/2014 19:22
|
|
||||||
grammar Serpent;
|
|
||||||
|
|
||||||
tokens {
|
|
||||||
INDENT, DEDENT }
|
|
||||||
@lexer::header {
|
|
||||||
import com.yuvalshavit.antlr4.DenterHelper;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@lexer::members {
|
|
||||||
private final DenterHelper denter = new DenterHelper(NL, SerpentParser.INDENT, SerpentParser.DEDENT) {
|
|
||||||
@Override
|
|
||||||
public Token pullToken() {
|
|
||||||
return SerpentLexer.super.nextToken(); // must be to super.nextToken, or we'll recurse forever!
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Token nextToken() {
|
|
||||||
return denter.nextToken();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
parse: block EOF
|
|
||||||
;
|
|
||||||
|
|
||||||
parse_init_code_block : 'init' ':' INDENT block DEDENT 'code' ':' INDENT block DEDENT;
|
|
||||||
|
|
||||||
block: ( asm | array_assign | assign | contract_storage_assign | special_func | if_elif_else_stmt |
|
|
||||||
while_stmt | ret_func_1 | ret_func_2 | suicide_func | stop_func | single_send_func | msg_func |
|
|
||||||
single_create_func)* ;
|
|
||||||
|
|
||||||
|
|
||||||
asm: '[asm' asm_symbol 'asm]' NL;
|
|
||||||
asm_symbol: (ASM_SYMBOLS | INT | HEX_NUMBER)* ;
|
|
||||||
|
|
||||||
if_elif_else_stmt: 'if' condition ':' INDENT block DEDENT
|
|
||||||
('elif' condition ':' INDENT block DEDENT)*
|
|
||||||
('else:' INDENT block DEDENT)?
|
|
||||||
;
|
|
||||||
|
|
||||||
while_stmt: 'while' condition ':' INDENT block DEDENT;
|
|
||||||
|
|
||||||
|
|
||||||
/* special functions */
|
|
||||||
|
|
||||||
special_func :
|
|
||||||
msg_datasize |
|
|
||||||
msg_sender |
|
|
||||||
msg_value |
|
|
||||||
tx_gasprice |
|
|
||||||
tx_origin |
|
|
||||||
tx_gas |
|
|
||||||
contract_balance |
|
|
||||||
contract_address |
|
|
||||||
block_prevhash |
|
|
||||||
block_coinbase |
|
|
||||||
block_timestamp |
|
|
||||||
block_number |
|
|
||||||
block_difficulty |
|
|
||||||
block_gaslimit
|
|
||||||
;
|
|
||||||
|
|
||||||
msg_datasize
|
|
||||||
: 'msg.datasize' ;
|
|
||||||
|
|
||||||
msg_sender
|
|
||||||
: 'msg.sender' ;
|
|
||||||
|
|
||||||
msg_value
|
|
||||||
: 'msg.value' ;
|
|
||||||
|
|
||||||
tx_gasprice
|
|
||||||
: 'tx.gasprice' ;
|
|
||||||
|
|
||||||
tx_origin
|
|
||||||
: 'tx.origin' ;
|
|
||||||
|
|
||||||
tx_gas
|
|
||||||
: 'tx.gas' ;
|
|
||||||
|
|
||||||
contract_balance
|
|
||||||
: 'contract.balance' ;
|
|
||||||
|
|
||||||
contract_address
|
|
||||||
: 'contract.address' ;
|
|
||||||
|
|
||||||
block_prevhash
|
|
||||||
: 'block.prevhash' ;
|
|
||||||
|
|
||||||
block_coinbase
|
|
||||||
: 'block.coinbase' ;
|
|
||||||
|
|
||||||
block_timestamp
|
|
||||||
: 'block.timestamp' ;
|
|
||||||
|
|
||||||
block_number
|
|
||||||
: 'block.number' ;
|
|
||||||
|
|
||||||
block_difficulty
|
|
||||||
: 'block.difficulty' ;
|
|
||||||
|
|
||||||
block_gaslimit
|
|
||||||
: 'block.gaslimit' ;
|
|
||||||
|
|
||||||
msg_func: 'msg' '(' int_val ',' int_val ',' int_val ',' arr_def ',' int_val ',' int_val')' ;
|
|
||||||
|
|
||||||
send_func: 'send' '(' int_val ',' int_val ',' int_val ')';
|
|
||||||
single_send_func: send_func NL;
|
|
||||||
|
|
||||||
create_func: 'create' '(' int_val ',' int_val ',' int_val ')';
|
|
||||||
single_create_func: create_func NL;
|
|
||||||
|
|
||||||
msg_data: 'msg.data' '[' expression ']' ;
|
|
||||||
|
|
||||||
array_assign: VAR '[' int_val ']' EQ_OP expression NL;
|
|
||||||
array_retreive: VAR '[' int_val ']';
|
|
||||||
|
|
||||||
assign: VAR EQ_OP (expression | arr_def | msg_func) NL;
|
|
||||||
arr_def : '[' (int_val ','?)* ']';
|
|
||||||
|
|
||||||
|
|
||||||
contract_storage_assign: 'contract.storage' '[' expression ']' EQ_OP expression NL;
|
|
||||||
contract_storage_load: 'contract.storage' '[' expression ']';
|
|
||||||
|
|
||||||
|
|
||||||
mul_expr
|
|
||||||
: int_val
|
|
||||||
| mul_expr OP_MUL int_val
|
|
||||||
;
|
|
||||||
|
|
||||||
add_expr
|
|
||||||
: mul_expr
|
|
||||||
| add_expr OP_ADD mul_expr
|
|
||||||
;
|
|
||||||
|
|
||||||
rel_exp
|
|
||||||
: add_expr
|
|
||||||
| rel_exp OP_REL add_expr
|
|
||||||
;
|
|
||||||
|
|
||||||
eq_exp
|
|
||||||
: rel_exp
|
|
||||||
| eq_exp OP_EQ rel_exp
|
|
||||||
;
|
|
||||||
|
|
||||||
and_exp
|
|
||||||
: eq_exp
|
|
||||||
| and_exp OP_AND eq_exp
|
|
||||||
;
|
|
||||||
|
|
||||||
ex_or_exp
|
|
||||||
: and_exp
|
|
||||||
| ex_or_exp OP_EX_OR and_exp
|
|
||||||
;
|
|
||||||
|
|
||||||
in_or_exp
|
|
||||||
: ex_or_exp
|
|
||||||
| in_or_exp OP_IN_OR ex_or_exp
|
|
||||||
;
|
|
||||||
|
|
||||||
log_and_exp
|
|
||||||
: in_or_exp
|
|
||||||
| log_and_exp OP_LOG_AND in_or_exp
|
|
||||||
;
|
|
||||||
|
|
||||||
log_or_exp
|
|
||||||
: log_and_exp
|
|
||||||
| log_or_exp OP_LOG_OR log_and_exp
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
expression : log_or_exp ;
|
|
||||||
|
|
||||||
condition: expression ;
|
|
||||||
|
|
||||||
|
|
||||||
int_val : INT |
|
|
||||||
hex_num |
|
|
||||||
get_var |
|
|
||||||
special_func |
|
|
||||||
'(' expression ')' |
|
|
||||||
OP_NOT '(' expression ')' |
|
|
||||||
msg_data |
|
|
||||||
send_func |
|
|
||||||
contract_storage_load |
|
|
||||||
array_retreive
|
|
||||||
;
|
|
||||||
|
|
||||||
hex_num
|
|
||||||
: HEX_NUMBER
|
|
||||||
;
|
|
||||||
|
|
||||||
ret_func_1: 'return' '(' expression ')' NL;
|
|
||||||
ret_func_2: 'return' '(' expression ',' expression ')' NL;
|
|
||||||
suicide_func: 'suicide' '(' expression ')' NL;
|
|
||||||
stop_func: 'stop' NL;
|
|
||||||
|
|
||||||
get_var: VAR;
|
|
||||||
|
|
||||||
INT: [0-9]+;
|
|
||||||
|
|
||||||
|
|
||||||
ASM_SYMBOLS: 'STOP' | 'ADD' | 'MUL' | 'SUB' | 'DIV' | 'SDIV' | 'MOD' |'SMOD' | 'EXP' | 'NEG' | 'LT' | 'GT' | 'SLT' | 'SGT'| 'EQ' | 'NOT' | 'AND' | 'OR' | 'XOR' | 'BYTE' | 'SHA3' | 'ADDRESS' | 'BALANCE' | 'ORIGIN' | 'CALLER' | 'CALLVALUE' | 'CALLDATALOAD' | 'CALLDATASIZE' | 'CALLDATACOPY' | 'CODESIZE' | 'CODECOPY' | 'GASPRICE' | 'PREVHASH' | 'COINBASE' | 'TIMESTAMP' | 'NUMBER' | 'DIFFICULTY' | 'GASLIMIT' | 'POP' | 'DUP' | 'SWAP' | 'MLOAD' | 'MSTORE' | 'MSTORE8' | 'SLOAD' | 'SSTORE' | 'JUMP' | 'JUMPI' | 'PC' | 'MSIZE' | 'GAS' | 'PUSH1' | 'PUSH2' | 'PUSH3' | 'PUSH4' | 'PUSH5' | 'PUSH6' | 'PUSH7' | 'PUSH8' | 'PUSH9' | 'PUSH10' | 'PUSH11' | 'PUSH12' | 'PUSH13' | 'PUSH14' | 'PUSH15' | 'PUSH16' | 'PUSH17' | 'PUSH18' | 'PUSH19' | 'PUSH20' | 'PUSH21' | 'PUSH22' | 'PUSH23' | 'PUSH24' | 'PUSH25' | 'PUSH26' | 'PUSH27' | 'PUSH28' | 'PUSH29' | 'PUSH30' | 'PUSH31' | 'PUSH32' | 'CREATE' | 'CALL' | 'RETURN' | 'SUICIDE';
|
|
||||||
|
|
||||||
|
|
||||||
/* 'xor', 'and', 'or', 'not' operands should be defined
|
|
||||||
first among lexer rules because it
|
|
||||||
can be mismatched as a var lexa */
|
|
||||||
OP_EX_OR: 'xor';
|
|
||||||
OP_LOG_AND: '&&' | 'and';
|
|
||||||
OP_LOG_OR: '||' | 'or';
|
|
||||||
OP_NOT: '!' | 'not';
|
|
||||||
|
|
||||||
|
|
||||||
EQ_OP: '=' ;
|
|
||||||
|
|
||||||
NL: ('\r'? '\n' ' '*); // note the ' '*;
|
|
||||||
WS: [ \t]+ -> skip;
|
|
||||||
LINE_COMMENT: '//' ~[\r\n]* -> skip;
|
|
||||||
|
|
||||||
VAR: [a-zA-Z][a-zA-Z0-9]* ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
OP_ADD : '+' | '-';
|
|
||||||
OP_MUL : '*' | '/' | '^' | '%' | '#/' | '#%' ;
|
|
||||||
|
|
||||||
OP_REL : '<' | '>' | '<=' | '>=';
|
|
||||||
OP_EQ : '==' | '!=';
|
|
||||||
OP_AND: '&';
|
|
||||||
OP_IN_OR: '|';
|
|
||||||
|
|
||||||
|
|
||||||
HEX_DIGIT : [0-9a-fA-F];
|
|
||||||
HEX_NUMBER : ('0x' | '0X' )HEX_DIGIT+;
|
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
OP_IN_OR=53
|
|
||||||
T__29=7
|
|
||||||
EQ_OP=43
|
|
||||||
T__28=8
|
|
||||||
T__27=9
|
|
||||||
OP_AND=52
|
|
||||||
T__26=10
|
|
||||||
T__25=11
|
|
||||||
T__24=12
|
|
||||||
T__23=13
|
|
||||||
T__22=14
|
|
||||||
T__21=15
|
|
||||||
T__20=16
|
|
||||||
OP_MUL=49
|
|
||||||
DEDENT=57
|
|
||||||
T__9=27
|
|
||||||
T__8=28
|
|
||||||
T__7=29
|
|
||||||
INDENT=56
|
|
||||||
T__6=30
|
|
||||||
T__5=31
|
|
||||||
T__4=32
|
|
||||||
T__19=17
|
|
||||||
OP_EQ=51
|
|
||||||
T__16=20
|
|
||||||
T__15=21
|
|
||||||
T__18=18
|
|
||||||
T__17=19
|
|
||||||
T__12=24
|
|
||||||
T__11=25
|
|
||||||
T__14=22
|
|
||||||
T__13=23
|
|
||||||
T__10=26
|
|
||||||
OP_EX_OR=39
|
|
||||||
OP_NOT=42
|
|
||||||
VAR=47
|
|
||||||
NL=44
|
|
||||||
LINE_COMMENT=46
|
|
||||||
OP_LOG_OR=41
|
|
||||||
OP_ADD=48
|
|
||||||
HEX_DIGIT=54
|
|
||||||
INT=37
|
|
||||||
T__30=6
|
|
||||||
T__31=5
|
|
||||||
T__32=4
|
|
||||||
T__33=3
|
|
||||||
WS=45
|
|
||||||
T__34=2
|
|
||||||
T__35=1
|
|
||||||
T__1=35
|
|
||||||
T__0=36
|
|
||||||
T__3=33
|
|
||||||
T__2=34
|
|
||||||
ASM_SYMBOLS=38
|
|
||||||
HEX_NUMBER=55
|
|
||||||
OP_REL=50
|
|
||||||
OP_LOG_AND=40
|
|
||||||
'|'=53
|
|
||||||
'code'=36
|
|
||||||
'block.number'=35
|
|
||||||
'block.gaslimit'=34
|
|
||||||
'asm]'=33
|
|
||||||
'contract.balance'=32
|
|
||||||
'msg.sender'=31
|
|
||||||
'='=43
|
|
||||||
'return'=30
|
|
||||||
'elif'=29
|
|
||||||
'create'=28
|
|
||||||
'msg.data'=27
|
|
||||||
'tx.origin'=26
|
|
||||||
'else:'=25
|
|
||||||
'tx.gasprice'=24
|
|
||||||
')'=23
|
|
||||||
'xor'=39
|
|
||||||
'msg.datasize'=22
|
|
||||||
'block.difficulty'=21
|
|
||||||
'suicide'=20
|
|
||||||
'block.prevhash'=18
|
|
||||||
'contract.storage'=19
|
|
||||||
'init'=17
|
|
||||||
'msg.value'=16
|
|
||||||
'[asm'=15
|
|
||||||
'contract.address'=14
|
|
||||||
'block.timestamp'=13
|
|
||||||
'send'=12
|
|
||||||
'if'=11
|
|
||||||
'('=10
|
|
||||||
':'=9
|
|
||||||
'['=8
|
|
||||||
'while'=7
|
|
||||||
'tx.gas'=6
|
|
||||||
'msg'=5
|
|
||||||
','=4
|
|
||||||
'block.coinbase'=3
|
|
||||||
'&'=52
|
|
||||||
'stop'=2
|
|
||||||
']'=1
|
|
|
@ -1,95 +0,0 @@
|
||||||
OP_IN_OR=53
|
|
||||||
T__29=7
|
|
||||||
EQ_OP=43
|
|
||||||
T__28=8
|
|
||||||
T__27=9
|
|
||||||
OP_AND=52
|
|
||||||
T__26=10
|
|
||||||
T__25=11
|
|
||||||
T__24=12
|
|
||||||
T__23=13
|
|
||||||
T__22=14
|
|
||||||
T__21=15
|
|
||||||
T__20=16
|
|
||||||
OP_MUL=49
|
|
||||||
T__9=27
|
|
||||||
T__8=28
|
|
||||||
T__7=29
|
|
||||||
T__6=30
|
|
||||||
T__5=31
|
|
||||||
T__4=32
|
|
||||||
T__19=17
|
|
||||||
OP_EQ=51
|
|
||||||
T__16=20
|
|
||||||
T__15=21
|
|
||||||
T__18=18
|
|
||||||
T__17=19
|
|
||||||
T__12=24
|
|
||||||
T__11=25
|
|
||||||
T__14=22
|
|
||||||
T__13=23
|
|
||||||
T__10=26
|
|
||||||
OP_EX_OR=39
|
|
||||||
OP_NOT=42
|
|
||||||
VAR=47
|
|
||||||
NL=44
|
|
||||||
LINE_COMMENT=46
|
|
||||||
OP_LOG_OR=41
|
|
||||||
OP_ADD=48
|
|
||||||
HEX_DIGIT=54
|
|
||||||
INT=37
|
|
||||||
T__30=6
|
|
||||||
T__31=5
|
|
||||||
T__32=4
|
|
||||||
T__33=3
|
|
||||||
WS=45
|
|
||||||
T__34=2
|
|
||||||
T__35=1
|
|
||||||
T__1=35
|
|
||||||
T__0=36
|
|
||||||
T__3=33
|
|
||||||
T__2=34
|
|
||||||
ASM_SYMBOLS=38
|
|
||||||
HEX_NUMBER=55
|
|
||||||
OP_REL=50
|
|
||||||
OP_LOG_AND=40
|
|
||||||
'|'=53
|
|
||||||
'code'=36
|
|
||||||
'block.number'=35
|
|
||||||
'block.gaslimit'=34
|
|
||||||
'asm]'=33
|
|
||||||
'contract.balance'=32
|
|
||||||
'msg.sender'=31
|
|
||||||
'='=43
|
|
||||||
'return'=30
|
|
||||||
'elif'=29
|
|
||||||
'create'=28
|
|
||||||
'msg.data'=27
|
|
||||||
'tx.origin'=26
|
|
||||||
'else:'=25
|
|
||||||
'tx.gasprice'=24
|
|
||||||
')'=23
|
|
||||||
'xor'=39
|
|
||||||
'msg.datasize'=22
|
|
||||||
'block.difficulty'=21
|
|
||||||
'suicide'=20
|
|
||||||
'block.prevhash'=18
|
|
||||||
'contract.storage'=19
|
|
||||||
'init'=17
|
|
||||||
'msg.value'=16
|
|
||||||
'[asm'=15
|
|
||||||
'contract.address'=14
|
|
||||||
'block.timestamp'=13
|
|
||||||
'send'=12
|
|
||||||
'if'=11
|
|
||||||
'('=10
|
|
||||||
':'=9
|
|
||||||
'['=8
|
|
||||||
'while'=7
|
|
||||||
'tx.gas'=6
|
|
||||||
'msg'=5
|
|
||||||
','=4
|
|
||||||
'block.coinbase'=3
|
|
||||||
'&'=52
|
|
||||||
'stop'=2
|
|
||||||
']'=1
|
|
Loading…
Reference in New Issue