我在前缀表示法中给出了一个正则表达式,如下所示:
(r* (r. r| a ( r. b b) (r. c (r* c))) a))
其中:
c (for any char c) means "regex accepting the single-character string c"
r. means "regex accepting the empty string"
r/ means "regex accepting nothing"
(r| r1 r2 ...) means "r1 union r2 union ..."
(r. r1 r2 ...) means "r1 concat r2 union ..."
(r* r1) means "r1*"
如果将上述正则表达式作为输入,我将如何将其解析为表达式树?它不能只是在空白处拆分,因为某些术语中有空格,所以我不知道从哪里开始。
答案 0 :(得分:0)
我开始通过分解括号与原子表达式来攻击它。像这样的BNF:
<expr> ::= "(" <paren-expr> ")"
| <atomic-expr>
<exprs> ::= <expr>
| <expr> <space> <exprs>
<atomic-expr> ::= <empty-expr> | <nothing-expr> | <char>
<paren-expr> ::= <union-expr> | <concat-expr> | <star-expr>
<union-expr> ::= "r|" <space> <exprs>
<star-expr> ::= "r*" <space> <expr>
希望您可以填写其余部分,并弄清楚如何将其转换为实际的可执行解析器。