Мне трудно понять, с чего начать этот вопрос. Вопрос в том, чтобы создать грамматику для языка регулярных выражений с алфавитом { ‘a’, ‘b’, ‘c’, ‘d’, ‘|’, ‘*’, ‘(‘, ‘)’ }
. Предположим, что введена 1 строка (одна строка) и нет пробелов. Пустая строка недействительна, и она должна правильно отображать приоритет операторов, которые от низшего к высшему представляют собой объединение ('|'), конкатенацию и клини ('*
'). Как лучше всего начать писать грамматику для этого? Мы будем очень признательны за любой вклад.
Не ищу ответа, просто не знаю, с чего начать. Пока у меня есть что-то вроде:
S -> S'('S')'S
| A
A -> AA
| A'*'
| T
T -> T'|'T
| X
X -> 'a'
| 'b'
| 'c'
| 'd'
Но я не уверен, что я даже на правильном пути.
РЕДАКТИРОВАТЬ: после выполнения еще одной работы я пришел к выводу:
START -> EXPRESSION
EXPRESSION -> EXPRESSION'|'EXPRESSION
EXPRESSION -> PARENTHETICAL'*'
EXPRESSION -> PARENTHETICAL
EXPRESSION -> EXPRESSION PARENTHETICAL
EXPRESSION -> PARENTHETICAL EXPRESSION
EXPRESSION -> EXPRESSION PARENTHETICAL EXPRESSION
EXPRESSION -> REPEAT
PARENTHETICAL -> PARENTHETICAL'*'
PARENTHETICAL -> '('EXPRESSION')'
REPEAT -> REPEAT REPEAT
REPEAT -> TERMINAL'*'
REPEAT -> TERMINAL
TERMINAL -> TERMINAL'*'
TERMINAL -> 'a'
TERMINAL -> 'b'
TERMINAL -> 'c'
TERMINAL -> 'd'
Это также можно записать как:
S -> E
E -> E'|'E
E -> P'*'
E -> P
E -> E P
E -> P E
E -> E P E
E -> R
P -> P'*'
P -> '('E')'
R -> R R
R -> T'*'
R -> T
T -> T'*'
T -> 'a'
T -> 'b'
T -> 'c'
T -> 'd'
Я почти уверен, что это правильно, и я дважды проверил это с помощью множества различных тестовых входных данных. Любое подтверждение будет оценено.