-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathcasexbgf.pro
More file actions
95 lines (74 loc) · 1.71 KB
/
casexbgf.pro
File metadata and controls
95 lines (74 loc) · 1.71 KB
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
:- ensure_loaded('../slps.pro').
% wiki: RenameAllN
casexbgf('1',all,down).
casexbgf('2',all,up).
casexbgf('3',first,down).
casexbgf('4',first,up).
mkRename(T,(X,Y),R)
:-
T =.. [F|Ts],
append(Ts,[X,Y],Args),
R =.. [F|Args].
case(Q,UD,G1,Ts)
:-
% Handle nonterminals
allNs(G1,Ns1),
filter(testCase(Q,UD),Ns1,Ns2),
maplist(doCase(Q,UD),Ns2,Ns3),
zip(Ns2,Ns3,Ns4),
maplist(mkRename(renameN),Ns4,Ts1),
% Handle labels
allLs(G1,Ls1),
filter(testCase(Q,UD),Ls1,Ls2),
maplist(doCase(Q,UD),Ls2,Ls3),
zip(Ls2,Ls3,Ls4),
maplist(mkRename(renameL),Ls4,Ts2),
% Handle selectors
allSs(G1,Ss1),
filter(testCase(Q,UD),Ss1,Ss2),
maplist(doCase(Q,UD),Ss2,Ss3),
zip(Ss2,Ss3,Ss4),
maplist(mkRename(renameS([])),Ss4,Ts3),
concat([Ts1,Ts2,Ts3],Ts).
% Apply conversion
doCase(all,down,X1,X2)
:-
downcase_atom(X1,X2).
doCase(all,up,X1,X2)
:-
upcase_atom(X1,X2).
doCase(first,down,X1,X7)
:-
name(X1,[X2|X3]),
name(X4,[X2]),
downcase_atom(X4,X5),
name(X5,[X6]),
name(X7,[X6|X3]).
doCase(first,up,X1,X7)
:-
name(X1,[X2|X3]),
name(X4,[X2]),
upcase_atom(X4,X5),
name(X5,[X6]),
name(X7,[X6|X3]).
% Test a name to be worth down/up-casing
testCase(Q,UD,X)
:-
doCase(Q,UD,X,Y),
\+ X == Y.
main :-
% Compatibility hack for >6.4.1 and the use of '--'
( RawArgv = argv ; RawArgv = os_argv ),
current_prolog_flag(RawArgv,Argv),
append(_,['--',Mode,BgfFile,XbgfFile],Argv),
require(
casexbgf(Mode,Q,UD),
'Unknown mode ~q.',
[Mode]),
loadXml(BgfFile,BgfXml),
xmlToG(BgfXml,G),
case(Q,UD,G,Ts),
xbgf2xml(sequence(Ts),Xbgf),
saveXml(XbgfFile,Xbgf),
halt.
:- run.