1
0
mirror of https://github.com/DanilaFe/abacus synced 2026-01-26 00:25:20 +00:00

Add a lot of comments. More to come.

This commit is contained in:
2017-07-25 22:47:48 -07:00
parent ade4eb1035
commit c19ae3b071
13 changed files with 343 additions and 0 deletions

View File

@@ -9,19 +9,42 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
/**
* A lexer that can generate tokens of a given type given a list of regular expressions
* to operate on.
* @param <T> the type used to identify which match belongs to which pattern.
*/
public class Lexer<T> {
/**
* The registered patterns.
*/
private ArrayList<Pattern<T>> patterns;
/**
* Creates a new lexer with no registered patterns.
*/
public Lexer(){
patterns = new ArrayList<>();
}
/**
* Registers a single pattern.
* @param pattern the pattern regex
* @param id the ID by which to identify the pattern.
*/
public void register(String pattern, T id){
Pattern<T> compiledPattern = new Pattern<>(pattern, id);
if(compiledPattern.getHead() != null) patterns.add(compiledPattern);
}
/**
* Reads one token from the given string.
* @param from the string to read from
* @param startAt the index to start at
* @param compare the comparator used to sort tokens by their ID.
* @return the best match.
*/
public Match<T> lexOne(String from, int startAt, Comparator<T> compare){
ArrayList<Match<T>> matches = new ArrayList<>();
HashSet<PatternNode<T>> currentSet = new HashSet<>();
@@ -53,6 +76,13 @@ public class Lexer<T> {
return matches.isEmpty() ? null : matches.get(matches.size() - 1);
}
/**
* Reads all tokens from a string.
* @param from the string to start from.
* @param startAt the index to start at.
* @param compare the comparator used to sort matches by their IDs.
* @return the resulting list of matches, in order, or null on error.
*/
public ArrayList<Match<T>> lexAll(String from, int startAt, Comparator<T> compare){
int index = startAt;
ArrayList<Match<T>> matches = new ArrayList<>();