278 lines
15 KiB
Fortran
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
|