home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l210 / 1.ddi / PIE.ARC / PIE.PAR < prev    next >
Encoding:
Text File  |  1988-06-21  |  4.9 KB  |  149 lines

  1. /*****************************************************************************
  2.             Prolog Inference Engine
  3.             =======================
  4.  
  5.    Copyright (c) 1986, 88 by Borland International, Inc
  6.  
  7.    Module PIE.PAR: The operator precedence parser
  8.  
  9.    This module implements a operator precedence parser. The priority and
  10.    associativity of the operators are stored in the database predicate "op".
  11. *****************************************************************************/
  12.  
  13. PREDICATES
  14.   s_term(TOKL,TOKL,STERM)
  15.   s_lowerterm(TOKL,TOKL,STERM)
  16.   s_lowerterm1(TOKL,TOKL,STERM,STERM)
  17.   s_priorterm(PRIOR,ASSOC,TOKL,TOKL,STERM)
  18.   s_basisterm(PRIOR,ASSOC,TOKL,TOKL,STERM)
  19.   s_higher(PRIOR,ASSOC,TOKL,TOKL,STERM,STERM)
  20.   s_higher_something(PRIOR,ASSOC,TOKL,TOKL,STERM,STERM)
  21.   treat_prefix(PRIOR,XFY,TOKL,TOKL,STERM)
  22.   treat_sufinfix(PRIOR,XFY,OP,TOKL,TOKL,STERM,STERM)
  23.   s_list(TOKL,TOKL,STERM)
  24.   s_list1(TOKL,TOKL,STERM)
  25.   s_terml(TOKL,TOKL,STERML)
  26.   s_terml1(TOKL,TOKL,STERML)
  27.   s_term6(TOKL,TOKL,STRING,STERM)
  28.   is_op(TOK,PRIOR,XFY,OP)
  29.   ok_rightop(PRIOR,ASSOC,PRIOR)
  30.   check_ok_rightop(CURSOR,PRIOR,ASSOC,PRIOR)
  31.   is_prefix(XFY)
  32.   prefix_op(PRIOR,XFY,OP)
  33.  
  34. CLAUSES
  35.   s_term(IL,OL,TERM):-s_lowerterm(IL,OL,TERM),!.
  36.   s_term(_,_,_):-write("\nSyntax error"),fail.
  37.  
  38.   s_basisterm(_,_,[t(atom("-"),_),t(int(X),_)|LL],LL,int(I)):-!,I=-X.
  39.   s_basisterm(PRIOR,ASSOC,[t(atom(ID),CURSOR)|LL1],LL2,cmp(FID,[TERM])):-
  40.     FID=ID, OP=FID,
  41.     prefix_op(NEWPRIOR,XFY,OP),!,
  42.     check_ok_rightop(CURSOR,PRIOR,ASSOC,NEWPRIOR),
  43.     treat_prefix(NEWPRIOR,XFY,LL1,LL2,TERM).
  44.   s_basisterm(_,_,[t(var(STRING),_)|LL],LL,var(STRING)):-!.
  45.   s_basisterm(_,_,[t(atom(STRING),_)|LL1],LL0,TERM_):-!,
  46.     s_term6(LL1,LL0,STRING,TERM_).
  47.   s_basisterm(_,_,[t(int(X),_)|LL],LL,int(X)):-!.
  48.   s_basisterm(_,_,[t(char(X),_)|LL],LL,char(X)):-!.
  49.   s_basisterm(_,_,[t(str(X),_)|LL],LL,str(X)):-!.
  50.   s_basisterm(_,_,[t(lbrack,_)|LL1],LL0,TERM):-!,
  51.     s_list(LL1,LL0,TERM).
  52.   s_basisterm(_,_,[t(lpar,_)|LL1],LL0,TERM):-!,
  53.     s_priorterm(1201,y,LL1,LL2,TERM),
  54.     LL2=[t(rpar,_)|LL0].
  55.  
  56.   s_list([t(rbrack,_)|IL],IL,nill):-!.
  57.   s_list(IL,OL,list(TERM,REST)):-
  58.     s_priorterm(1000,x,IL,OL1,TERM),
  59.     s_list1(OL1,OL,REST).
  60.  
  61.   s_list1([t(rbrack,_)|IL],IL,nill):-!.
  62.   s_list1([t(comma,_)|IL],OL,list(TERM,REST)):-
  63.     s_priorterm(1000,x,IL,OL1,TERM),
  64.     s_list1(OL1,OL,REST).
  65.   s_list1([t(bar,_)|IL],OL,TERM):-
  66.     s_priorterm(1000,x,IL,OL1,TERM),
  67.     OL1=[t(rbrack,_)|OL].
  68.  
  69.   s_term6([t(lpar,_)|LL1],LL0,ID,cmp(FID,TERML)):-!,
  70.     FID=ID,
  71.     s_terml(LL1,LL2,TERML),
  72.     LL2=[t(rpar,_)|LL0].
  73.   s_term6(LL,LL,STRING,atom(STRING)):-!.
  74.  
  75.   s_terml(LL1,LL0,[TERM|TERML]):-
  76.     s_priorterm(999,y,LL1,LL2,TERM),!,
  77.     s_terml1(LL2,LL0,TERML).
  78.   s_terml(LL,LL,[]).
  79.  
  80.   s_terml1([t(comma,_)|LL1],LL2,TERML):-!,
  81.     s_terml(LL1,LL2,TERML).
  82.   s_terml1(LL,LL,[]).
  83.  
  84.   treat_prefix(PRIOR,fx,LL1,LL2,TERM):-
  85.     s_priorterm(PRIOR,x,LL1,LL2,TERM).
  86.   treat_prefix(PRIOR,fy,LL1,LL2,TERM):-
  87.     s_priorterm(PRIOR,y,LL1,LL2,TERM).
  88.  
  89.   s_lowerterm(LL1,LL0,TERM_):-
  90.     PRIOR=1201,
  91.     s_basisterm(PRIOR,y,LL1,LL2,TERM1),
  92.     s_higher(PRIOR,y,LL2,LL3,TERM1,TERM2),
  93.     s_lowerterm1(LL3,LL0,TERM2,TERM_).
  94.  
  95.   s_lowerterm1([],[],TERM,TERM):-!.
  96.   s_lowerterm1([t(dot,_)|LL],LL,TERM,TERM):-!.
  97.   s_lowerterm1(LL2,LL0,TERM1,TERM_):-
  98.     PRIOR=1201,
  99.     s_higher_something(PRIOR,y,LL2,LL3,TERM1,TERM2),
  100.     s_lowerterm1(LL3,LL0,TERM2,TERM_).
  101.  
  102.   s_priorterm(PRIOR,ASSOC,LL1,LL0,TERM_):-
  103.     s_basisterm(PRIOR,ASSOC,LL1,LL2,TERM),
  104.     s_higher(PRIOR,ASSOC,LL2,LL0,TERM,TERM_).
  105.  
  106.   prefix_op(NEWPRIOR,XFY,FID):-
  107.     op(NEWPRIOR,XFY,FID),
  108.     is_prefix(XFY),!.
  109.  
  110.   is_prefix(fx).
  111.   is_prefix(fy).
  112.  
  113.   ok_rightop(PRIOR,_,NEWPRIOR):-
  114.     NEWPRIOR<PRIOR,!.
  115.   ok_rightop(PRIOR,y,PRIOR).
  116.  
  117.   check_ok_rightop(_,PRIOR,ASSOC,NEWPRIOR):-
  118.     ok_rightop(PRIOR,ASSOC,NEWPRIOR),!.
  119.   check_ok_rightop(_,_,_,_):-write("Priority error"),nl,fail.
  120.  
  121.   is_op(comma,PRIOR,XFY,OP):-
  122.     OP=",",    op(PRIOR,XFY,OP),!.
  123.   is_op(dot,PRIOR,XFY,OP):-
  124.     OP=".",    op(PRIOR,XFY,OP),!.
  125.   is_op(atom(ID),PRIOR,XFY,OP):-
  126.     ID=OP, op(PRIOR,XFY,OP),!.
  127.  
  128.   s_higher_something(PRIOR,ASSOC,[t(TOK,_)|LL1],LL0,TERM,TERM_):-
  129.     is_op(TOK,NEWPRIOR,XFY,OP),
  130.     ok_rightop(PRIOR,ASSOC,NEWPRIOR),
  131.     treat_sufinfix(NEWPRIOR,XFY,OP,LL1,LL2,TERM,TERM1),
  132.     s_higher(PRIOR,ASSOC,LL2,LL0,TERM1,TERM_).
  133.  
  134.   s_higher(PRIOR,ASSOC,[t(TOK,_)|LL1],LL0,TERM,TERM_):-
  135.     is_op(TOK,NEWPRIOR,XFY,OP),
  136.     ok_rightop(PRIOR,ASSOC,NEWPRIOR),!,
  137.     treat_sufinfix(NEWPRIOR,XFY,OP,LL1,LL2,TERM,TERM1),
  138.     s_higher(PRIOR,ASSOC,LL2,LL0,TERM1,TERM_).
  139.   s_higher(_,_,LL,LL,TERM,TERM).
  140.  
  141.   treat_sufinfix(PRIOR,yfx,OP,LL1,LL2,TERM1,cmp(FID,[TERM1,TERM2])):-
  142.     OP=FID,    s_priorterm(PRIOR,x,LL1,LL2,TERM2).
  143.   treat_sufinfix(PRIOR,xfx,OP,LL1,LL2,TERM1,cmp(FID,[TERM1,TERM2])):-
  144.     OP=FID,    s_priorterm(PRIOR,x,LL1,LL2,TERM2).
  145.   treat_sufinfix(PRIOR,xfy,OP,LL1,LL2,TERM1,cmp(FID,[TERM1,TERM2])):-
  146.     OP=FID,    s_priorterm(PRIOR,y,LL1,LL2,TERM2).
  147.   treat_sufinfix(_,xf,OP,LL,LL,TERM,cmp(FID,[TERM])):-OP=FID.
  148.   treat_sufinfix(_,yf,OP,LL,LL,TERM,cmp(FID,[TERM])):-OP=FID.
  149.