-
Notifications
You must be signed in to change notification settings - Fork 0
/
lisp_parser.pl
48 lines (37 loc) · 1.36 KB
/
lisp_parser.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
base_tokenize([], Buffer, [Buffer]).
base_tokenize([Char | Chars], Buffer, Tokens) :-
(Char = '(' ; Char = ')') ->
base_tokenize(Chars, '', Tail_Tokens),
Tokens = [Buffer, Char | Tail_Tokens];
Char = ' ' ->
base_tokenize(Chars, '', Tail_Tokens),
Tokens = [Buffer | Tail_Tokens];
atom_concat(Buffer, Char, New_Buffer),
base_tokenize(Chars, New_Buffer, Tokens).
filter_empty_blank([], []).
filter_empty_blank([Head | Tail], Result) :-
filter_empty_blank(Tail, Tail_Result),
((Head = [] ; Head = '') ->
Result = Tail_Result;
Result = [Head | Tail_Result]).
tokenize(Expr, Tokens) :-
atom_chars(Expr, Chars),
base_tokenize(Chars, '', Dirty_Tokens),
filter_empty_blank(Dirty_Tokens, Tokens).
a_seq([]) --> [].
a_seq([A | Tail]) --> an_atom(A), a_seq(Tail).
a_seq([L | Tail]) --> a_list(L), a_seq(Tail).
a_list(list(L)) --> ['('], a_seq(L), [')'].
an_atom(A) --> [A], {\+ member(A, ['(', ')']), \+ list(A)}.
parse(_, [], []).
parse(Expr, Tokens, AST) :-
phrase(a_list(AST), Tokens) ;
phrase(an_atom(AST), Tokens) ;
format('The following expression is invalid:\n`~w`.\n\n', [Expr]).
establish_types([], []).
establish_types(list([H | T]), list([HT | TT])) :-
establish_types(H, HT), establish_types(T, TT).
establish_types([H | T], [HT | TT]) :-
establish_types(H, HT), establish_types(T, TT).
establish_types(A, TA) :-
catch(number_atom(TA, A), _, TA = A).