1 % this is just being used as a namespace
3 methods
(Static
= true
)
4 function tokens
= tokenize
(str
)
5 re
= '[\s,]*(~@|[\[\]{}()''`~^@]|"(?:\\.|[^\\"])*"|;[^\n]*|[^\s\[\]{}(''"`,;)]*)';
6 % extract the capture group (to ignore spaces and commas)
7 tokens
= cellfun
(@
(x
) x
(1), regexp
(str
, re
, 'tokens'));
8 comments
= cellfun
(@
(x
) length(x
) > 0 && x
(1) == ';', tokens
);
9 tokens
= tokens
(~comments
);
12 function atm
= read_atom
(rdr
)
14 %fprintf('in read_atom: %s\n', token);
15 if not
(isempty(regexp
(token
, '^-?[0-9]+$', 'match')))
16 atm
= str2double
(token
);
17 elseif strcmp(token
(1), '"')
18 atm
= token
(2:length(token
)-1);
19 atm
= strrep(atm
, '\\', char(255));
20 atm
= strrep(atm
, '\"', '"');
21 atm
= strrep(atm
, '\n', char(10));
22 atm
= strrep(atm
, char(255), '\');
23 elseif strcmp(token(1), ':')
25 atm = type_utils.keyword(s);
26 elseif strcmp(token, 'nil
')
28 elseif strcmp(token, 'true
')
30 elseif strcmp(token, 'false
')
33 atm = types.Symbol(token);
37 function seq = read_seq(rdr, start, last)
38 %fprintf('in read_seq
\n');
41 if not(strcmp(token, start))
42 error(sprintf('expected
''%s''', start));
47 error(sprintf('expected ''%s''', last
));
49 if strcmp(token
, last
), break, end
50 seq
{end+1} = reader.read_form
(rdr
);
56 function lst
= read_list
(rdr
)
57 seq
= reader.read_seq
(rdr
, '(', ')');
58 lst
= types.List
(seq
{:});
61 function vec
= read_vector
(rdr
)
62 seq
= reader.read_seq
(rdr
, '[', ']');
63 vec
= types.Vector
(seq
{:});
66 function map
= read_hash_map
(rdr
)
67 seq
= reader.read_seq
(rdr
, '{', '}');
68 map
= types.HashMap
(seq
{:});
71 function ast
= read_form
(rdr
)
72 %fprintf('in read_form\n');
77 ast
= types.List
(types.Symbol
('quote'), ...
78 reader.read_form
(rdr
));
81 ast
= types.List
(types.Symbol
('quasiquote'), ...
82 reader.read_form
(rdr
));
85 ast
= types.List
(types.Symbol
('unquote'), ...
86 reader.read_form
(rdr
));
89 ast
= types.List
(types.Symbol
('splice-unquote'), ...
90 reader.read_form
(rdr
));
93 meta = reader.read_form
(rdr
);
94 ast
= types.List
(types.Symbol
('with-meta'), ...
95 reader.read_form
(rdr
), meta);
98 ast
= types.List
(types.Symbol
('deref'), ...
99 reader.read_form
(rdr
));
102 error('unexpected '')''');
104 ast
= reader.read_list
(rdr
);
106 error('unexpected '']''');
108 ast
= reader.read_vector
(rdr
);
110 error('unexpected ''}''');
112 ast
= reader.read_hash_map
(rdr
);
114 ast
= reader.read_atom
(rdr
);
118 function ast
= read_str
(str
)
119 %fprintf('in read_str\n');
120 tokens
= reader.tokenize
(str
);
122 rdr
= types.Reader
(tokens
);
123 ast
= reader.read_form
(rdr
);