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 }