-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathparser.pl
More file actions
58 lines (37 loc) · 886 Bytes
/
Copy pathparser.pl
File metadata and controls
58 lines (37 loc) · 886 Bytes
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
49
50
51
52
53
54
55
56
57
58
% Lisp grammar using Definite Clause Grammars
read_sexp(S) --> spaces, sexp(S), spaces.
sexp(S) --> list(S).
sexp(S) --> atom(S).
list(Ns) --> lparen, spaces, nodes(Ns), spaces, rparen.
nodes([N|Ns]) --> sexp(N), spaces, nodes(Ns).
nodes([]) --> [].
lparen --> [40].
rparen --> [41].
spaces --> [32], !, spaces.
spaces --> [].
atom(A) --> number(A).
atom(A) --> symbol(A).
number(N) --> integer(N).
symbol(S) -->
char(C),
chars(Cs),
{ atom_chars(S,[C|Cs]) }.
char(C) -->
[C],
{ code_type(C,ascii) },
{ \+code_type(C, digit) },
{ \+C=32 }. % whitespace is ascii
chars([C|Cs]) --> char(C), !, chars(Cs).
chars([]) --> [].
integer(I) -->
digit(D0),
digits(D),
{ number_chars(I, [D0|D]) }.
digits([D|T]) -->
digit(D), !,
digits(T).
digits([]) -->
[].
digit(D) -->
[D],
{ code_type(D, digit) }.