package pl.edu.amu.wmi.daut.re; import java.util.List; /** * @author dyskograf Klasa przechowująca narzędzia do obsługi gramatyk.. */ public class GrammarUtils { /** * Metoda sprawdzająca, czy podana gramatyka jest w postaci normalnej * Chomsky'ego. */ public boolean isChomsky(Grammar g) { List<GrammarRule> rules = g.allRules(); for (GrammarRule rule : rules) { if (rule.getArity() > 2 || rule.getArity() == 0 || rule.getRhsSecondSymbol().isTerminalSymbol() || (rule.getRhsFirstSymbol().isTerminalSymbol() && !(rule.getRhsSecondSymbol().isTerminalSymbol()))) { return false; } } return true; } /** * Główna metoda klasy. */ public boolean isLinear(Grammar g) { for (GrammarRule rule : g.allRules()) { int terminalSymbols = 0; for (GrammarSymbol symbol : rule.getRhsSymbols()) if (symbol.isTerminalSymbol()) terminalSymbols++; if (terminalSymbols > 1) return false; } return true; } /** * Metoda sprawdzająca, czy podana gramatyka jest w postaci normalnej * Greibach. */ public boolean isGreibach(Grammar g) { List<GrammarRule> rules = g.allRules(); for (GrammarRule rule : rules) { if (rule.getArity() == 0) { return false; } if (!(rule.getRhsFirstSymbol().isTerminalSymbol())) { return false; } else if (rule.getArity() >= 2) { List<GrammarSymbol> rhsSymbols = rule.getRhsSymbols(); for (int i = 1; i < rhsSymbols.size(); i++) { if (rhsSymbols.get(i).isTerminalSymbol()) { return false; } } } } return true; } }