Если у меня есть язык с основными вещами, такими как
a = expression
if expression then ...
while expression do ...
тогда у меня может быть грамматика, которая выглядит так: (псевдокод)
assignment: identifier Equals expression ;
if : If expression Then ...
while : While expression Do ...
Теперь тип первого выражения просто должен быть совместим по типу с 'a', но два других выражения должны иметь тип boolean.
В то время как легко проверить тип выражения везде, мне кажется, было бы очень удобно определить в грамматике
boolExpression : expression;
и тогда мои другие правила будут выглядеть так:
assignment: identifier Equals expression ;
if : If boolExpression Then ...
while : While boolExpression Do ...
Это позволило бы мне проверить, что boolExpression возвращает тип BOOL, и поэтому мне не пришлось бы добавлять код для проверки каждого выражения.
Но превратил ли я контекстно-свободную грамматику в контекстно-зависимую грамматику, сделав это? И если да, то имеет ли это значение?