Вопрос по поводу БНФ - PullRequest
       16

Вопрос по поводу БНФ

0 голосов
/ 05 февраля 2011

У меня есть эта грамматика, написанная на BNF. Как мне преобразовать его, чтобы дать + приоритет над * и заставить + быть ассоциативно правильным?

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <expr> + term | <term>
<term>   -> <term> * <factor> | <factor>
<factor> -> ( <expr> ) | <id>

Это мое решение:

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <expr> * term | <term>
<term>   -> <term> + <factor> | <factor>
<factor> -> ( <expr> ) | <id>

Как я могу проверить правильность данной грамматики? Есть идеи?
Спасибо,

1 Ответ

2 голосов
/ 12 февраля 2011

Выглядит странно, что вы хотите отменить приоритет умножения над сложением, но в любом случае, если вам нужна грамматика таким образом, то правильным будет BNF (вы сделали опечатку в третьем произведении)

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <expr> * <term> | <term>
<term>   -> <term> + <factor> | <factor>
<factor> -> ( <expr> ) | <id>

Что подходит для синтаксического анализатора LR (снизу вверх).

Для синтаксического анализатора LL (сверху вниз) приведенная выше грамматика вызовет рекурсию влево на <expr> и <term>.Чтобы обойти эту проблему, вы должны использовать эту грамматику для анализаторов LL:

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <term> * <expr> | <term>
<term>   -> <factor> + <term> | <factor>
<factor> -> ( <expr> ) | <id>
...