Грамматика с круглыми скобками - PullRequest
4 голосов
/ 15 сентября 2010

У меня есть эта грамматика, и мне нужно изменить ее, чтобы разрешить скобки, такие как: (-1) и - (1 * 5), возможно, 1+ (2 * 5), а также унарный знак унарного минуса.

У кого-нибудь есть предложения, как это сделать?

<expr> ::= <term> | <expr> <op1> <term>
<term> ::= <darg> |<term> <op2> <darg>
<darg> ::= <digit> | <darg> <digit>    
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op1> ::= + | -
<op2> ::= * | /

Кажется, что-то вроде этого:

<expr> ::= <term> | <expr> <op1> <term>
<term> ::= <unary> |<term> <op2> <unary>
<unary> ::= <darg> | -<darg> | -<unary><darg>
<darg> ::= <digit> | <darg> <digit> | <paren>
<paren> ::= (<expr>)
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op1> ::= + | -
<op2> ::= * | /

1 Ответ

4 голосов
/ 15 сентября 2010

Попробуйте:

<expr>  ::= <term> | <term> <op1> <expr> 
<term>    ::= <unary> | <term> <op2> <unary> 
<unary>  ::= <value> | <op1> <value>
<darg> ::= <digit> | <darg> <digit> 
<digit> ::=  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<op1> ::= + | -
<op2> ::= * | /
<value>       ::= <darg> | ( <expr> )

Это сработало для меня.

...