public Symbol parse(Parser parser, Scanner scanner) { Symbol result = new Symbol(SymbolType.SymbolList); result.setStartOffset(scanner.getOffset()); while (true) { Maybe<Symbol> parsedSymbol = parseSymbol(parser, scanner); if (parsedSymbol.isNothing()) { break; } else { result.add(parsedSymbol.getValue()); } } result.setEndOffset(scanner.getOffset()); return result; }
public Symbol parse(Parser parser, Scanner scanner) { Symbol result = new Symbol(SymbolType.SymbolList); result.setStartOffset(scanner.getOffset()); while (true) { Maybe<Symbol> parsedSymbol = parseSymbol(parser, scanner); if (parsedSymbol.isNothing()) { break; } else { result.add(parsedSymbol.getValue()); } } result.setEndOffset(scanner.getOffset()); return result; }
@Override public Maybe<Symbol> parse(Symbol current, Parser parser) { String content = current.getContent(); if (content.charAt(0) == '-') current.putProperty("hideFirst", ""); boolean endOfTable = false; while (!endOfTable) { Symbol row = new Symbol(tableRow); row.setStartOffset(parser.getOffset()); current.add(row); while (true) { int offset = parser.getOffset(); Symbol cell = parseCell(parser, content); if (parser.getOffset() == offset) { endOfTable = true; break; } if (parser.atEnd()) return Symbol.nothing; if (containsNewLine(cell)) return Symbol.nothing; row.add(cell); if (endsRow(parser.getCurrent())) break; } row.setEndOffset(parser.getOffset()); if (!startsRow(parser.getCurrent())) break; } return new Maybe<>(current); }
@Override public Maybe<Symbol> parse(Symbol current, Parser parser) { String content = current.getContent(); if (content.charAt(0) == '-') current.putProperty("hideFirst", ""); boolean endOfTable = false; while (!endOfTable) { Symbol row = new Symbol(tableRow); row.setStartOffset(parser.getOffset()); current.add(row); while (true) { int offset = parser.getOffset(); Symbol cell = parseCell(parser, content); if (parser.getOffset() == offset) { endOfTable = true; break; } if (parser.atEnd()) return Symbol.nothing; if (containsNewLine(cell)) return Symbol.nothing; row.add(cell); if (endsRow(parser.getCurrent())) break; } row.setEndOffset(parser.getOffset()); if (!startsRow(parser.getCurrent())) break; } return new Maybe<>(current); }
/** * * @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; } } }
/** * * @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; } } }