Это сделает мою грамматику неоднозначной?

Хорошо, допустим, у меня есть следующая грамматика

<Exp> ->  <Term>
<EXp>  -> <Term> {<AddOp> <Exp>}  
<Term> -> <Factor> {<MultOp> <Term>}
<Factor> -> <id> |  <no> | ( <Exp> )

Вещи внутри {} не являются обязательными. так что технически я могу просто иметь exp->term или term->Factor. Теперь возможен следующий вывод, скажем, номер 10. exp->term->factor->no->10.. можно я просто добавлю no к exp?

<Exp> ->  <Term>|<no>

или это сделает грамматику двусмысленной или любые другие проблемы? Благодарю.

Ps Addop и MultOp просто + и *

1 ответ

Ваша начальная грамматика уже неоднозначна: <Exp> производный <Term> двумя способами: через производство 1 и через производство 2. Производство 1 ничего не добавляет к грамматике, так что вы можете просто удалить ее и получить однозначную грамматику для того же языка.

Но тогда, если вы добавите производство <Exp> -> <no>, вы получите неоднозначную грамматику снова, потому что <Exp> выведет <no> двумя разными способами. Первый способ вы уже показали, а второй - это тривиальное применение нового производства.

Другие вопросы по тегам