Это сделает мою грамматику неоднозначной?
Хорошо, допустим, у меня есть следующая грамматика
<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>
двумя разными способами. Первый способ вы уже показали, а второй - это тривиальное применение нового производства.