Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00042 package theoremprover;
00043 
00044 import java.lang.*;    
00045 import java.util.*;
00046 import java.awt.*;     
00047 import java.io.*;      
00048 import java.awt.event.*;   
00049 
00050 import theoremprover.*;
00051 
00052 
00053 public class LogicParser extends GenericParser
00054 {
00055 
00056     
00057 
00058     public LogicParser()
00059     {
00060         scanner = defaultScanner();
00061         source = "";
00062         actualToken = null;
00063         result = null;
00064     }
00065 
00066     public LogicParser(String str)
00067     {
00068         scanner = defaultScanner();
00069         source = str;
00070         actualToken = null;
00071         result = null;
00072     }
00073 
00074     
00075 
00076     public Object defaultResult()
00077     {
00078         return new LSentence();
00079     }
00080 
00081     
00082 
00083     public void parse () throws ParserErrorException
00084     {
00085         if (actualToken.isEOI()) {
00086             
00087         } else {
00088             parseSentence();
00089             parse();
00090         }
00091     }
00092 
00093     public void parseSentence () throws ParserErrorException
00094     {
00095         ArrayList tail = new ArrayList();
00096         LPredicate head;
00097 
00098         if (actualToken.isDelimiter() && actualToken.equalValue("->")) {
00099             nextToken();
00100             head = parsePredicate();
00101             if (actualToken.isDelimiter() && 
00102                 actualToken.equalValue(".")) {
00103                 (((theoremprover.LSentence)result).rules).
00104                     add(new LRule(tail,head));
00105                 nextToken();
00106             } else {
00107                 errorDetected("'.' expected");
00108             }
00109         } else {
00110             LPredicate pred;
00111             pred = parsePredicate();
00112             if (actualToken.isDelimiter() &&
00113                 actualToken.equalValue(",")) {
00114                 tail.add(pred);
00115                 tail = parseAntecedenceRest(tail);
00116                 if (actualToken.isDelimiter() &&
00117                     actualToken.equalValue("->")) {
00118                     nextToken();
00119                     head = parsePredicate();
00120                     if (actualToken.isDelimiter() && 
00121                         actualToken.equalValue(".")) {
00122                         (((theoremprover.LSentence)result).rules).
00123                             add(new LRule(tail,head));
00124                         nextToken();
00125                     } else {
00126                         errorDetected("'.' expected");
00127                     }
00128                 }
00129             } else if (actualToken.isDelimiter() &&
00130                        actualToken.equalValue(":-")) {
00131                 nextToken();
00132                 head = pred;
00133                 tail = parseAntecedence(tail);
00134                 if (actualToken.isDelimiter() &&
00135                     actualToken.equalValue(".")) {
00136                     (((theoremprover.LSentence)result).rules).
00137                         add(new LRule(tail,head));
00138                     nextToken();
00139                 } else {
00140                     errorDetected("'.' expected");
00141                 }
00142             } else if (actualToken.isDelimiter() &&
00143                        actualToken.equalValue(".")) {
00144                 head = pred;
00145                 (((theoremprover.LSentence)result).rules).
00146                     add(new LRule(tail,head));
00147                 nextToken();
00148             } else if (actualToken.isDelimiter() &&
00149                        actualToken.equalValue("->")) {
00150                 nextToken();
00151                 tail.add(pred);
00152                 head = parsePredicate();
00153                 if (actualToken.isDelimiter() && 
00154                     actualToken.equalValue(".")) {
00155                     (((theoremprover.LSentence)result).rules).
00156                         add(new LRule(tail,head));
00157                     nextToken();
00158                 } else {
00159                     errorDetected("'.' expected");
00160                 }
00161             } else {
00162                 errorDetected("',', ':-', '->', or '.' expected");
00163             }
00164         }
00165     }
00166 
00167     public LPredicate parsePredicate () throws ParserErrorException
00168     {
00169         LPredicate pred = new LPredicate();
00170         if (actualToken.isIdentifier() || actualToken.isString()) {
00171             pred.identifier = actualToken.value();
00172             nextToken();
00173             if (actualToken.isDelimiter() && 
00174                 actualToken.equalValue("(")) {
00175                 nextToken();
00176                 pred.arguments = parseArguments(new ArrayList());
00177                 if (actualToken.isDelimiter() &&
00178                     actualToken.equalValue(")")) {
00179                     nextToken();
00180                 } else {
00181                     errorDetected("')' expected");
00182                 }
00183             }
00184         } else {
00185             errorDetected("Identifier or string expected");
00186         }
00187         return pred;
00188     }
00189 
00190     public ArrayList parseArguments (ArrayList v) throws ParserErrorException
00191     {
00192         if (actualToken.isDelimiter() &&
00193             actualToken.equalValue(")")) {
00194             return v;
00195         }
00196         while (true) {
00197             v.add(parseFunction());
00198             if (actualToken.isDelimiter() &&
00199                 actualToken.equalValue(",")) {
00200                 nextToken();
00201             } else {
00202                 return v;
00203             }
00204         }
00205     }
00206 
00207     public LObject parseFunction () throws ParserErrorException
00208     {
00209         LObject obj = null;
00210 
00211         if (actualToken.isIdentifier() ||
00212             actualToken.isString() ||
00213             actualToken.isCharacter()) {
00214             String val;
00215             if (actualToken.isIdentifier()) {
00216                 val = actualToken.value();
00217             } else if (actualToken.isString()) {
00218                 val = "\"" + actualToken.value() + "\"";
00219             } else {
00220                 val = "'" + actualToken.value() + "'";
00221             }
00222             nextToken();
00223             if (actualToken.isDelimiter() &&
00224                 actualToken.equalValue("(")) {
00225                 nextToken();
00226                 obj = new LFunction(val,parseArguments(new ArrayList()));
00227                 if (actualToken.isDelimiter() &&
00228                     actualToken.equalValue(")")) {
00229                     nextToken();
00230                 } else {
00231                     errorDetected("')' expected");
00232                 }
00233             } else {
00234                 if (Character.isUpperCase(val.charAt(0))) {
00235                     obj = new LVariable(val);
00236                 } else {
00237                     obj = new LConstant(val);
00238                 }
00239             }
00240         } else if (actualToken.isFloat() ||
00241                    actualToken.isInteger() ||
00242                    actualToken.isCharacter()) {
00243             String val;
00244             if (actualToken.isCharacter()) {
00245                 val = "'" + actualToken.value() + "'";
00246             } else {
00247                 val = actualToken.value();
00248             }
00249             obj = new LConstant(val);
00250             nextToken();
00251         } else {
00252             errorDetected("Identifier, string, float, integer, or character expected");
00253         }
00254         return obj;
00255     }
00256 
00257     public ArrayList parseAntecedence (ArrayList v) throws ParserErrorException
00258     {
00259         LPredicate pred;
00260         pred = parsePredicate();
00261         v.add(pred);
00262         if (actualToken.isDelimiter() && 
00263             actualToken.equalValue(",")) {
00264             v = parseAntecedenceRest(v);
00265         } 
00266         return v;
00267     }
00268 
00269     public ArrayList parseAntecedenceRest (ArrayList v) throws ParserErrorException
00270     {
00271         while (true) {
00272             LPredicate pred;
00273             if (actualToken.isDelimiter() && 
00274                 actualToken.equalValue(",")) {
00275                 nextToken();
00276                 pred = parsePredicate();
00277                 v.add(pred);
00278             } else {
00279                 return v;
00280             } 
00281         } 
00282     }
00283 
00284 }