home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / p / plbin.zip / pl / library / am_match.pl next >
Text File  |  1992-05-26  |  3KB  |  133 lines

  1. /*  am_match.pl,v 1.1.1.1 1992/05/26 11:51:32 jan Exp
  2.  
  3.     Copyright (c) 1990 Jan Wielemaker. All rights reserved.
  4.     jan@swi.psy.uva.nl
  5.  
  6.     Purpose: implement ambiguous matches
  7. */
  8.  
  9. :- module(am_match,
  10.     [ am_match/1    % Does Atom matches previous compiled expression?
  11.     , am_compile/1    % Compile expression represented by atomic argument
  12.     , am_bagof/4    % Return alternatives of Var regarding
  13.     ]).        % Goal and matching Expr.
  14.  
  15.  
  16. am_bagof(Var, Expression, Goal, Bag) :-
  17.     am_compile(Expression), !, 
  18.     am_bagof(Var, am_bagof_goal(Var, Goal), Bag), !.
  19.  
  20. am_bagof_goal(Var, Goal) :-
  21.     Goal, 
  22.     am_match(Var).
  23.  
  24. am_match(Atom) :-
  25.     name(Atom, String), 
  26.     recorded(am_compiled, goal(Goal, String), _), !, 
  27.     Goal, !.
  28.  
  29. am_compile(Reg) :-
  30.     am_compile(Reg, Goal, String), 
  31.     (recorded(am_compiled, goal(_, _), Ref), erase(Ref) | true), 
  32.     recorda(am_compiled, goal(Goal, String), _), !.
  33.  
  34. am_compile(Reg, Goal, String) :-
  35.     name(Reg, RegString), 
  36.     am_token_list(Tokens, RegString, ""), 
  37.     am_comp(Tokens, Goal, String), !.
  38.  
  39. am_comp([], (Full = ""), Full) :- !.
  40. am_comp([string(String)|Tokens], 
  41.      (append(String, Rest, Full), Goal), Full) :- !, 
  42.     am_comp(Tokens, Goal, Rest).
  43. am_comp([star|Tokens], 
  44.      (append(_, Rest, Full), Goal), Full) :- !, 
  45.     am_comp(Tokens, Goal, Rest).
  46. am_comp([any|Tokens], 
  47.      (append([_], Rest, Full), Goal), Full) :- !, 
  48.     am_comp(Tokens, Goal, Rest).
  49. am_comp([anychar(Chars)|Tokens], 
  50.      (append([C], Rest, Full), member(C, Chars), Goal), Full) :- !, 
  51.     am_comp(Tokens, Goal, Rest).
  52. am_comp([anyof(Strings)|Tokens], 
  53.      (OrGoal, Goal), Full) :- !, 
  54.     am_anyof_goal(Strings, Rest, Full, OrGoal), 
  55.     am_comp(Tokens, Goal, Rest).
  56.  
  57. am_anyof_goal([One], Rest, Full, append(One, Rest, Full) ) :- !.
  58. am_anyof_goal([Head|Tail], Rest, Full, (append(Head, Rest, Full) | Goal)) :-
  59.     am_anyof_goal(Tail, Rest, Full, Goal).
  60.  
  61. am_token_list([]) --> !.
  62. am_token_list([Token|TokenList]) -->
  63.     am_token(Token), 
  64.     am_token_list(TokenList).
  65.  
  66. am_token(anyof([String|Rest])) -->
  67.     am_next_char("{"), 
  68.     am_any_string(String), 
  69.     am_any_strings(Rest), 
  70.     am_next_char("}"), !.
  71. am_token(anychar(List) ) -->
  72.     am_next_char("["), 
  73.     am_anychar(List), 
  74.     am_next_char("]"), !.
  75. am_token(star) -->
  76.     am_next_char("*"), !.
  77. am_token(any) -->
  78.     am_next_char("?"), !.
  79. am_token(string(String) ) -->
  80.     am_max_string(String), !.
  81.  
  82. am_any_strings([String|Rest]) -->
  83.     am_next_char(", "), 
  84.     am_any_string(String), 
  85.     am_any_strings(Rest).
  86. am_any_strings([]) --> { true }.
  87.  
  88. am_anychar([]) -->
  89.     am_see_char("]"), !.
  90. am_anychar(List) -->
  91.     am_next_char([C1]), 
  92.     am_next_char("-"), 
  93.     am_next_char([C2]), { C2 \== 93, C2 > C1 }, 
  94.     { am_anylist(C1, C2, Sofar) }, 
  95.     am_anychar(Rest), 
  96.     { append(Sofar, Rest, List) }, !.
  97. am_anychar([C|Rest]) -->
  98.     am_next_char([C]), !, 
  99.     am_anychar(Rest).    
  100.  
  101. am_max_string([C|Rest]) -->
  102.     am_next_char("\"), 
  103.     am_next_char([C]), !, 
  104.     am_max_string(Rest).
  105. am_max_string([C|Rest]) -->
  106.     am_next_char([C]), 
  107.     {  \+ member(C, "[]{}?*") }, !, 
  108.     am_max_string(Rest).
  109. am_max_string([]) --> { true }.
  110.  
  111. am_any_string([]) -->
  112.     am_see_char("}"), !.
  113. am_any_string([]) -->
  114.     am_see_char(", "), !.
  115. am_any_string([C|Rest]) -->
  116.     am_next_char("\"), 
  117.     am_next_char([C]), !, 
  118.     am_any_string(Rest).
  119. am_any_string([C|Rest]) -->
  120.     am_next_char([C]), !, 
  121.     am_any_string(Rest).
  122.  
  123. am_next_char([C], [C|R], R).        % read next character
  124. am_see_char(  [C], [C|R], [C|R]).    % line am_next_char, don't read
  125.  
  126. /*  fill a list with all characters between C1 and C2.
  127. */
  128.  
  129. am_anylist(C1, C1, []) :- !.
  130. am_anylist(C1, C2, [C1|Rest]) :-
  131.     succ(C1, CN), 
  132.     am_anylist(CN, C2, Rest).
  133.