%{
#include <stdio.h>
#include <string.h>
char nonTerminal;
char alpha[100][100], beta[100][100];
int alphaCount = 0, betaCount = 0;
%}
%%
([A-Z])->.* {
char *line = yytext;
nonTerminal = line[0];
char *rhs = strchr(line, '>') + 1;
char *token = strtok(rhs, "|");
alphaCount = betaCount = 0;
while (token != NULL) {
if (token[0] == nonTerminal) {
strcpy(alpha[alphaCount++], token + 1);
} else {
strcpy(beta[betaCount++], token);
}
token = strtok(NULL, "|");
}
if (alphaCount == 0) {
printf("%s\n", line);
} else {
printf("%c -> ", nonTerminal);
for (int i = 0; i < betaCount; i++) {
printf("%s%c' ", beta[i], nonTerminal);
if (i != betaCount - 1) printf("| ");
}
printf("\n%c' -> ", nonTerminal);
for (int i = 0; i < alphaCount; i++) {
printf("%s%c' ", alpha[i], nonTerminal);
if (i != alphaCount - 1) printf("| ");
}
printf("| ε\n");
}
}
\n ;
. ;
%%
int main() {
yylex();
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCmNoYXIgbm9uVGVybWluYWw7CmNoYXIgYWxwaGFbMTAwXVsxMDBdLCBiZXRhWzEwMF1bMTAwXTsKaW50IGFscGhhQ291bnQgPSAwLCBiZXRhQ291bnQgPSAwOwoKJX0KCiUlCihbQS1aXSktPi4qIHsKICAgIGNoYXIgKmxpbmUgPSB5eXRleHQ7CgogICAgbm9uVGVybWluYWwgPSBsaW5lWzBdOwogICAgY2hhciAqcmhzID0gc3RyY2hyKGxpbmUsICc+JykgKyAxOwoKICAgIGNoYXIgKnRva2VuID0gc3RydG9rKHJocywgInwiKTsKICAgIGFscGhhQ291bnQgPSBiZXRhQ291bnQgPSAwOwoKICAgIHdoaWxlICh0b2tlbiAhPSBOVUxMKSB7CiAgICAgICAgaWYgKHRva2VuWzBdID09IG5vblRlcm1pbmFsKSB7IAogICAgICAgICAgICBzdHJjcHkoYWxwaGFbYWxwaGFDb3VudCsrXSwgdG9rZW4gKyAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJjcHkoYmV0YVtiZXRhQ291bnQrK10sIHRva2VuKTsKICAgICAgICB9CiAgICAgICAgdG9rZW4gPSBzdHJ0b2soTlVMTCwgInwiKTsKICAgIH0KCiAgICBpZiAoYWxwaGFDb3VudCA9PSAwKSB7CiAgICAgICAgcHJpbnRmKCIlc1xuIiwgbGluZSk7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ZigiJWMgLT4gIiwgbm9uVGVybWluYWwpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmV0YUNvdW50OyBpKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlcyVjJyAiLCBiZXRhW2ldLCBub25UZXJtaW5hbCk7CiAgICAgICAgICAgIGlmIChpICE9IGJldGFDb3VudCAtIDEpIHByaW50ZigifCAiKTsKICAgICAgICB9CgogICAgICAgIHByaW50ZigiXG4lYycgLT4gIiwgbm9uVGVybWluYWwpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIHByaW50ZigiJXMlYycgIiwgYWxwaGFbaV0sIG5vblRlcm1pbmFsKTsKICAgICAgICAgICAgaWYgKGkgIT0gYWxwaGFDb3VudCAtIDEpIHByaW50ZigifCAiKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJ8IM61XG4iKTsKICAgIH0KfQoKXG4gIDsKLiAgIDsKJSUKCmludCBtYWluKCkgewogICAgeXlsZXgoKTsKICAgIHJldHVybiAwOwp9Cg==