1 function reader_read_string
(token
, v
, r
)
3 token =
substr(token
, 1, length(token
) - 1)
4 while (match(token
, /\\["n\\]?/, r)) {
7 return "!
\"Invalid escape character
'" substr(token, RSTART, 2) "'.
"
9 v = v substr(token, 1, RSTART - 1) "\n"
12 v = v substr(token, 1, RSTART - 1) substr(r[0], 2, 1)
15 token = substr(token, RSTART + RLENGTH)
20 function reader_read_atom(token)
30 return reader_read_string(token)
38 function reader_read_list(reader, type, end, idx, len, ret)
40 idx = types_allocate()
42 while (reader["curidx"] in reader) {
43 if (reader[reader["curidx"]] == end) {
44 types_heap[idx]["len"] = len
48 ret = reader_read_from(reader)
50 types_heap[idx]["len"] = len
51 types_release(type idx)
54 types_heap[idx][len++] = ret
56 types_heap[idx]["len"] = len
57 types_release(type idx)
58 return "!\"expect " end ", got EOF"
61 function reader_read_hash(reader, idx, key, val)
63 idx = types_allocate()
64 while (reader["curidx"] in reader) {
65 if (reader[reader["curidx"]] == "}") {
69 key = reader_read_from(reader)
71 types_release("{" idx)
76 types_release("{" idx)
77 return "!\"Hash-map key must be string or keyword."
79 if (!(reader["curidx"] in reader)) {
80 types_release("{" idx)
81 return "!\"Element count of hash-map must be even."
83 val = reader_read_from(reader)
85 types_release("{" idx)
88 types_heap[idx][key] = val
90 types_release("{" idx)
91 return "!\"expect }, got EOF"
94 function reader_read_abbrev(reader, symbol, val, idx)
96 val = reader_read_from(reader)
100 idx = types_allocate()
101 types_heap[idx]["len"] = 2
102 types_heap[idx][0] = symbol
103 types_heap[idx][1] = val
107 function reader_read_with_meta(reader, meta, val, idx)
109 meta = reader_read_from(reader)
113 val = reader_read_from(reader)
118 idx = types_allocate()
119 types_heap[idx]["len"] = 3
120 types_heap[idx][0] = "'with
-meta
"
121 types_heap[idx][1] = val
122 types_heap[idx][2] = meta
126 function reader_read_from(reader, current)
128 current = reader[reader["curidx
"]++]
131 return reader_read_list(reader, "(", ")")
133 return reader_read_list(reader, "[", "]")
135 return reader_read_hash(reader)
139 return "!
\"Unexpected token
'" current "'.
"
141 return reader_read_abbrev(reader, "'quote
")
143 return reader_read_abbrev(reader, "'quasiquote")
145 return reader_read_abbrev(reader, "'unquote
")
147 return reader_read_abbrev(reader, "'splice-unquote")
149 return reader_read_abbrev(reader, "'deref
")
151 return reader_read_with_meta(reader)
153 return reader_read_atom(current)
157 function reader_tokenizer(str, reader, len, r)
159 for (len = 0; match(str, /^[ \t\r\n,]*(~@|[\[\]{}()'`~^@]|\"(\\[^\r\n]|[^\\"\r\n])*\"|;[^
\r\n]*|[^
\t\r\n\
[\
]{}('"`,;)^~@][^ \t\r\n\[\]{}('"`,;)]*)/, r); ) {
160 if (substr(r[1], 1, 1) != ";") {
163 str = substr(str, RSTART + RLENGTH)
165 if (str !~ /^[ \t\r\n,]*$/) {
166 return "!
\"Cannot tokenize
'" str "'.
"
172 function reader_read_str(str, reader, ret)
174 ret = reader_tokenizer(str, reader)
178 if (reader["len
"] == 0) {
181 ret = reader_read_from
(reader
)
185 if (reader
["len"] != reader
["curidx"]) {
187 return "!\"Unexpected token '" reader
[reader
["curidx"]] "'."