1
0
mirror of https://github.com/DanilaFe/abacus synced 2025-01-09 23:58:09 -08:00

recognise variables

This commit is contained in:
Riley Jones 2017-08-07 15:03:14 -07:00
parent 6a15c266c4
commit b9c88b9d24
6 changed files with 16 additions and 6 deletions

View File

@ -13,10 +13,7 @@ import org.nwapw.abacus.Abacus;
import org.nwapw.abacus.config.Configuration; import org.nwapw.abacus.config.Configuration;
import org.nwapw.abacus.number.ComputationInterruptedException; import org.nwapw.abacus.number.ComputationInterruptedException;
import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.number.NumberInterface;
import org.nwapw.abacus.plugin.ClassFinder; import org.nwapw.abacus.plugin.*;
import org.nwapw.abacus.plugin.PluginListener;
import org.nwapw.abacus.plugin.PluginManager;
import org.nwapw.abacus.plugin.StandardPlugin;
import org.nwapw.abacus.tree.TreeNode; import org.nwapw.abacus.tree.TreeNode;
import java.io.File; import java.io.File;
@ -217,6 +214,7 @@ public class AbacusController implements PluginListener {
PluginManager abacusPluginManager = abacus.getPluginManager(); PluginManager abacusPluginManager = abacus.getPluginManager();
abacusPluginManager.addListener(this); abacusPluginManager.addListener(this);
abacusPluginManager.addInstantiated(new StandardPlugin(abacus.getPluginManager())); abacusPluginManager.addInstantiated(new StandardPlugin(abacus.getPluginManager()));
abacusPluginManager.addInstantiated(new VariablePlugin(abacus.getPluginManager()));
try { try {
ClassFinder.loadJars("plugins").forEach(abacusPluginManager::addClass); ClassFinder.loadJars("plugins").forEach(abacusPluginManager::addClass);
} catch (IOException | ClassNotFoundException e) { } catch (IOException | ClassNotFoundException e) {

View File

@ -57,6 +57,7 @@ public class Lexer<T> {
* @return the best match. * @return the best match.
*/ */
public Match<T> lexOne(String from, int startAt, Comparator<T> compare) { public Match<T> lexOne(String from, int startAt, Comparator<T> compare) {
//boolean variable = true;
ArrayList<Match<T>> matches = new ArrayList<>(); ArrayList<Match<T>> matches = new ArrayList<>();
HashSet<PatternNode<T>> currentSet = new HashSet<>(); HashSet<PatternNode<T>> currentSet = new HashSet<>();
HashSet<PatternNode<T>> futureSet = new HashSet<>(); HashSet<PatternNode<T>> futureSet = new HashSet<>();
@ -70,6 +71,7 @@ public class Lexer<T> {
node.addOutputsInto(futureSet); node.addOutputsInto(futureSet);
} else if (node instanceof EndNode) { } else if (node instanceof EndNode) {
matches.add(new Match<>(from.substring(startAt, index), ((EndNode<T>) node).getPatternId())); matches.add(new Match<>(from.substring(startAt, index), ((EndNode<T>) node).getPatternId()));
//variable = false;
} }
} }
@ -84,6 +86,9 @@ public class Lexer<T> {
if (compare != null) { if (compare != null) {
matches.sort(Comparator.comparingInt(a -> a.getContent().length())); matches.sort(Comparator.comparingInt(a -> a.getContent().length()));
} }
//if(variable&&) {
// matches.add(new Match<>(from.substring(startAt, index), ((EndNode<T>) node).getPatternId()));
//}
return matches.isEmpty() ? null : matches.get(matches.size() - 1); return matches.isEmpty() ? null : matches.get(matches.size() - 1);
} }

View File

@ -1,5 +1,7 @@
package org.nwapw.abacus.lexing.pattern; package org.nwapw.abacus.lexing.pattern;
import org.nwapw.abacus.tree.TokenType;
/** /**
* A match that has been generated by the lexer. * A match that has been generated by the lexer.
* *

View File

@ -36,6 +36,7 @@ public class LexerTokenizer implements Tokenizer<Match<TokenType>>, PluginListen
register("[0-9]*(\\.[0-9]+)?", TokenType.NUM); register("[0-9]*(\\.[0-9]+)?", TokenType.NUM);
register("\\(", TokenType.OPEN_PARENTH); register("\\(", TokenType.OPEN_PARENTH);
register("\\)", TokenType.CLOSE_PARENTH); register("\\)", TokenType.CLOSE_PARENTH);
register("[a-zA-Z]+",TokenType.VARIABLE);
}}; }};
} }

View File

@ -63,7 +63,9 @@ public class ShuntingYardParser implements Parser<Match<TokenType>>, PluginListe
matchType = match.getType(); matchType = match.getType();
if (matchType == TokenType.NUM) { if (matchType == TokenType.NUM) {
output.add(match); output.add(match);
} else if (matchType == TokenType.FUNCTION) { }else if(matchType == TokenType.VARIABLE) {
output.add(match);
}else if (matchType == TokenType.FUNCTION) {
output.add(new Match<>("", TokenType.INTERNAL_FUNCTION_END)); output.add(new Match<>("", TokenType.INTERNAL_FUNCTION_END));
tokenStack.push(match); tokenStack.push(match);
} else if (matchType == TokenType.OP) { } else if (matchType == TokenType.OP) {
@ -144,6 +146,8 @@ public class ShuntingYardParser implements Parser<Match<TokenType>>, PluginListe
} }
} else if (matchType == TokenType.NUM) { } else if (matchType == TokenType.NUM) {
return new NumberNode(abacus.numberFromString(match.getContent())); return new NumberNode(abacus.numberFromString(match.getContent()));
} else if (matchType == TokenType.VARIABLE){
return new VariableNode(match.getContent());
} else if (matchType == TokenType.FUNCTION) { } else if (matchType == TokenType.FUNCTION) {
String functionName = match.getContent(); String functionName = match.getContent();
FunctionNode node = new FunctionNode(functionName); FunctionNode node = new FunctionNode(functionName);

View File

@ -7,7 +7,7 @@ package org.nwapw.abacus.tree;
public enum TokenType { public enum TokenType {
INTERNAL_FUNCTION_END(-1), INTERNAL_FUNCTION_END(-1),
ANY(0), WHITESPACE(1), COMMA(2), OP(3), NUM(4), FUNCTION(5), OPEN_PARENTH(6), CLOSE_PARENTH(7); ANY(0), WHITESPACE(1), COMMA(2), OP(3), NUM(4), VARIABLE(5), FUNCTION(6), OPEN_PARENTH(7), CLOSE_PARENTH(8);
/** /**
* The priority by which this token gets sorted. * The priority by which this token gets sorted.