В настоящее время я читаю Javascript: The Good Parts, и мне трудно понять их грамматические диаграммы.
Первый - это пробел
Я не совсем уверен, как это прочитать, возможно, какой-то код поможет мне понять?
Спасибо за помощь в продвинутых парнях.
В настоящее время я читаю Javascript: The Good Parts, и мне трудно понять их грамматические диаграммы.
Первый - это пробел
Я не совсем уверен, как это прочитать, возможно, какой-то код поможет мне понять?
Спасибо за помощь в продвинутых парнях.
Начните с самого левого ||
и продолжайте вправо. Первый балл вниз (сразу же рядом с вашей начальной точкой) не может быть соблюден, потому что кривая не начинается слева (направление, в котором вы путешествуете.) Если вы посмотрите, откуда оно взялось, то должно быть легко сказать, что это представляет собой Цикл while
:
while (!EOF) {} // While there still text to parse
Вторая строка может быть выполнена за счет того, что кривая берется из левой (после текущей директории). Эта строка представляет это выражение if-else:
if (char == '/') {} // Forward slash
else if (char == '\n') {} // Line end
else if (char == '\t') {} // Tab
else if (char == ' ') {} // Space
Пробел, табуляция и конечная линия обе завершают функцию и либо return
, либо continue
. Однако, если символом является "Слишком длинный", ему необходимо проверить, является ли он одной строкой (//
) или многострочной (/* */
):
*char++; // Move to next character
if (char == '*') {} // Multi line
else if (char == '/') {} // Single line
Если это одна строка, она читается до конца строки и продолжается. Если он многострочный, он читается аналогичным образом, пока не найдет "*", за которым следует "/", а затем продолжит.
Левая боковая двойная полоса ( "||" ) может рассматриваться как "вход" функции, а правая двойная полоска - как "выход". Таким образом, в этом случае символом или строкой является ввод, а пути между двойными барами - это тесты. Если символ/строка считается "пробелом" любого из тестов, вывод функции будет "true", иначе он будет "false".
В частности, скажем, вы следуете четвертому пути. На этом пути вы сначала столкнетесь с символом "/", а затем следуете другому "/", за которым следует любой другой символ до символа EOL. В этом случае, если строка кода "//пример", то вывод будет правдой.
Подумайте об этом, как если бы вы являлись парсером или языком, и вам нужен набор правил для понимания входного потока символов.
Подумав, как работает парсер, вы можете точно понять, что составляет токены языка JavaScript.
Грамматическая схема, на которую вы ссылаетесь, широко использовалась для документирования синтаксиса Pascal. В основном это блок-схема того, как анализируется исходный код. Каждый "кусок" диаграммы, в вашем примере, "пробел", подобен вызову функции. Технически мы говорим о паркуре рекурсивного спуска.
Итак, мой образ мышления:
Парсер получает символ из входного потока. Таким образом, мы идем "попробуйте" функцию пробела, если этот символ - это пробел, табуляция, конец строки или символ "/" , мы переходим к следующему шагу, если не выходим с возвратным значением "не найдено".
Если это был "/" , мы получим следующий символ. Если это другое "/" , мы читаем символы, пока не получим конец строки, а затем выйдем с возвращаемым значением "found".
Если следующий символ - это '', тогда мы будем читать все, что не является '/' или ''. и т.д.
В основном поток идет слева направо, но когда линия возвращается назад, мы повторяем. Оптимальная вещь об этих диаграммах заключается в том, что, как только вы ее повесите, легко быстро написать синтаксически правильный код. И вы можете легко закодировать рекурсивный парсер спуска, следуя "блок-схеме".
(см. этот ответ)
Чтобы узнать, как читать железнодорожную диаграмму, вам нужно понять разницу графика в этих трех ситуациях:
ноль или больше, ноль или один, один или несколько.
Чтобы понять их различия (как показано на следующем рисунке), точка: "Вы начинаете с левого края и следуете по дорожкам на правый край". Итак, представьте, что вы поезд, вы просто повернуть направо, не можете повернуть налево.
приведенное выше изображение, созданное http://bottlecaps.de/rr/ На вкладке "Редактировать грамматику" введите следующую грамматику:
zeroormore ::= element*
zeroorone ::= element?
oneormore ::= element+