Вопросы из второй главы книги о драконах - PullRequest
1 голос
/ 28 марта 2012

На странице 29 написано: «Листья дерева разбора, читаемые слева направо, образуют выход дерева, которое является строкой, сгенерированной или полученной из нетерминала в корне дерева разбора. На рис. 2.2 сгенерированная строка - 9-5 * 2. На этом рисунке все листья показаны на нижнем уровне. Отныне мы не обязательно выстроим листья таким образом ». почему нет?

Он также говорит: «Любое дерево придает своим листьям естественный порядок слева направо, основываясь на идее, что если a и b два ребенка с одним и тем же родителем, а a слева от b, то все потомки а находятся слева от потомков б. " что это значит?

P.S. Это второе издание книги

1 Ответ

3 голосов
/ 28 марта 2012

Итак, прежде всего, для тех, кто хочет прокомментировать это, номера страниц выше относятся к первому изданию. Во втором издании номер страницы - 46, а ссылка на диаграмму - рисунок 2.5.

РЕДАКТИРОВАТЬ: автор, имея в виду расширение листьев вниз до дна, говорит о перемещении всех листьев дерева, чтобы они были выровнены вертикально друг с другом, независимо от того, находятся ли они на одном уровне в дереве. На рисунке 2.2 они вытянуты до дна, так что каждый лист находится внизу диаграммы и выровнен по вертикали слева направо. Если вы посмотрите на некоторые другие диаграммы позже в книге, это не будет сделано, и листья будут показаны вертикально выровненными с другими узлами на том же уровне, независимо от того, являются ли эти другие узлы листьями. Этот последний способ является обычным способом рисования деревьев и наиболее экономичен.

Что касается вашего первого вопроса, я полагаю, что причина, по которой они этого не делают - это сэкономить место. Если вы посмотрите на правую часть рисунка 2.4, если автор должен был вытянуть листья вниз, то поддерево с буквой в качестве корня должно быть перемещено вправо, занимая больше места, чем на самом деле необходимо. Хотя это минимальный случай и не имеет большого значения, можно представить более большое дерево (которое, я уверен, есть в книге, хотя я не пошел искать), которому понадобилось бы больше места.

По второму вопросу, по сути, говорится, что если у вас было a * b + c * d, и вы рассматривали умножения как братьев и сестер (как они должны были бы поддерживать порядок операций), то листья a и b будет слева от c и d в дереве, так же, как они находятся слева от c и d в уравнении. По сути, это просто говорит то, что уже сказано в первой части, а именно, что листья дерева должны читаться слева направо, чтобы точно воспроизвести исходный синтаксис, не переключая порядок каких-либо частей (т. Е. Если дерево читается слева направо c * d + a * b, который все еще может быть действительным, но не будет деревом, которое мы рассматриваем).

...