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