PhpDocumentor, установленный через ГРУШУ на OSX, не работающем - недостающие файлы?

Я считаю полезным начать с самых коротких строк в языке, а затем попытаться обобщить их. Какая самая короткая строка в этом языке? Мы можем выбрать n = 0 и m = 0, поскольку 0 < = 0 < = 0 < = 3x0, поэтому пустая строка находится на нашем языке. Поскольку пустая строка в языке, у нас должна быть продукция в нашей грамматике, подобная S := e.

Теперь, как нам получить более длинные строки в языке? Мы могли бы добавить несколько производств только для добавления a к нашим строкам или просто для добавления b; однако такие правила не могут быть использованы для расширения нашего базового случая (S := e), поскольку добавление только или только b к пустой строке не приведет к получению строки в языке. Эти произведения могут привести нас к цепочке на языке, но они не будут удерживать нас на таком пути очевидным или простым способом. Нам нужна простая постановка в нашей грамматике, чтобы мы могли быть уверены, что она правильная.

Альтернативой добавлению a и b по отдельности является добавление их вместе. Обратите внимание, что когда у вас есть языки, в которых части строк зависят друг от друга, вы, как правило (всегда, за исключением явных, но не фактических зависимостей), обнаруживает, что произведения должны связывать эти зависимые части; в противном случае зависимость может быть «забыта» во время получения строки. Мы предполагаем, что наши произведения должны только когда-либо складывать a и b вместе и продолжать эту гипотезу.

Во-первых, мы можем догадаться, что произведение S := aSb должно быть включено в нашу грамматику. Почему мы можем догадаться об этом? Ну, исходя из нашей гипотезы, мы знаем, что нам нужно сложить a и b вместе, что мы и делаем здесь. Кроме того, поскольку мы хотим, чтобы правило генерировало строки общей длины, мы понимаем, что в производстве должен использоваться нетерминал, из которых у нас в настоящее время есть только один (напомним, что мы стремимся строить строки в нашем базовом случае, который производится из S, поэтому использование этого нетерминала естественно). Наконец, мы знаем, что все a должны быть слева от всех b, и это единственный порядок трех символов, который создает строки в соответствии с этим шаблоном.

Какие строки это производство позволяет нам генерировать? Мы можем получить S := e, S := aSb := ab, S := aSb := aaSbb := aabb,…, S := … := (a^n)(b^n). Мы видим, что эти строки на языке - так как 0 < = n < = 3n - но есть строки, которые эта продукция сама по себе пропускает. В таких случаях производство в порядке и должно быть сохранено; однако, то, что мы пропустили некоторые строки, указывает, что нам нужно найти другие производства, чтобы покрыть те случаи.

Какие случаи мы пропустили? Мы пропустили случай, когда m строго больше n. В произведении, которое мы догадались, мы использовали одно и то же число a и b, поэтому мы получаем строки с одинаковым номером. Само собой разумеется, что если нам нужны строки с более чем a, чем b, то нам нужно иметь продукцию, которая вводит больше, чем b. По нашей гипотезе мы все еще требуем, чтобы мы ввели хотя бы один из обоих; и мы уже представили по одному с каждым. Следующее логическое произведение, которое нужно угадать, - S := aaSb. Какие строки мы можем генерировать сейчас? Если мы проигнорируем производство S := aSb, это новое производство позволяет нам генерировать строки вида (a^2n)(b^n) строк на нашем языке; но что происходит, когда мы рассматриваем все три произведения?

Рассмотрим строку (a^k)(b^n), где n < = k < = 2n. Если k = n, то мы можем использовать производство S := aSb n раз, чтобы получить строку; аналогично, если k = 2n, мы можем использовать производство S := aaSb n раз. Что если n < k < 2n? Предположим, что k = n + j, где 0 < j < п. В этом случае мы можем использовать произведение S := aaSb ровно j раз, а произведение S := aSb ровно n - j раз, чтобы получить 2j + n - j = n + j = k экземпляров a и n экземпляров b. Следовательно, эти три правила вместе позволяют нам генерировать все строки, где число a находится между числом b и двойным числом b, включительно на обоих концах.

Мы все еще не можем генерировать строки, в которых число a более чем вдвое превышает число b; однако, основываясь на наших вышеупомянутых успехах, мы можем угадать S := aaaSb и использовать аналогичные рассуждения, чтобы показать, что эти четыре произведения вместе дают нам именно тот язык, который мы намеревались генерировать. Грамматика, к которой мы пришли, выглядит следующим образом:

S := e
S := aSb
S := aaSb
S := aaaSb

Есть много других грамматик для этого языка, все правильные, и многие пришли к использованию совершенно других методов, чем этот. Не думайте о таких проблемах как о применении формулы для получения заранее определенного ответа. Думайте о таких проблемах как о проблемах программирования. Вам дают спецификацию, и пока ваши вещи работают, это то, что имеет значение.

8
задан 15 May 2009 в 22:00
поделиться

2 ответа

To figure out where PEAR is putting things, run pear config-show. If PEAR had said earlier that it had successfully installed PhpDocumentor for you, then the file you're looking for should be found in the php_dir setting's value (on my Mac, this is /usr/lib/php/PEAR).

It is necessary for this php_dir value to be set in your include_path for most PEAR packages to function properly. Since /usr/share/pear DOES appear to be in your include_path, as per the error you included above, I'd have to guess that your PEAR installation has its php_dir set to some other location.

Now, if you want to change your PEAR installation to point to /usr/share/pear, you need to understand something about how PEAR installs things. Many packages use install-time text replacement, which puts YOUR installation's settings into the package's code itself. If you look back at your pear config-show output, you'll see several other *_dir settings (data_dir, bin_dir, www_dir, etc.). So, it's important that these be set like you want them BEFORE you install your packages. Don't worry though, it's not too late for the packages you have installed already.

To change the PEAR settings, use pear config-set (setting name) (setting value), like pear config-set php_dir /usr/share/pear. Since only php_dir is absolutely necessary to be in your include_path, you can probably leave the other settings as they are. I usually make sure they all point into the same root directory, just to keep everything in one overall place.

Once you change ANY of these settings, you should run a pear update of each and every package you already have installed. What this will do is perform that install-time text replacement I mentioned earlier, but this time will use the settings that are current, i.e. the ones you've just finished setting. Run this on the PEAR main package first, pear update --force pear... you'll have to include the --force flag because PEAR will realize you're asking me to update the package when it's already 'current' and stop itself. Once you've run this update for ALL of your installed packages, your PEAR installation will have its files placed where your current include_path is expecting to find them.

4
ответ дан 5 December 2019 в 20:18
поделиться

Существует ли PhpDocumentor / phpDocumentor / phpdoc.inc? Он существует в / usr / share / pear? Если ответы - «да» и «нет» соответственно, то вам нужно добавить любой каталог, в котором находится PhpDocumentor, в ваш путь включения.

Короче говоря, найдите phpdoc.inc, а затем работайте оттуда.

0
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: