// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/FunctionType.java
// public enum FunctionType {
// 
//     OPACITY("opacity");
// 
//     private String functionName;
// 
//     FunctionType(String functionName) {
//         this.functionName = functionName;
//     }
// 
//     public String getName() {
//         return functionName;
//     }
// 
//     public static FunctionType fromString(String text) {
//         if (text != null) {
//             for (FunctionType functionType : FunctionType.values()) {
//                 if (text.equalsIgnoreCase(functionType.functionName)) {
//                     return functionType;
//                 }
//             }
//         }
//         return null;
//     }
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/lexer/domain/Lexem.java
// public class Lexem {
// 
//     public final Pattern regex;
//     public final TokenType token;
// 
//     public Lexem(Pattern regex, TokenType token) {
//         this.regex = regex;
//         this.token = token;
//     }
// 
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/lexer/domain/TokenType.java
// public enum TokenType {
//     VARIABLE,
//     SELECTOR,
//     COLOR,
//     SEMICOLON,
//     EQUAL,
//     OPEN_RULE,
//     CLOSE_RULE,
//     PROPERTY,
//     NUMBER,
//     DIMENSION,
//     OPEN_BRACKET,
//     CLOSE_BRACKET,
//     FUNCTION,
//     COMMA,
//     END
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/util/StringUtils.java
// public class StringUtils {
// 
//     public static String capitalize(final String line) {
//         return Character.toUpperCase(line.charAt(0)) + line.substring(1);
//     }
// 
//     public static String join(FunctionType[] objectArray, String conjunction) {
//         StringBuilder sb = new StringBuilder();
//         boolean first = true;
//         for (FunctionType item : objectArray) {
//             if (first) {
//                 first = false;
//             } else {
//                 sb.append(conjunction);
//             }
//             sb.append(item.getName());
//         }
//         return sb.toString();
//     }
// }


import com.manolovn.cssdroid.parser.domain.FunctionType;
import com.manolovn.cssdroid.parser.lexer.domain.Lexem;
import com.manolovn.cssdroid.parser.lexer.domain.TokenType;
import com.manolovn.cssdroid.util.StringUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
package com.manolovn.cssdroid.parser.lexer;



/**
 * CssDroid grammar
 */
public class CssDroidGrammar {

    private final LinkedList<Lexem> lexems;

    public CssDroidGrammar() {
        lexems = new LinkedList<>();

// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/domain/FunctionType.java
// public enum FunctionType {
// 
//     OPACITY("opacity");
// 
//     private String functionName;
// 
//     FunctionType(String functionName) {
//         this.functionName = functionName;
//     }
// 
//     public String getName() {
//         return functionName;
//     }
// 
//     public static FunctionType fromString(String text) {
//         if (text != null) {
//             for (FunctionType functionType : FunctionType.values()) {
//                 if (text.equalsIgnoreCase(functionType.functionName)) {
//                     return functionType;
//                 }
//             }
//         }
//         return null;
//     }
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/lexer/domain/Lexem.java
// public class Lexem {
// 
//     public final Pattern regex;
//     public final TokenType token;
// 
//     public Lexem(Pattern regex, TokenType token) {
//         this.regex = regex;
//         this.token = token;
//     }
// 
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/lexer/domain/TokenType.java
// public enum TokenType {
//     VARIABLE,
//     SELECTOR,
//     COLOR,
//     SEMICOLON,
//     EQUAL,
//     OPEN_RULE,
//     CLOSE_RULE,
//     PROPERTY,
//     NUMBER,
//     DIMENSION,
//     OPEN_BRACKET,
//     CLOSE_BRACKET,
//     FUNCTION,
//     COMMA,
//     END
// }
// 
// Path: cssdroid/src/main/java/com/manolovn/cssdroid/util/StringUtils.java
// public class StringUtils {
// 
//     public static String capitalize(final String line) {
//         return Character.toUpperCase(line.charAt(0)) + line.substring(1);
//     }
// 
//     public static String join(FunctionType[] objectArray, String conjunction) {
//         StringBuilder sb = new StringBuilder();
//         boolean first = true;
//         for (FunctionType item : objectArray) {
//             if (first) {
//                 first = false;
//             } else {
//                 sb.append(conjunction);
//             }
//             sb.append(item.getName());
//         }
//         return sb.toString();
//     }
// }


// Path: cssdroid/src/main/java/com/manolovn/cssdroid/parser/lexer/CssDroidGrammar.java
import com.manolovn.cssdroid.parser.domain.FunctionType;
import com.manolovn.cssdroid.parser.lexer.domain.Lexem;
import com.manolovn.cssdroid.parser.lexer.domain.TokenType;
import com.manolovn.cssdroid.util.StringUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;

package com.manolovn.cssdroid.parser.lexer;



/**
 * CssDroid grammar
 */
public class CssDroidGrammar {

    private final LinkedList<Lexem> lexems;

    public CssDroidGrammar() {
        lexems = new LinkedList<>();

        add("(" + StringUtils.join(FunctionType.values(), "|") + ")", TokenType.FUNCTION);