fortran-wasm-compiler/compiler.f90

278 lines
15 KiB
Fortran

module tokenizer_mod
implicit none
type token
character(:), allocatable :: type
character(:), allocatable :: value
integer :: index
end type token
contains
type(token) function init_token(type, value, index) result(this)
character(:), allocatable :: type
character(:), allocatable :: value
integer :: index
this%type = type
this%value = value
this%index = index
end function
function tokenize(code) result(tokens)
character(:), allocatable :: code
type(token), dimension(:), allocatable :: tokens
integer :: pos1 = 1, pos2
do
pos2 = scan(code(pos1:), " \n\t\v\f\r")
if (pos2 == 0) then
tokens = [tokens, token("expression", code(pos1:), pos1)]
return
end if
tokens = [tokens, token("expression", code(pos1:pos1+pos2-2), pos1)]
pos1 = pos2+pos1
end do
end function tokenize
pure logical function isAlpha(c)
character, intent(in) :: c
isAlpha = (c .ge. 'a' .and. c .le. 'z') .or. (c .ge. 'A' .and. c .le. 'Z') .or. c .eq. '_' .or. c .eq. "'" .or. c .eq. '?'
end function isAlpha
pure logical function isDigit(c)
character, intent(in) :: c
isDigit = (c .ge. '0' .and. c .le. '9') .or. c .eq. '-'
end function isDigit
end module tokenizer_mod
module parser_mod
implicit none
contains
end module parser_mod
module opcodes_mod
implicit none
character, parameter :: UNREACHABLE = achar(0)
character, parameter :: NOP = achar(1)
character, parameter :: BLOCK = achar(2)
character, parameter :: LOOP = achar(3)
character, parameter :: IF = achar(4)
character, parameter :: ELSE = achar(5)
character, parameter :: TRY = achar(6) ! PROPOSED
character, parameter :: CATCH = achar(7) ! PROPOSED
character, parameter :: THROW = achar(8) ! PROPOSED
character, parameter :: RETHROW = achar(9) ! PROPOSED
character, parameter :: BR_ON_EXN = achar(10) ! PROPOSED
character, parameter :: END = achar(11)
character, parameter :: BR = achar(12)
character, parameter :: BR_IF = achar(13)
character, parameter :: BR_TABLE = achar(14)
character, parameter :: RETURN = achar(15)
character, parameter :: CALL = achar(16)
character, parameter :: CALL_INDIRECT = achar(17)
character, parameter :: RETURN_CALL = achar(18) ! PROPOSED
character, parameter :: RETURN_CALL_INDIRECT = achar(19) ! PROPOSED
character, parameter :: DROP = achar(26)
character, parameter :: SELECT = achar(27)
character, parameter :: SELECT_T = achar(28) ! PROPOSED
character, parameter :: LOCAL_GET = achar(32)
character, parameter :: LOCAL_SET = achar(33)
character, parameter :: LOCAL_TEE = achar(34)
character, parameter :: GLOBAL_GET = achar(35)
character, parameter :: GLOBAL_SET = achar(36)
character, parameter :: TABLE_GET = achar(37) ! PROPOSED
character, parameter :: TABLE_SET = achar(38) ! PROPOSED
character, parameter :: I32_LOAD = achar(40)
character, parameter :: I64_LOAD = achar(41)
character, parameter :: F32_LOAD = achar(42)
character, parameter :: F64_LOAD = achar(43)
character, parameter :: I32_LOAD8_S = achar(44)
character, parameter :: I32_LOAD8_U = achar(45)
character, parameter :: I32_LOAD16_S = achar(46)
character, parameter :: I32_LOAD16_U = achar(47)
character, parameter :: I64_LOAD8_S = achar(48)
character, parameter :: I64_LOAD8_U = achar(49)
character, parameter :: I64_LOAD16_S = achar(50)
character, parameter :: I64_LOAD16_U = achar(51)
character, parameter :: I64_LOAD32_S = achar(52)
character, parameter :: I64_LOAD32_U = achar(53)
character, parameter :: I32_STORE = achar(54)
character, parameter :: I64_STORE = achar(55)
character, parameter :: F32_STORE = achar(56)
character, parameter :: F64_STORE = achar(57)
character, parameter :: I32_STORE8 = achar(58)
character, parameter :: I32_STORE16 = achar(59)
character, parameter :: I64_STORE8 = achar(60)
character, parameter :: I64_STORE16 = achar(61)
character, parameter :: I64_STORE32 = achar(62)
character, parameter :: MEMORY_SIZE = achar(63)
character, parameter :: MEMORY_GROW = achar(64)
character, parameter :: I32_CONST = achar(65)
character, parameter :: I64_CONST = achar(66)
character, parameter :: F32_CONST = achar(67)
character, parameter :: F64_CONST = achar(68)
character, parameter :: I32_EQZ = achar(69)
character, parameter :: I32_EQ = achar(70)
character, parameter :: I32_NE = achar(71)
character, parameter :: I32_LT_S = achar(72)
character, parameter :: I32_LT_U = achar(73)
character, parameter :: I32_GT_S = achar(74)
character, parameter :: I32_GT_U = achar(75)
character, parameter :: I32_LE_S = achar(76)
character, parameter :: I32_LE_U = achar(77)
character, parameter :: I32_GE_S = achar(78)
character, parameter :: I32_GE_U = achar(79)
character, parameter :: I64_EQZ = achar(80)
character, parameter :: I64_EQ = achar(81)
character, parameter :: I64_NE = achar(82)
character, parameter :: I64_LT_S = achar(83)
character, parameter :: I64_LT_U = achar(84)
character, parameter :: I64_GT_S = achar(85)
character, parameter :: I64_GT_U = achar(86)
character, parameter :: I64_LE_S = achar(87)
character, parameter :: I64_LE_U = achar(88)
character, parameter :: I64_GE_S = achar(89)
character, parameter :: I64_GE_U = achar(90)
character, parameter :: F32_EQ = achar(91)
character, parameter :: F32_NE = achar(92)
character, parameter :: F32_LT = achar(93)
character, parameter :: F32_GT = achar(94)
character, parameter :: F32_LE = achar(95)
character, parameter :: F32_GE = achar(96)
character, parameter :: F64_EQ = achar(97)
character, parameter :: F64_NE = achar(98)
character, parameter :: F64_LT = achar(99)
character, parameter :: F64_GT = achar(100)
character, parameter :: F64_LE = achar(101)
character, parameter :: F64_GE = achar(102)
character, parameter :: I32_CLZ = achar(103)
character, parameter :: I32_CTZ = achar(104)
character, parameter :: I32_POPCNT = achar(105)
character, parameter :: I32_ADD = achar(106)
character, parameter :: I32_SUB = achar(107)
character, parameter :: I32_MUL = achar(108)
character, parameter :: I32_DIV_S = achar(109)
character, parameter :: I32_DIV_U = achar(110)
character, parameter :: I32_REM_S = achar(111)
character, parameter :: I32_REM_U = achar(112)
character, parameter :: I32_AND = achar(113)
character, parameter :: I32_OR = achar(114)
character, parameter :: I32_XOR = achar(115)
character, parameter :: I32_SHL = achar(116)
character, parameter :: I32_SHR_S = achar(117)
character, parameter :: I32_SHR_U = achar(118)
character, parameter :: I32_ROTL = achar(119)
character, parameter :: I32_ROTR = achar(120)
character, parameter :: I64_CLZ = achar(121)
character, parameter :: I64_CTZ = achar(122)
character, parameter :: I64_POPCNT = achar(123)
character, parameter :: I64_ADD = achar(124)
character, parameter :: I64_SUB = achar(125)
character, parameter :: I64_MUL = achar(126)
character, parameter :: I64_DIV_S = achar(127)
character, parameter :: I64_DIV_U = achar(128)
character, parameter :: I64_REM_S = achar(129)
character, parameter :: I64_REM_U = achar(130)
character, parameter :: I64_AND = achar(131)
character, parameter :: I64_OR = achar(132)
character, parameter :: I64_XOR = achar(133)
character, parameter :: I64_SHL = achar(134)
character, parameter :: I64_SHR_S = achar(135)
character, parameter :: I64_SHR_U = achar(136)
character, parameter :: I64_ROTL = achar(137)
character, parameter :: I64_ROTR = achar(138)
character, parameter :: F32_ABS = achar(139)
character, parameter :: F32_NEG = achar(140)
character, parameter :: F32_CEIL = achar(141)
character, parameter :: F32_FLOOR = achar(142)
character, parameter :: F32_TRUNC = achar(143)
character, parameter :: F32_NEAREST = achar(144)
character, parameter :: F32_SQRT = achar(145)
character, parameter :: F32_ADD = achar(146)
character, parameter :: F32_SUB = achar(147)
character, parameter :: F32_MUL = achar(148)
character, parameter :: F32_DIV = achar(149)
character, parameter :: F32_MIN = achar(150)
character, parameter :: F32_MAX = achar(151)
character, parameter :: F32_COPYSIGN = achar(152)
character, parameter :: F64_ABS = achar(153)
character, parameter :: F64_NEG = achar(154)
character, parameter :: F64_CEIL = achar(155)
character, parameter :: F64_FLOOR = achar(156)
character, parameter :: F64_TRUNC = achar(157)
character, parameter :: F64_NEAREST = achar(158)
character, parameter :: F64_SQRT = achar(159)
character, parameter :: F64_ADD = achar(160)
character, parameter :: F64_SUB = achar(161)
character, parameter :: F64_MUL = achar(162)
character, parameter :: F64_DIV = achar(163)
character, parameter :: F64_MIN = achar(164)
character, parameter :: F64_MAX = achar(165)
character, parameter :: F64_COPYSIGN = achar(166)
character, parameter :: I32_WRAP_I64 = achar(167)
character, parameter :: I32_TRUNC_F32_S = achar(168)
character, parameter :: I32_TRUNC_F32_U = achar(169)
character, parameter :: I32_TRUNC_F64_S = achar(170)
character, parameter :: I32_TRUNC_F64_U = achar(171)
character, parameter :: I64_EXTEND_I32_S = achar(172)
character, parameter :: I64_EXTEND_I32_U = achar(173)
character, parameter :: I64_TRUNC_F32_S = achar(174)
character, parameter :: I64_TRUNC_F32_U = achar(175)
character, parameter :: I64_TRUNC_F64_S = achar(176)
character, parameter :: I64_TRUNC_F64_U = achar(177)
character, parameter :: F32_CONVERT_I32_S = achar(178)
character, parameter :: F32_CONVERT_I32_U = achar(179)
character, parameter :: F32_CONVERT_I64_S = achar(180)
character, parameter :: F32_CONVERT_I64_U = achar(181)
character, parameter :: F32_DEMOTE_F64 = achar(182)
character, parameter :: F64_CONVERT_I32_S = achar(183)
character, parameter :: F64_CONVERT_I32_U = achar(184)
character, parameter :: F64_CONVERT_I64_S = achar(185)
character, parameter :: F64_CONVERT_I64_U = achar(186)
character, parameter :: F64_PROMOTE_F32 = achar(187)
character, parameter :: I32_REINTERPRET_F32 = achar(188)
character, parameter :: I64_REINTERPRET_F64 = achar(189)
character, parameter :: F32_REINTERPRET_I32 = achar(190)
character, parameter :: F64_REINTERPRET_I64 = achar(191)
end module opcodes_mod
module types_mod
implicit none
! https://webassembly.github.io/spec/core/binary/types.html
character, parameter :: i32 = achar(127)
character, parameter :: i64 = achar(126)
character, parameter :: f32 = achar(125)
character, parameter :: f64 = achar(124)
! http://webassembly.github.io/spec/core/binary/types.html#function-types
character, parameter :: type_function = achar(96)
character, parameter :: type_empty_array = achar(0)
! http://webassembly.github.io/spec/core/binary/modules.html#export-section
character, parameter :: export_func = achar(0)
character, parameter :: export_table = achar(1)
character, parameter :: export_mem = achar(2)
character, parameter :: export_global = achar(3)
! https://webassembly.github.io/spec/core/binary/modules.html#sections
character, parameter :: section_custom = achar(0)
character, parameter :: section_type = achar(1)
character, parameter :: section_import = achar(2)
character, parameter :: section_func = achar(3)
character, parameter :: section_table = achar(4)
character, parameter :: section_memory = achar(5)
character, parameter :: section_global = achar(6)
character, parameter :: section_export = achar(7)
character, parameter :: section_start = achar(8)
character, parameter :: section_element = achar(9)
character, parameter :: section_code = achar(10)
character, parameter :: section_data = achar(11)
end module types_mod