Подтвердить что ты не робот

Что такое синтаксический анализ в терминах, понятный новому программисту?

Я студент колледжа, получивший степень в области компьютерных наук. Многие мои сокурсники действительно не много программировали. Они выполнили свои классовые задания, но, честно говоря, эти вопросы не научат вас программированию.

У меня было несколько других учеников, которые задавали мне вопросы о том, как разбирать вещи, и я никогда не знаю, как объяснить это им. Лучше всего начинать просто по очереди за поиском подстрок или просто дать им более сложную лекцию об использовании правильного лексического анализа и т.д. Для создания жетонов, использования BNF и всех других вещей? Они никогда не понимают этого, когда я пытаюсь объяснить это.

Какой лучший подход объяснить это, не запутывая их или не отпугивая их от фактических попыток.

4b9b3361

Ответ 1

Я бы объяснил разбор как процесс превращения данных какого-то типа в другой тип данных.

На практике для меня это почти всегда превращает строку или двоичные данные в структуру данных внутри моей программы.

Например, поворот

":[email protected] PRIVMSG #channel :Hello!"

в (C)

struct irc_line {
    char *nick;
    char *user;
    char *host;
    char *command;
    char **arguments;
    char *message;
} sample = { "Nick", "User", "Host", "PRIVMSG", { "#channel" }, "Hello!" }

Ответ 2

Синтаксический анализ - это процесс анализа текста, составленного из последовательности токенов, для определения его грамматической структуры относительно заданной (более или менее) формальной грамматики.

Парсер затем строит структуру данных на основе токенов. Эта структура данных может затем использоваться компилятором, интерпретатором или переводчиком для создания исполняемой программы или библиотеки.

alt text
(источник: wikimedia.org)

Если бы я дал вам английское предложение и попросил разбить предложение на части речи (существительные, глаголы и т.д.), Вы бы проанализировали предложение.

Это самое простое объяснение синтаксического анализа, которое я могу придумать.

Тем не менее, синтаксический анализ является нетривиальной вычислительной проблемой. Вы должны начать с простых примеров и перейти к более сложным.

Ответ 3

Что такое синтаксический анализ?

В информатике разбор - это процесс анализа текста, чтобы определить, принадлежит ли он определенному языку или нет (т.е. синтаксически применимо для этой грамматики языка). Это неофициальное имя для процесса синтаксический анализ.

Например, предположим, что язык a^n b^n (что означает то же количество символов A, за которым следует такое же количество символов B). Парсер для этого языка принимает вход AABB и отклоняет вход AAAB. Это то, что делает парсер.

Кроме того, во время этого процесса структура данных может быть создана для дальнейшей обработки. В моем предыдущем примере он мог, например, хранить AA и BB в двух отдельных стеках.

Все, что происходит после него, например, придание значения AA или BB, или преобразование его во что-то другое, не анализируется. Дать смысл частям входной последовательности токенов называется семантический анализ.

Что такое синтаксический анализ?

  • Разбор не превращает одну вещь в другую. Преобразование A в B, по сути, означает compiler делает. Компиляция выполняется несколькими шагами, разбор является только одним из них.
  • Разбор - это не извлечение смысла из текста. Извлечение смысла из текста, семантический анализ, который является шаг процесса компиляции.

Каков самый простой способ его понять?

Я думаю, что лучший способ понять концепцию синтаксического анализа - начать с более простых понятий. Самый простой вопрос в языке - конечный автомат. Это формализм для анализа регулярных языков, таких как регулярные выражения.

Это очень просто, у вас есть вход, набор состояний и набор переходов. Рассмотрим следующий язык, построенный над алфавитом { A, B }, L = { w | w starts with 'AA' or 'BB' as substring }. Автомат ниже представляет собой возможный синтаксический анализатор для этого языка, все действующие слова которого начинаются с "AA" или "BB".

    A-->(q1)--A-->(qf)
   /  
 (q0)    
   \          
    B-->(q2)--B-->(qf)

Это очень простой парсер для этого языка. Вы начинаете с (q0), в начальном состоянии, тогда вы читаете символ с входа, если он A, тогда вы переходите в состояние (q1), в противном случае (это B, помните, что алфавит только A и B) вы переходите в состояние (q2) и так далее. Если вы достигли состояния (qf), тогда вход был принят.

Как это визуально, вам нужен только карандаш и листок бумаги, чтобы объяснить, что такое синтаксический анализатор, включая ребенка. Я думаю, что простота - это то, что делает автоматы наиболее подходящим способом обучения концепциям обработки текстов, таких как синтаксический анализ.

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

Ответ 4

