LogicParser.java
Go to the documentation of this file.
00001 /*
00002  * (c) copyright 2008, Technische Universitaet Graz and Technische Universitaet Wien
00003  *
00004  * This file is part of jdiagengine.
00005  *
00006  * jdiagengine is free software: you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation, either version 3 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * jdiagengine is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  * You should have received a copy of the GNU General Public License
00016  * along with jdiagengine. If not, see <http://www.gnu.org/licenses/>.
00017  *
00018  * Authors: Joerg Weber, Franz Wotawa
00019  * Contact: jweber@ist.tugraz.at (preferred), or fwotawa@ist.tugraz.at
00020  *
00021  */
00022 
00023 
00042 package theoremprover;
00043 
00044 import java.lang.*;    // Java language classes
00045 import java.util.*;
00046 import java.awt.*;     // User Interface components
00047 import java.io.*;      // IO specific classes (File, Stream,..)
00048 import java.awt.event.*;   // Event handling
00049 
00050 import theoremprover.*;
00051 
00052 
00053 public class LogicParser extends GenericParser
00054 {
00055 
00056     // Instance creation and initialization
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     // Parsing
00075 
00076     public Object defaultResult()
00077     {
00078         return new LSentence();
00079     }
00080 
00081     // Private parsing
00082 
00083     public void parse () throws ParserErrorException
00084     {
00085         if (actualToken.isEOI()) {
00086             // do nothing
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 }


tug_ist_diagnosis_engine
Author(s): Safdar Zaman, Gerald Steinbauer
autogenerated on Mon Jan 6 2014 11:51:16