1 function reader_read_string
(token
, v
, r
)
3 token =
substr(token
, 1, length(token
) - 1)
4 gsub(/\\\\/, "\\", token
)
5 gsub(/\\"/, "\"", token)
6 gsub(/\\n/, "\n", token)
10 function reader_read_atom(token)
20 return reader_read_string(token)
28 function reader_read_list(reader, type, end, idx, len, ret)
30 idx = types_allocate()
32 while (reader["curidx"] in reader) {
33 if (reader[reader["curidx"]] == end) {
34 types_heap[idx]["len"] = len
38 ret = reader_read_from(reader)
40 types_heap[idx]["len"] = len
41 types_release(type idx)
44 types_heap[idx][len++] = ret
46 types_heap[idx]["len"] = len
47 types_release(type idx)
48 return "!\"expect " end ", got EOF"
51 function reader_read_hash(reader, idx, key, val)
53 idx = types_allocate()
54 while (reader["curidx"] in reader) {
55 if (reader[reader["curidx"]] == "}") {
59 key = reader_read_from(reader)
61 types_release("{" idx)
66 types_release("{" idx)
67 return "!\"Hash-map key must be string or keyword."
69 if (!(reader["curidx"] in reader)) {
70 types_release("{" idx)
71 return "!\"Element count of hash-map must be even."
73 val = reader_read_from(reader)
75 types_release("{" idx)
78 types_heap[idx][key] = val
80 types_release("{" idx)
81 return "!\"expect }, got EOF"
84 function reader_read_abbrev(reader, symbol, val, idx)
86 val = reader_read_from(reader)
90 idx = types_allocate()
91 types_heap[idx]["len"] = 2
92 types_heap[idx][0] = symbol
93 types_heap[idx][1] = val
97 function reader_read_with_meta(reader, meta, val, idx)
99 meta = reader_read_from(reader)
103 val = reader_read_from(reader)
108 idx = types_allocate()
109 types_heap[idx]["len"] = 3
110 types_heap[idx][0] = "'with
-meta
"
111 types_heap[idx][1] = val
112 types_heap[idx][2] = meta
116 function reader_read_from(reader, current)
118 current = reader[reader["curidx
"]++]
121 return reader_read_list(reader, "(", ")")
123 return reader_read_list(reader, "[", "]")
125 return reader_read_hash(reader)
129 return "!
\"Unexpected token
'" current "'.
"
131 return reader_read_abbrev(reader, "'quote
")
133 return reader_read_abbrev(reader, "'quasiquote")
135 return reader_read_abbrev(reader, "'unquote
")
137 return reader_read_abbrev(reader, "'splice-unquote")
139 return reader_read_abbrev(reader, "'deref
")
141 return reader_read_with_meta(reader)
143 return reader_read_atom(current)
147 function reader_tokenizer(str, reader, len, r)
149 for (len = 0; match(str, /^[ \t\r\n,]*(~@|[\[\]{}()'`~^@]|\"(\\[^\r\n]|[^\\"\r\n])*\"|;[^
\r\n]*|[^
\t\r\n\
[\
]{}('"`,;)^~@][^ \t\r\n\[\]{}('"`,;)]*)/, r); ) {
150 if (substr(r[1], 1, 1) != ";") {
153 str = substr(str, RSTART + RLENGTH)
155 if (str !~ /^[ \t\r\n,]*$/) {
156 return "!
\"Cannot tokenize
'" str "'.
"
162 function reader_read_str(str, reader, ret)
164 ret = reader_tokenizer(str, reader)
168 if (reader["len
"] == 0) {
171 ret = reader_read_from
(reader
)
175 if (reader
["len"] != reader
["curidx"]) {
177 return "!\"Unexpected token '" reader
[reader
["curidx"]] "'."