home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lifeos2.zip / LIFE-1.02 / TESTS / FILES / Z_GCTOKE.1 < prev   
Text File  |  1996-06-04  |  4KB  |  257 lines

  1. %% This is the input file for the tokenizer.
  2.  
  3. %
  4. % Tokenizer for Life
  5. %
  6.  
  7. main :- tokenize("token.lf").
  8.  
  9. tokenize(File) :- 
  10.         W = readf(File), 
  11.     setq(rest,[]), setq(listTokens,[]),
  12.     tokens(words => W, rest => []).
  13.  
  14.  
  15. dynamic(tokens) ?
  16.  
  17. tokens([],words=>[]) :- !.
  18. tokens(T) --> 
  19.     tokenN(L), 
  20.     tokens(Ls), 
  21.     #( T = append(L,Ls)) ?
  22.  
  23. tokenN( TokenNs, rest => RestN, words => Words) :-
  24.         token_N( Tokens, 50, rest => Rest, words => Words),
  25.         setEco(rest,Rest),
  26.         setEco(listTokens,Tokens),
  27.         fail ; 
  28.         TokenNs = listTokens,
  29.         RestN = rest.
  30.  
  31. token_N( [], 0) --> ! ?
  32. token_N( Tokens, Counter) -->
  33.     void_chars,
  34.     (
  35.         token( Token),
  36.         !, 
  37.         token_N( NewToks, Counter - 1),
  38.         #( Tokens = [ Token| NewToks]) ;
  39.         #( Tokens = [])
  40.     ) ?
  41.  
  42. void_chars --> [{32;9;10}],!, void_chars ?         % blanc, tab, return
  43. void_chars --> [37],!, comment_chars, void_chars ? % commentaires
  44. void_chars --> [] ?
  45.  
  46. comment_chars --> [10], ! ?                     % un commentaire s'arrete avec
  47.                         % return.
  48. comment_chars --> [X], comment_chars ?
  49.  
  50.  
  51.  
  52. dynamic(token) ?
  53.  
  54. token( words => []) :- !, fail.
  55. token(T) --> 
  56.     ( 
  57.         variable(Y), 
  58.         #( !, T = variable(Y)) ;
  59.         syntact_object(Y), 
  60.         #( !, T = syntact_object(Y)) ;
  61.         construct( Y, type => Z), 
  62.         #( T = construct( Y, type => Z))
  63.     ) ?
  64.  
  65.  
  66. %
  67. %
  68. % variables
  69. %
  70.  
  71. variable(_) -->                               % @
  72.     [64], ! ?          
  73. variable(X) -->                               % _...
  74.     [95], !,
  75.     simple_atom_cars(Y), 
  76.     #((Y = "", ! ); X = strcon("_",Y)) ?
  77. variable(X) -->                               % M...
  78.     majuscule(Y), 
  79.     simple_atom_cars(Z), 
  80.     #( X = strcon(Y,Z)) ?
  81.  
  82.  
  83. %
  84. %
  85. % syntactic objects
  86. %
  87. %
  88.  
  89. syntact_object(X) --> 
  90.     [Y:{40;41;44;46;59;63;91;93;123;124;125}],
  91.     #( !, X = charac(Y)) ?
  92.  
  93.  
  94.  
  95. %
  96. %
  97. % constructors
  98. %
  99. %
  100.  
  101.  
  102. construct( Y, type=>T) --> 
  103.     quote(Y), #( !, T = quote);
  104.     simple_atom(Y), #( !, T = simple_atom); 
  105.     quoted_atom(Y), #( !, T = quoted_atom); 
  106.     number(Y), #( !, T = number);
  107.     car_chaine(Y), #( !, T = car_chaine); 
  108.     op_atom(Y), #( !, T = op_atom) ?
  109.  
  110. %
  111. % quote
  112. %
  113.  
  114. quote("`") --> [96] ?
  115.  
  116. %
  117. % simple atoms
  118. %             
  119.  
  120. simple_atom(X) --> 
  121.     minuscule(Y), 
  122.     simple_atom_cars(Z), 
  123.     #( X = strcon(Y,Z)) ?
  124.  
  125. simple_atom_cars(Z) --> 
  126.     simple_atom_car(X), !,
  127.     simple_atom_cars(Y), 
  128.     #( Z = strcon(X,Y)) ?
  129. simple_atom_cars("") --> [] ?
  130.  
  131. simple_atom_car(X) --> 
  132.     [Y], 
  133.     #( Y >= 48,
  134.        cond( Y =< 57,                                  % chiffre
  135.                  succeed,
  136.                  ( 
  137.              Y >= 65 , 
  138.              cond( Y =< 90 ,                       % majuscule
  139.                    succeed,
  140.                cond( Y =:= 95,                 % underscore
  141.                  succeed,
  142.                  ( Y >= 97 , Y =< 122)))   % minuscule
  143.          )
  144.           ),
  145.       X = charac(Y)) ?
  146.  
  147. %
  148. % quoted atoms
  149. %
  150.  
  151. quoted_atom(X) --> 
  152.     [39],
  153.         quoted_atom_end(X) ?
  154.  
  155. quoted_atom_end(X) --> 
  156.     [39], !,
  157.     ( [39], quoted_atom_end(Y), X = strcon("'",Y) ; 
  158.           # ( X = "" )) ?
  159. quoted_atom_end(X) --> 
  160.     quoted_atom_car(Y),
  161.     quoted_atom_end(Z),
  162.     #(  X = strcon(Y,Z)) ?
  163.  
  164. quoted_atom_car(Y) -->
  165.     [X], #( Y = charac(X) ) ?
  166.  
  167.  
  168. %
  169. % Numbers
  170. %
  171.  
  172. number(X) --> 
  173.     digits(V1),
  174.     ( [46], digits(V2,length => L2), !;
  175.           #( V2 = 0, L2= 0) ),
  176.     ( [101], !,exponent(E) ;
  177.       #(E = 0) ),
  178.     #( X = (V1 + V2 * 10^(-L2)) * 10^(E)) ?
  179.  
  180. digits(V, length=>L) --> 
  181.     digit( V1), 
  182.     ( digits(V2, length=>L2),!,
  183.       #( L = L2+1, V = V1*10^L2 + V2) ;
  184.           #( V = V1, L = 1)) ?
  185.  
  186. sign(-1) --> [45],! ?
  187. sign(1)  --> [43],! ?
  188. sign(1)  --> [] ?
  189.  
  190. exponent(V) --> sign(S), digits(V1), #(V = S*V1) ?
  191.  
  192. digit(N:int) --> [48+N], #(N =< 9, N >= 0)  ?
  193.  
  194.  
  195. %
  196. % Strings
  197. %
  198.  
  199. car_chaine(X) --> 
  200.     [34],
  201.         car_chaine_end(X) ?
  202.  
  203. car_chaine_end(X) --> 
  204.     [34], !,
  205.     ( [34], !,car_chaine_end(Y), #(X = strcon("""",Y)) ; 
  206.           # ( X = "" )) ?
  207. car_chaine_end(X) --> 
  208.     car_chaine_car(Y),
  209.     car_chaine_end(Z),
  210.     #(  X = strcon(Y,Z)) ?
  211.  
  212. car_chaine_car(Y) -->
  213.     [X], #( Y = charac(X) ) ?
  214.  
  215.  
  216. %
  217. % op_atoms
  218. %
  219.  
  220. op_atom(X) --> 
  221.     op_atom_car(Y),!, 
  222.     op_atom_cars(Z),
  223.     #(  X = strcon(Y,Z)) ?
  224.  
  225. op_atom_car(X) -->
  226.     [Y:{33;35;36;37;38;42;43;45;47;58;60;61;62;92;94;126}],!,
  227.     #( X = charac(Y)) ?
  228.  
  229. op_atom_cars(X) --> 
  230.     op_atom_car(Y),!, 
  231.     op_atom_cars(Z),
  232.     #(  X = strcon(Y,Z)) ?
  233. op_atom_cars("") -->
  234.     [] ?
  235.                       
  236.  
  237. minuscule(Y) --> [X], #( X >= 97, X =< 122, Y = charac(X) ) ?
  238. majuscule(Y) --> [X], #( X >= 65, X =< 90,  Y = charac(X) ) ?
  239.  
  240. charac(Z) -> psi2str(chr(Z)) .
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.