Попросите их попытаться написать программу, которая может оценивать произвольные простые арифметические выражения. Это простая проблема для понимания, но по мере того, как вы начинаете углубляться в нее, становится понятным множество основных синтаксических разборов.

Ответ 5

Разбор заключается в чтении данных в одном формате, чтобы вы могли использовать его для своих нужд.

Я думаю, вам нужно научить их думать так. Итак, это самый простой способ, который я могу придумать, чтобы объяснить парсинг для кого-то нового для этой концепции.

Как правило, мы пытаемся проанализировать данные по одной строке за раз, потому что людям проще думать таким образом, делить и побеждать, а также легче кодировать.

Мы называем поле для каждого минимального неразрывного. Имя - поле, возраст - другое поле, а Фамилия - другое поле. Например.

В строке мы можем иметь различные поля. Чтобы отличить их, мы можем разграничить поля разделителями или максимальную длину, назначаемую каждому полю.

Например: Разделив поля запятой

Павел, 20, Джонс

Или пробелом (имя может иметь 20 букв макс, возраст до 3 цифр, Jones до 20 букв)

Paul                 020Jones                

Любой из ранее заданных полей называется записью.

Для разделения между разделительной полевой записью нам нужно разграничить запись. Точка будет достаточно (хотя вы знаете, что можете применять CR/LF).

Список может быть:

Майкл, 39, Jordan.Shaquille, 40, O'neal.Lebron, 24, Джеймс.

или с CR/LF

Майкл, 39, Иордания
Шакил, 40, О'Нил
Леброн, 24, Джеймс

Вы можете сказать, что они перечисляют 10 игроков nba (или nlf), которые им нравятся. Затем они должны ввести их в соответствии с форматом. Затем создайте программу для ее анализа и отображения каждой записи. Одна группа может создавать список в формате, разделенном запятыми, и программу для анализа списка в формате фиксированного размера и наоборот.

Ответ 6

Анализ меня разбивает что-то на значимые части... используя определяемый или предопределенный известный общий набор "определений" части.

Для языков программирования были бы ключевые части, используемые последовательности пунктуации...

Для тыквенного пирога это может быть что-то вроде коры, наполнения и начинки.

Для письменных языков может быть слово, предложение, глагол...

Для разговорных языков это может быть тон, громкость, настроение, импликация, эмоция, контекст

Анализ синтаксиса (а также здравый смысл в конце концов) подскажет, является ли ваш синтаксический анализ тыквенным или языком программирования. Имеет ли он кору? ну может быть, это тыквенный пудинг или, возможно, разговорный язык!

Одно замечание о разборе вещей - обычно есть много способов разбить вещи на части.

Например, вы можете разбить тыквенный пирог, разрезая его от центра к краю или снизу вверх или со совок, чтобы получить заполнение или с помощью кувалды или съесть его.

И как вы разбираете вещи, определите, будет ли что-то делать с этими частями легко или сложно.

В мире "компьютерных языков" существуют общие способы анализа текста исходного кода. Эти общие методы (алгоритмы) имеют названия или имена. Поиск в Интернете для общих методов/имен для способов анализа языков. Википедия может помочь в этом отношении.

Ответ 7

В лингвистике разделить язык на небольшие компоненты, которые можно проанализировать. Например, разбор этого предложения предполагает разделение его на слова и фразы и определение типа каждого компонента (например, глагола, прилагательного или существительного).

Анализ является очень важной частью многих дисциплин в области компьютерных наук. Например, компиляторы должны анализировать исходный код, чтобы иметь возможность перевести его в объектный код. Аналогично, любое приложение, которое обрабатывает сложные команды, должно иметь возможность анализировать команды. Это включает практически все приложения конечного пользователя.

Разбор часто делится на лексический анализ и семантический анализ. Лексический анализ концентрируется на разделении строк на компоненты, называемые токенами, на основе пунктуации и других ключей. Затем семантический синтаксический анализ пытается определить значение строки.

http://www.webopedia.com/TERM/P/parse.html

Ответ 8

Простое объяснение: анализ разбивает блок данных на более мелкие куски (токены), следуя набору правил (например, с использованием разделителей) так что эти данные могут обрабатываться по частям (управляются, анализируются, интерпретируются, передаются, ets).

Примеры. Многие приложения (например, программы электронных таблиц) используют формат файлов CSV (Comma Separated Values) для импорта и экспорта данных. Формат CSV позволяет приложениям обрабатывать эти данные с помощью специального парсера. У веб-браузеров есть специальные парсеры для файлов HTML и CSS. Существуют JSON-синтаксические анализаторы. Все специальные форматы файлов должны иметь некоторые парсеры, разработанные специально для них.