logic recognized; +registers; +machine block
This commit is contained in:
@ -16,8 +16,7 @@ procedure highlight
|
||||
s32 byte
|
||||
begin
|
||||
loop
|
||||
if
|
||||
/* byte = 0x90 */
|
||||
if byte = 0x90
|
||||
then
|
||||
fastcall echo_new_line
|
||||
fastcall terminal_style EFFECT_NORMAL COLOUR_YELLOW
|
||||
@ -27,8 +26,7 @@ begin
|
||||
fastcall echo_byte [buffer + offset]
|
||||
end if
|
||||
inc offset
|
||||
if
|
||||
/* offset = size */
|
||||
if offset = size
|
||||
then
|
||||
break
|
||||
end if
|
||||
@ -43,8 +41,7 @@ program xop
|
||||
|
||||
u8 buffer = 0
|
||||
begin
|
||||
if
|
||||
/* argc != 2 */
|
||||
if ! argc = 2
|
||||
then
|
||||
fastcall fatal_failure 1 "xop: xop input"
|
||||
end if
|
||||
@ -69,5 +66,9 @@ begin
|
||||
fastcall deallocate buffer
|
||||
mov buffer rax
|
||||
|
||||
exit SUCCESS
|
||||
machine
|
||||
0x90
|
||||
end machine
|
||||
|
||||
exit 0
|
||||
end program
|
||||
|
@ -43,7 +43,10 @@ procedure{wsnl}+ { return PROCEDURE; }
|
||||
loop{wsnl}+ { return TLOOP; }
|
||||
if{wsnl}+ { return IF; }
|
||||
then{wsnl}+ { return THEN; }
|
||||
machine{wsnl}+ { return MACHINE; }
|
||||
|
||||
break{wsnl}+ { return BREAK; }
|
||||
exit{wsnl}+ { return EXIT; }
|
||||
|
||||
end { BEGIN IN_END; }
|
||||
|
||||
@ -52,6 +55,7 @@ program { BEGIN INITIAL; return END_PROGRAM; }
|
||||
procedure { BEGIN INITIAL; return END_PROCEDURE; }
|
||||
loop { BEGIN INITIAL; return END_LOOP; }
|
||||
if { BEGIN INITIAL; return END_IF; }
|
||||
machine { BEGIN INITIAL; return END_MACHINE; }
|
||||
{wsnl} { ; }
|
||||
. { yyerror(); }
|
||||
}
|
||||
@ -59,17 +63,37 @@ if { BEGIN INITIAL; return END_IF; }
|
||||
fast{wsnl}+ { return FAST; }
|
||||
unix{wsnl}+ { return UNIX; }
|
||||
|
||||
\$rax{wsnl}+ { return RAX; }
|
||||
\$rbx{wsnl}+ { return RBX; }
|
||||
\$rcx{wsnl}+ { return RCX; }
|
||||
\$rdx{wsnl}+ { return RDX; }
|
||||
\$rbp{wsnl}+ { return RBP; }
|
||||
\$rsp{wsnl}+ { return RSP; }
|
||||
\$rip{wsnl}+ { return RIP; }
|
||||
\$rax{wsnl}+ { return RAX; }
|
||||
\$rbx{wsnl}+ { return RBX; }
|
||||
\$rcx{wsnl}+ { return RCX; }
|
||||
\$rdx{wsnl}+ { return RDX; }
|
||||
\$rbp{wsnl}+ { return RBP; }
|
||||
\$rsp{wsnl}+ { return RSP; }
|
||||
\$rip{wsnl}+ { return RIP; }
|
||||
\$rsi{wsnl}+ { return RSI; }
|
||||
\$rdi{wsnl}+ { return RDI; }
|
||||
\$r8{wsnl}+ { return RG8; }
|
||||
\$r9{wsnl}+ { return RG9; }
|
||||
\$r10{wsnl}+ { return RG10; }
|
||||
\$r11{wsnl}+ { return RG11; }
|
||||
\$r12{wsnl}+ { return RG12; }
|
||||
\$r13{wsnl}+ { return RG13; }
|
||||
\$r14{wsnl}+ { return RG14; }
|
||||
\$xmm0{wsnl}+ { return RGXMM0; }
|
||||
\$xmm1{wsnl}+ { return RGXMM1; }
|
||||
\$xmm2{wsnl}+ { return RGXMM2; }
|
||||
\$xmm3{wsnl}+ { return RGXMM3; }
|
||||
\$xmm4{wsnl}+ { return RGXMM4; }
|
||||
\$xmm5{wsnl}+ { return RGXMM5; }
|
||||
\$xmm6{wsnl}+ { return RGXMM6; }
|
||||
\$xmm7{wsnl}+ { return RGXMM7; }
|
||||
|
||||
in{wsnl}+ { return TIN; }
|
||||
\= { return '='; }
|
||||
|
||||
\!\= { return NEQ; }
|
||||
\! { return TNOT; }
|
||||
|
||||
s8{wsnl}+ { return S8; }
|
||||
s16{wsnl}+ { return S16; }
|
||||
s32{wsnl}+ { return S32; }
|
||||
|
@ -57,7 +57,9 @@
|
||||
%token PROCEDURE END_PROCEDURE
|
||||
%token TLOOP END_LOOP
|
||||
%token IF THEN ELSE END_IF
|
||||
%token BREAK
|
||||
%token MACHINE END_MACHINE
|
||||
|
||||
%token EXIT BREAK
|
||||
|
||||
%token<strval> IDENTIFIER
|
||||
|
||||
@ -68,6 +70,10 @@
|
||||
|
||||
%token UNIX
|
||||
|
||||
// Logic
|
||||
%token NEQ TNOT
|
||||
//%token TOR TXOR // these are (in)conveniently instructions too
|
||||
|
||||
// Type info
|
||||
%token TIN
|
||||
%token S8 S16 S32 S64
|
||||
@ -77,8 +83,11 @@
|
||||
// Registers
|
||||
%type<intval> register
|
||||
|
||||
%token RAX RBX RCX RDX
|
||||
%token RBP RSP RIP
|
||||
%token RAX RBX RCX RDX
|
||||
%token RSI RDI
|
||||
%token RG8 RG9 RG10 RG11 RG12 RG13 RG14 RG15
|
||||
%token RGXMM0 RGXMM1 RGXMM2 RGXMM3 RGXMM4 RGXMM5 RGXMM6 RGXMM7
|
||||
|
||||
// Instructions
|
||||
%token TADD TOR TADC TBB TXOR TAND TSUB TCMP TSYSCALL TINC
|
||||
@ -133,10 +142,12 @@ type: S8 { $$ = (static_variable){ .is_signed = 1, .size = 8, .address = new
|
||||
;
|
||||
|
||||
code: %empty
|
||||
| loop code
|
||||
| if code
|
||||
| call code
|
||||
| loop code
|
||||
| if code
|
||||
| call code
|
||||
| machine code
|
||||
| BREAK code
|
||||
| exit code
|
||||
| TXOR register register code { /* assemble_xor(size_64b, type_register_register, $2, $3); */ }
|
||||
| TXOR register immediate code { /* assemble_xor(size_64b, type_register_register, $2, $3); */ }
|
||||
| TXOR IDENTIFIER register code { /* assemble_xor(size_64b, type_register_register, $2, $3); */ free($2); }
|
||||
@ -151,7 +162,33 @@ if: IF logic THEN code END_IF
|
||||
| IF logic THEN code ELSE code END_IF
|
||||
;
|
||||
|
||||
logic: %empty /* XXX */
|
||||
logic: logical_operand TAND logical_operand
|
||||
| logical_operand TOR logical_operand
|
||||
| logical_operand TXOR logical_operand
|
||||
| logical_operand '=' logical_operand
|
||||
| logical_operand NEQ logical_operand
|
||||
| TNOT logic
|
||||
;
|
||||
|
||||
sublogic: '(' logic ')'
|
||||
;
|
||||
|
||||
logical_operand: operand
|
||||
| sublogic
|
||||
;
|
||||
|
||||
operand: immediate
|
||||
| register
|
||||
| IDENTIFIER
|
||||
;
|
||||
|
||||
machine: MACHINE machine_code END_MACHINE
|
||||
;
|
||||
|
||||
machine_code: %empty
|
||||
| LITERAL machine_code
|
||||
| STRING_LITERAL machine_code
|
||||
| IDENTIFIER machine_code { free($1); }
|
||||
;
|
||||
|
||||
call: calltype IDENTIFIER arguments { free($2); }
|
||||
@ -167,10 +204,36 @@ arguments: %empty
|
||||
| immediate arguments
|
||||
;
|
||||
|
||||
register: RAX { $$ = R0; }
|
||||
| RBX { $$ = R1; }
|
||||
register: RAX { $$ = R0; }
|
||||
| RBX { $$ = R1; }
|
||||
| RCX { $$ = R2; }
|
||||
| RDX { $$ = R3; }
|
||||
| RSI { $$ = R4; }
|
||||
| RDI { $$ = R5; }
|
||||
| RBP { $$ = R6; }
|
||||
| RSP { $$ = R7; }
|
||||
| RG8 { $$ = R8; }
|
||||
| RG9 { $$ = R9; }
|
||||
| RG10 { $$ = R10; }
|
||||
| RG11 { $$ = R11; }
|
||||
| RG12 { $$ = R12; }
|
||||
| RG13 { $$ = R13; }
|
||||
| RG14 { $$ = R14; }
|
||||
| RG15 { $$ = R15; }
|
||||
| RGXMM0 { $$ = 0; } /* XXX */
|
||||
| RGXMM1 { $$ = 0; }
|
||||
| RGXMM2 { $$ = 0; }
|
||||
| RGXMM3 { $$ = 0; }
|
||||
| RGXMM4 { $$ = 0; }
|
||||
| RGXMM5 { $$ = 0; }
|
||||
| RGXMM6 { $$ = 0; }
|
||||
| RGXMM7 { $$ = 0; }
|
||||
;
|
||||
|
||||
immediate: LITERAL
|
||||
;
|
||||
|
||||
exit: EXIT immediate
|
||||
| EXIT IDENTIFIER
|
||||
;
|
||||
%%
|
||||
|
Reference in New Issue
Block a user