|
| 1 | +package week5.grammar; |
| 2 | + |
| 3 | +import week4.regex.RegexParser; |
| 4 | +import week4.regex.ast.*; |
| 5 | + |
| 6 | +public class RegexGrammar { |
| 7 | + |
| 8 | + // Konstandid ilutrüki jaoks |
| 9 | + private static final char EPS = 'ε'; |
| 10 | + private static final String ARROW = " → "; |
| 11 | + |
| 12 | + public static void printGrammar(RegexNode node) { |
| 13 | + new RegexGrammar().printGrammarNode(node, 'S'); |
| 14 | + } |
| 15 | + |
| 16 | + private char nextNt = 'A'; |
| 17 | + // Genereeri järgmine mitte-terminal (eeldades, et neid liiga palju ei ole). |
| 18 | + private char getNextNt() { |
| 19 | + if (nextNt == 'S') nextNt++; // Jätame S vahele, et seda saaks kasutada algsümbolina. |
| 20 | + return nextNt++; |
| 21 | + } |
| 22 | + |
| 23 | + /** |
| 24 | + * @param nt Praegu defineeritav mitte-terminal |
| 25 | + */ |
| 26 | + private void printGrammarNode(RegexNode regex, char nt) { |
| 27 | + switch (regex) { |
| 28 | + case Letter(char symbol) -> System.out.println(nt + ARROW + symbol); |
| 29 | + case Epsilon _ -> System.out.println(nt + ARROW + EPS); |
| 30 | + case Repetition(RegexNode child) -> { |
| 31 | + char childNt = getNextNt(); |
| 32 | + System.out.println(nt + ARROW + childNt + nt); |
| 33 | + System.out.println(nt + ARROW + EPS); |
| 34 | + printGrammarNode(child, childNt); |
| 35 | + } |
| 36 | + case Concatenation(RegexNode left, RegexNode right) -> { |
| 37 | + char leftNt = getNextNt(); |
| 38 | + char rightNt = getNextNt(); |
| 39 | + System.out.println(nt + ARROW + leftNt + rightNt); |
| 40 | + printGrammarNode(left, leftNt); |
| 41 | + printGrammarNode(right, rightNt); |
| 42 | + } |
| 43 | + case Alternation(RegexNode left, RegexNode right) -> { |
| 44 | + char leftNt = getNextNt(); |
| 45 | + char rightNt = getNextNt(); |
| 46 | + System.out.println(nt + ARROW + leftNt); |
| 47 | + System.out.println(nt + ARROW + rightNt); |
| 48 | + printGrammarNode(left, leftNt); |
| 49 | + printGrammarNode(right, rightNt); |
| 50 | + } |
| 51 | + } |
| 52 | + } |
| 53 | + |
| 54 | + static void main() { |
| 55 | + printGrammar(RegexParser.parse("(a|bc)*")); |
| 56 | + } |
| 57 | +} |
0 commit comments