new language idea

This commit is contained in:
pommicket 2022-01-05 18:19:28 -05:00
parent ea3c931992
commit 6a31b0560a
2 changed files with 34 additions and 38 deletions

View file

@ -243,7 +243,6 @@ align
reserve d8
:handle_global
xcc
; ignore if this is the second pass
C=:second_pass
C=1C
@ -262,6 +261,7 @@ align
8C=I
J=:global_variables
D=d5
call :ident_lookup
C=A
?C!0:global_redeclaration
@ -458,17 +458,15 @@ align
; look up identifier rsi in list rdi with separation rdx between entries
; returns address of whatever's right after the identifier in the list, or 0 if not found
:ident_lookup
C=:second_pass
C=1C
; use default of 1 on first pass
?C=0:return_1
C=:ident_lookup_sep
8C=D
C=:ident_lookup_i
8C=I
:ident_lookup_loop
; check if reached the end of the table
C=1J
?C=0:return_0
I=:ident_lookup_i
I=8I
call :ident=
@ -485,9 +483,6 @@ align
C=:ident_lookup_sep
C=8C
J+=C
; check if reached the end of the table
C=1J
?C=0:return_0
!:ident_lookup_loop
; can the character in rbx appear in an identifier?
@ -525,8 +520,8 @@ align
; variable
J=:local_variables
D=d5
xcc
D=d5
call :ident_lookup
C=A
?C=0:rax2term_try_global

View file

@ -1,4 +1,3 @@
; types: char, short, int, long, *type
; declaration:
; global <type> <name>
; local <type> <name>
@ -11,7 +10,7 @@
; <lvalue> += <rvalue>
; <lvalue> -= <rvalue>
; <function>(<term>, <term>, ...)
; syscall <term>, <term>, ...
; syscall <term> <term> ...
; return <rvalue>
; byte <number>
; term:
@ -29,7 +28,7 @@
; `<string>`
; <var>
; &<var>
; *<var>
; *1 <var> / *2 <var> / *4 <var> / *8 <var>
; <var>[<term>]
; ~<var>
; <function>(<term>, <term>, ...)
@ -48,18 +47,20 @@
main() ; hello
global char x
global short y ;123
global long z
global x
global y ;123
global z
:strlen
function
argument *char s
local long len
local char c
argument s
local len
local c
local p
len = 0
:strlen_loop
c = s[len]
p = s + len
c = *1 p
if c == 0 goto strlen_loop_end
len += 1
goto strlen_loop
@ -68,40 +69,40 @@ function
:putc
function
argument char c
local *char p
argument c
local p
p = &c
syscall 1, 1, p, 1, 0, 0, 0, 0
syscall 1 1 p 1 0 0 0 0
return
:puts
function
argument *char s
local long len
argument s
local len
len = strlen(s)
syscall 1, 1, s, len, 0, 0, 0, 0
syscall 1 1 s len 0 0 0 0
return
:main
function
local *char hello
local hello
hello = `Hello, world!
`
puts(hello)
syscall 0x3c, 0, 0, 0, 0, 0, 0, 0
syscall 0x3c 0 0 0 0 0 0 0
:f
function
argument *long x
argument *long y
local long v
local *long p
v = *x
p = *y
*p = v
argument x
argument y
local v
local p
v = *4x
p = *8y
*4p = v
if v == 0 goto something
p[1] = v + 1
return p[2]
*1p = v + 1
return *2p
:something
return p[1]
return *4p