我很难弄清楚从哪里开始这个问题。问题是用字母表为正则表达式的语言创建一个语法{ ‘a’, ‘b’, ‘c’, ‘d’, ‘|’, ‘*’, ‘(‘, ‘)’ }
。假设有 1 行输入(单个字符串)并且没有空格。空字符串是无效的,它应该正确地捕获运算符的优先级,从低到高是联合('|')、连接和 kleene(' *
')。开始为此编写语法的最佳方法是什么?任何投入将不胜感激。
不寻找答案,只是不知道如何开始。到目前为止,我有类似的东西:
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'
我相当肯定这是正确的,我用一堆不同的测试输入仔细检查了它。任何确认将不胜感激。