1 function reader_read_string
(token
, v
, r
)
3 token =
substr(token
, 1, length(token
) - 1)
4 gsub(/\\\\/, "\xf7", token
)
5 gsub(/\\"/, "\"", token)
6 gsub(/\\n/, "\n", token)
7 gsub("\xf7
", "\\", token)
11 function reader_read_atom(token)
21 return reader_read_string(token)
29 function reader_read_list(reader, type, end, idx, len, ret)
31 idx = types_allocate()
33 while (reader["curidx"] in reader) {
34 if (reader[reader["curidx"]] == end) {
35 types_heap[idx]["len"] = len
39 ret = reader_read_from(reader)
41 types_heap[idx]["len"] = len
42 types_release(type idx)
45 types_heap[idx][len++] = ret
47 types_heap[idx]["len"] = len
48 types_release(type idx)
49 return "!\"expect " end ", got EOF"
52 function reader_read_hash(reader, idx, key, val)
54 idx = types_allocate()
55 while (reader["curidx"] in reader) {
56 if (reader[reader["curidx"]] == "}") {
60 key = reader_read_from(reader)
62 types_release("{" idx)
67 types_release("{" idx)
68 return "!\"Hash-map key must be string or keyword."
70 if (!(reader["curidx"] in reader)) {
71 types_release("{" idx)
72 return "!\"Element count of hash-map must be even."
74 val = reader_read_from(reader)
76 types_release("{" idx)
79 types_heap[idx][key] = val
81 types_release("{" idx)
82 return "!\"expect }, got EOF"
85 function reader_read_abbrev(reader, symbol, val, idx)
87 val = reader_read_from(reader)
91 idx = types_allocate()
92 types_heap[idx]["len"] = 2
93 types_heap[idx][0] = symbol
94 types_heap[idx][1] = val
98 function reader_read_with_meta(reader, meta, val, idx)
100 meta = reader_read_from(reader)
104 val = reader_read_from(reader)
109 idx = types_allocate()
110 types_heap[idx]["len"] = 3
111 types_heap[idx][0] = "'with
-meta
"
112 types_heap[idx][1] = val
113 types_heap[idx][2] = meta
117 function reader_read_from(reader, current)
119 current = reader[reader["curidx
"]++]
122 return reader_read_list(reader, "(", ")")
124 return reader_read_list(reader, "[", "]")
126 return reader_read_hash(reader)
130 return "!
\"Unexpected token
'" current "'.
"
132 return reader_read_abbrev(reader, "'quote
")
134 return reader_read_abbrev(reader, "'quasiquote")
136 return reader_read_abbrev(reader, "'unquote
")
138 return reader_read_abbrev(reader, "'splice-unquote")
140 return reader_read_abbrev(reader, "'deref
")
142 return reader_read_with_meta(reader)
144 return reader_read_atom(current)
148 function reader_tokenizer(str, reader, len, r)
150 for (len = 0; match(str, /^[ \t\r\n,]*(~@|[\[\]{}()'`~^@]|\"(\\[^\r\n]|[^\\"\r\n])*\"|;[^
\r\n]*|[^
\t\r\n\
[\
]{}('"`,;)^~@][^ \t\r\n\[\]{}('"`,;)]*)/, r); ) {
151 if (substr(r[1], 1, 1) != ";") {
154 str = substr(str, RSTART + RLENGTH)
156 if (str !~ /^[ \t\r\n,]*$/) {
157 return "!
\"Cannot tokenize
'" str "'.
"
163 function reader_read_str(str, reader, ret)
165 ret = reader_tokenizer(str, reader)
169 if (reader["len
"] == 0) {
172 ret = reader_read_from
(reader
)
176 if (reader
["len"] != reader
["curidx"]) {
178 return "!\"Unexpected token '" reader
[reader
["curidx"]] "'."