public Scanner(Scanner other) { copy(other); }
public Symbol moveNext(int count) { for (int i = 0; i < count; i++) scanner.moveNextIgnoreFirst(specification); return scanner.getCurrent(); }
public int getOffset() { return scanner.getOffset(); } public boolean atEnd() { return scanner.isEnd(); }
/** * * @param parser parser * @param scanner scanner * @return a possible value if parser should stop. */ public Maybe<Symbol> parseSymbol(Parser parser, Scanner scanner) { while (true) { Scanner backup = new Scanner(scanner); scanner.moveNextIgnoreFirst(this); if (scanner.isEnd()) return Maybe.nothingBecause("scanner is at end of buffer"); Symbol currentToken = scanner.getCurrent(); int startOffset = currentToken.getStartOffset(); if (endsOn(currentToken.getType()) || parser.parentOwns(currentToken.getType(), this)) { scanner.copy(backup); return Maybe.nothingBecause("At termination symbol or parent owns symbol"); } if (terminatesOn(currentToken.getType())) return Maybe.nothingBecause("At termination symbol"); Rule currentRule = currentToken.getType().getWikiRule(); Maybe<Symbol> parsedSymbol = currentRule.parse(currentToken, parser); if (parsedSymbol.isNothing()) { ignoreFirst(currentToken.getType()); scanner.copy(backup); } else { parsedSymbol.getValue().setStartOffset(startOffset).setEndOffset(scanner.getOffset()); clearIgnoresFirst(); return parsedSymbol; } } }
public Maybe<String> parseToAsString(SymbolType terminator) { int start = scanner.getOffset(); scanner.markStart(); parseTo(terminator); if (!atEnd() && !getCurrent().isType(terminator)) return Maybe.noString; return scanner.stringFromStart(start); }
public Maybe<String> stringFromStart(int start) { int end = getOffset() - getCurrent().getContent().length(); return start <= end ? new Maybe<>(input.rawSubstring(start, end)) : Maybe.noString; }
public void moveNextIgnoreFirst(ParseSpecification specification) { Step step = makeNextStep(specification, next); next = step.nextPosition; symbols.add(step.token); }
public List<Symbol> peek(SymbolType[] types) { List<Symbol> lookAhead = scanner.peek(types.length, new ParseSpecification().provider(specification)); if (lookAhead.size() != types.length) return emptySymbols; for (int i = 0; i < lookAhead.size(); i++) { if (!lookAhead.get(i).isType(types[i])) return emptySymbols; } return lookAhead; }
public static Parser make(ParsingPage currentPage, CharSequence input, SymbolProvider provider) { ParseSpecification specification = new ParseSpecification().provider(provider); return new Parser(null, currentPage, new Scanner(new TextMaker(currentPage, currentPage.getNamedPage()), input), specification); }
public String parseLiteral(SymbolType terminator) { return scanner.makeLiteral(terminator).getContent(); }
public void moveNext() { moveNextIgnoreFirst(new ParseSpecification()); }
public Symbol getCurrent() { return scanner.getCurrent(); } public int getOffset() { return scanner.getOffset(); }
public boolean atEnd() { return scanner.isEnd(); } public boolean isMoveNext(SymbolType type) { return moveNext(1).isType(type); }
/** * * @param parser parser * @param scanner scanner * @return a possible value if parser should stop. */ public Maybe<Symbol> parseSymbol(Parser parser, Scanner scanner) { while (true) { Scanner backup = new Scanner(scanner); scanner.moveNextIgnoreFirst(this); if (scanner.isEnd()) return Maybe.nothingBecause("scanner is at end of buffer"); Symbol currentToken = scanner.getCurrent(); int startOffset = currentToken.getStartOffset(); if (endsOn(currentToken.getType()) || parser.parentOwns(currentToken.getType(), this)) { scanner.copy(backup); return Maybe.nothingBecause("At termination symbol or parent owns symbol"); } if (terminatesOn(currentToken.getType())) return Maybe.nothingBecause("At termination symbol"); Rule currentRule = currentToken.getType().getWikiRule(); Maybe<Symbol> parsedSymbol = currentRule.parse(currentToken, parser); if (parsedSymbol.isNothing()) { ignoreFirst(currentToken.getType()); scanner.copy(backup); } else { parsedSymbol.getValue().setStartOffset(startOffset).setEndOffset(scanner.getOffset()); clearIgnoresFirst(); return parsedSymbol; } } }
public Maybe<String> parseToAsString(SymbolType terminator) { int start = scanner.getOffset(); scanner.markStart(); parseTo(terminator); if (!atEnd() && !getCurrent().isType(terminator)) return Maybe.noString; return scanner.stringFromStart(start); }
public Maybe<String> stringFromStart(int start) { int end = getOffset() - getCurrent().getContent().length(); return start <= end ? new Maybe<>(input.rawSubstring(start, end)) : Maybe.noString; }
public List<Symbol> peek(int count, ParseSpecification specification) { List<Symbol> result = new ArrayList<>(count); int startPosition = next; for (int i = 0; i < count; i++) { Step step = makeNextStep(specification, startPosition); result.add(step.token); if (input.isEnd()) break; startPosition = step.nextPosition; } return result; }
public List<Symbol> peek(SymbolType[] types) { List<Symbol> lookAhead = scanner.peek(types.length, new ParseSpecification().provider(specification)); if (lookAhead.size() != types.length) return emptySymbols; for (int i = 0; i < lookAhead.size(); i++) { if (!lookAhead.get(i).isType(types[i])) return emptySymbols; } return lookAhead; }
public static Parser make(ParsingPage currentPage, CharSequence input, SymbolProvider provider) { ParseSpecification specification = new ParseSpecification().provider(provider); return new Parser(null, currentPage, new Scanner(new TextMaker(currentPage, currentPage.getNamedPage()), input), specification); }
public String parseLiteral(SymbolType terminator) { return scanner.makeLiteral(terminator).getContent(); }