Рассмотрим следующую грамматику BNF - PullRequest
1 голос
/ 08 декабря 2010

Рассмотрим следующую грамматику BNF (где нетерминалы заключены в угловые скобки и <identifier> соответствует любому допустимому идентификатору переменной Java).

<exp> ::= <exp> + <term>
      |   <exp> - <term>
      |   <term>
<term> ::= <term> * <factor>
       |   <term> / <factor>
       |   <factor>
<factor> ::= ( <exp> )
         |   <identifier>

Создайте три деривации для следующего выражения:

(x - a) * (y + b)

Начиная с exp:

<exp>

заменить exp на термин:

<term>

заменить термин на:

<term> * <factor>

заменитьтермин с фактором:

<factor> * <factor>

замените оба фактора на (exp):

( <exp> ) * ( <exp> )

замените первый exp на exp - term, а второй на exp + term

( <exp> - <term> ) * ( <exp> + <term> )

заменить оба выражения на срок, а затем заменить все 4 условия на факторы.

( <factor> - <factor> ) * ( <factor> + <factor> )

заменить все факторы на идентификаторы

( <identifier> - <identifier> ) * ( <identifier> + <identifier> )

Достаточно ли этого?

1 Ответ

6 голосов
/ 08 декабря 2010

Вам нужно сделать еще один шаг - <factor> - нетерминал, и вы должны уменьшить его до <identifier>.

Кроме того, вы должны начинать с <expr> (а затем уменьшить его до <term>), а не начинать с <term> напрямую.

...