/** * */ package com.sap.furcas.parsergenerator.util; import java.util.ArrayList; import java.util.List; /** * Util class for the specialized task of finding ocurrences of "@lexer::members [[ ... ]]" within a String * cutting out he occurences, and returning the contents within the brackets. */ public class LexerStringMemberExtractor { private static final String LEXERMEMBER = "@lexer::members"; private static final String LEXERMEMBER_OPEN = "[["; private static final String LEXERMEMBER_CLOSE = "]]"; private String cutLexerString; private List<String> contentParts; public LexerStringMemberExtractor(String lexerString) throws InvalidLexerStringException { StringBuilder resultLexerString = new StringBuilder(lexerString.length()); contentParts = cutLexerMembers(lexerString, resultLexerString, 0); cutLexerString = resultLexerString.toString(); } /** * @return the cutLexerString */ public String getCutLexerString() { return cutLexerString; } /** * @return the contentParts */ public List<String> getContentParts() { return contentParts; } /** * to be called recursively. Adds to the Stringbuilder the parts of the string excluding "@lexer::members [[...]]" * and returns a list of all the contents within such brackets. * @param lexerString * @param resultLexerString * @param startIndex * @return * @throws InvalidLexerStringException if syntax format is violated */ private static List<String> cutLexerMembers(String lexerString, StringBuilder resultLexerString, int startIndex) throws InvalidLexerStringException { int index = lexerString.indexOf(LEXERMEMBER, startIndex); if ( index >= 0) { int searchIndex = index + LEXERMEMBER.length(); // find the relevant region by finding start an end brackets int bracketStart = lexerString.indexOf(LEXERMEMBER_OPEN, searchIndex); int bracketEnd = lexerString.indexOf(LEXERMEMBER_CLOSE, searchIndex); // check sanity if (bracketStart == -1) { throw new InvalidLexerStringException("Missing opening brackets " + LEXERMEMBER_OPEN + " after " + LEXERMEMBER); } else if (bracketEnd == -1) { throw new InvalidLexerStringException("Missing closing brackets " + LEXERMEMBER_CLOSE + " after " + LEXERMEMBER); } else if (bracketEnd < bracketStart) { throw new InvalidLexerStringException("Closing brackets " + LEXERMEMBER_CLOSE + " before opening brackets after " + LEXERMEMBER); } else { String substring = lexerString.substring(searchIndex, bracketStart); if (! substring.trim().matches("")) { throw new InvalidLexerStringException("Bad characters after " + LEXERMEMBER + " :" + substring); } } String content = lexerString.substring(bracketStart + LEXERMEMBER_OPEN.length(), bracketEnd); resultLexerString.append(lexerString.substring(startIndex, index)); // search in the remaining bits List<String> othermembers = cutLexerMembers(lexerString, resultLexerString, bracketEnd + LEXERMEMBER_CLOSE.length()); othermembers.add(0, content); return othermembers; } else { // lexermember not found in the remaining bit resultLexerString.append(lexerString.substring(startIndex, lexerString.length())); return new ArrayList<String>(); } } public static class InvalidLexerStringException extends Exception { private static final long serialVersionUID = -2103938980689077911L; public InvalidLexerStringException(String message) { super(message); } } }