-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqfMachine.pl
44 lines (40 loc) · 1.26 KB
/
qfMachine.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
:- module(qfMachine, [qfMachine/3]).
:- use_module(charUtils).
final(empty).
final(query).
final(fragment).
delta(qStart, Char, query) :- isQueryChar(Char), !.
delta(query, Char, query) :- isQueryChar(Char), !.
delta(fStart, Char, fragment) :- isAllowedChar(Char), !.
delta(fragment, Char, fragment) :- isAllowedChar(Char), !.
accept([], State, [], []) :-
final(State),
!.
accept([? | Chars], empty, Query, Fragment) :-
accept(Chars, qStart, Query, Fragment),
!.
accept([# | Chars], State, [], Fragment) :-
State \= fragment,
final(State),
accept(Chars, fStart, _, Fragment),
!.
accept([Char | Chars], State, Query, Fragment) :-
delta(State, Char, query),
accept(Chars, query, RestQuery, Fragment),
!,
append([Char], RestQuery, Query).
accept([Char | Chars], State, Query, Fragment) :-
delta(State, Char, fragment),
accept(Chars, fragment, Query, RestFragment),
!,
append([Char], RestFragment, Fragment).
/**
* qfMachine(++Chars:atom[], -Query:atomic, -Fragment:atomic) is semidet.
*
* True when the list of characters initially has a valid URI definition for
* Query and Fragment in that order.
*/
qfMachine(Chars, Query, Fragment) :-
accept(Chars, empty, QueryList, FragmentList),
listToURIValue(QueryList, Query),
listToURIValue(FragmentList, Fragment).