- СИНТЕТИЧЕСКОЕ ЧТЕНИЕ
- Смотреть что такое «СИНТЕТИЧЕСКОЕ ЧТЕНИЕ» в других словарях:
- Способ написания синтаксических анализаторов на c++
- forward stream
- atend()
- strin
- Базовые функции парсинга
- Синтаксический разбор предложения
- Синтаксический разбор простого предложения
- Характеристика простого предложения
- Примеры синтаксического разбора простого предложения
- Синтаксический разбор сложного предложения
- Примеры синтаксического разбора сложного предложения
СИНТЕТИЧЕСКОЕ ЧТЕНИЕ
Новый словарь методических терминов и понятий (теория и практика обучения языкам). — М.: Издательство ИКАР . Э. Г. Азимов, А. Н. Щукин . 2009 .
Смотреть что такое «СИНТЕТИЧЕСКОЕ ЧТЕНИЕ» в других словарях:
ЧТЕНИЕ СИНТЕТИЧЕСКОЕ — ЧТЕНИЕ СИНТЕТИЧЕСКОЕ. См. синтетическое чтение … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
ЧТЕНИЕ — ЧТЕНИЕ. Один из рецептивных видов речевой деятельности, направленный на восприятие и понимание письменного текста; входит в сферу коммуникативной деятельности людей и обеспечивает в ней одну из форм (письменную) общения. Важнейшая среди целей… … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
УЧЕБНОЕ ЧТЕНИЕ — (англ. guided reading). Вид учебной работы с текстом, чтение, задачей которого является выработка навыков и умений в чтении, а также в других видах речевой деятельности. Ср. реальное чтение. У. ч. формируются на базе следующих речевых действий и… … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
КУРСОРНОЕ ЧТЕНИЕ — КУРСОРНОЕ (от лат. cursorius – быстро бегущий) ЧТЕНИЕ. То же, что синтетическое чтение … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
Обучение чтению — аналитическое чтение, беспереводное чтение, выборочное чтение, выразительное чтение, глобальное понимание, градуированное чтение, громкое чтение, детальное чтение, дешифровка, динамическое понимание, дискурсивное чтение, домашнее чтение, зрелое… … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
Пушкин, Александр Сергеевич — — родился 26 мая 1799 г. в Москве, на Немецкой улице в доме Скворцова; умер 29 января 1837 г. в Петербурге. Со стороны отца Пушкин принадлежал к старинному дворянскому роду, происходившему, по сказанию родословных, от выходца «из… … Большая биографическая энциклопедия
Кант Иммануил — Жизненный путь и сочинения Канта Иммануил Кант родился в Кенигсберге (ныне Калининград) в Восточной Пруссии в 1724 г. Отец был шорником, а мать домохозяйкой, шестеро их детей не дожили до зрелого возраста. Кант всегда вспоминал родителей с… … Западная философия от истоков до наших дней
Державин, Гавриил Романович — — знаменитый поэт, государственный человек и общественный деятель второй половины прошлого и первой четверти нынешнего столетия (р. 3 июля 1743, ум. 8 июля 1816). Предок его, татарский мурза Багрим, в ХV столетии, в княжение Василия… … Большая биографическая энциклопедия
Содержание обучения — активная грамматика, активная лексика, активный грамматический минимум, активный словарный запас, активный словарь, артикуляция, аспект обучения, аспекты языка, аудирование, аутентичный материал, база данных, виды речевой деятельности… … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
Русская литература — I.ВВЕДЕНИЕ II.РУССКАЯ УСТНАЯ ПОЭЗИЯ А.Периодизация истории устной поэзии Б.Развитие старинной устной поэзии 1.Древнейшие истоки устной поэзии. Устнопоэтическое творчество древней Руси с X до середины XVIв. 2.Устная поэзия с середины XVI до конца… … Литературная энциклопедия
Источник
Способ написания синтаксических анализаторов на c++
В этой статье рассказывается, как писать синтаксические анализаторы с помощью этой небольшой библиотеки на с++.
Обычно, текст на машинном языке состоит из предложений, те — из подпредложений, а те, в свою очередь, из подподпредложений, и так вплоть до символов.
Например, элемент xml состоит из открывающего тега, содержимого и закрывающего тега. —> Открывающий тег состоит из ‘ ‘. —> Закрывающий тег состоит из ‘ ‘. —> Атрибут состоит из имени, знаков ‘=’, ‘»‘, строки символов и снова ‘»‘. —> Содержимое в свою очередь тоже может содержать элементы. —> И т.д. Таким образом, после разбора получается синтаксическое дерево.
Такие языки удобно описывать формой Бэкуса-Наура (БНФ), где каждый нетерминал соответствует некоторому предложению языка. Когда мы пишем программы, мы обычно разбиваем их на функции и подфункции, и раз мы собрались писать синтаксический анализатор, пусть каждому нетерминалу БНФ соответствует одна функция нашего анализатора, и пусть каждая такая функция:
- пытается разобрать это предложение с заданной позиции
- возвращает, удалось ли ей это сделать
- возвращает позицию, где закончился разбор или произошла ошибка
- а также, возможно, возвращает некоторые дополнительные данные, которые мы хотим получить в результате разбора
Например для БНФ вида expr ::= expr1 expr2 expr3 будем писать такую функцию:
А для предложения БНФ вида expr ::= expr1 | expr2 | expr3 — функцию:
(Кажется это называется синтаксический анализ с возвратами)
Не всякий текст, удовлетворяющий БНФ нам может подходить. Например элемент языка xml может описываться так: element ::= ‘ ‘some_data’ ‘ , но это предложение будет действительно элементом, только если идентификаторы совпадают. Такие (или аналогичные) проверки можно легко добавлять в функции разбора.
Терминальные функции могут выглядеть например так:
Пока что мы делали синтаксический анализ строки. Но заметим, что для всех типов вышеперечисленных функций достаточно forward итераторов.
forward stream
Зададимся целью создать класс-поток, предоставляющий forward итераторы, и хранящий в памяти файл не целиком а небольшими кусочками. Тогда, если сделать функции разбора шаблонными, то их можно будет использовать и со строкамии, и с потоками. (Что и сделано в «base_parse.h» для терминальных (и около того )функций.) Но сначала внесем некоторые разъяснения в идеологию unix «все есть файл»: Бывают файлы располагающиеся на диске — их можно читать несколько раз и с любой позиции (назовем их random-access файлами ). А бывают потоки, перенаправленные из других программ, идущие по сети или от пользователя с клавиатуры (назовем их forward потоками). Такие потоки можно читать только за один проход. (fixme) По этому, что бы можно было работать и с тем и с другим, зададимся целью создать класс-поток, читающий файл за один проход, предоставляющий forward итераторы, и хранящий в памяти файл не целиком а небольшими кусочками.
Для input итераторов такие потоки реализованы очень давно, по сути в себе содержат только один input итератор, и внутри себя содержат один буфер, по которому движется этот итератор, и когда он подходит к концу буфера, в этот буфер загружается следующий кусок файла, а итератор начинает двигаться с начала обновленного буфера.
Forward итераторы отличаются от input итераторов тем, что их можно копировать. Для потока с forward итераторами решением будет список буферов. Как только какой-нибудь итератор выходит за пределы самого правого буфера, в список добавляется новый буфер, и заполняется непосредственно из файла блоком данных. Но постепенно так в память загрузится весь файл, а мы этого не хотим. Сделаем так, чтоб удалялись все буфера, находящиеся левее буфера на котором находится самый левый (отстающий) итератор. Но мы не будем каждому буферу сопоставлять список итераторов, находящихся на нем, а будем сопоставлять всего лишь их количество (подсчет итераторов). Как только какой-нибудь буфер узнает, что на нем осталось 0 итераторов и что он самый левый, тогда удаляется он и все соседние буфера правее него, на которых тоже 0 итераторов.
Получается, каждый итератор должен содержать:
- указатель на символ (который будет возвращаться при разыменовании)
- указатель на конец массива символов в буфере (с ним происходит сравнение при перемещении итератора)
- итератор по списку буферов (для доступа к данным буфера, а через них к данным всего потока).
Когда итератор доходит до границы буфера, он смотрит, есть ли в списке буферов следующий, если его нет — загружает его, на предыдущем буфере уменьшает счетчик итераторов, а на следующем увеличивает. Если на предыдущем буфере осталось 0 итераторов — он удаляется. Если итератор дошел до конца файла — он только отвязывается от предыдущего буфера и переходит в состояние «конец файла». При копировании итератора — увеличивается счетчик итераторов на буфере на котором он находится, а при вызове деструктора итератора — счетчик уменьшается, и, опять же, если на буфере осталось 0 итераторов, то он и соседние справа буфера, на которых тоже 0 итераторов, — удаляются. Детали реализации смотри в «forward_stream.h».
У таких итераторов есть некоторые особенности использования, отличающие их от обычных итераторов. Так например, перед разрушением(деструктором) потока (хранящего список буферов и некоторую дополнительную информацию) должны быть разрушены все итераторы, т.к. при разрушении они будут обращаться к буферам в не зависимости от того, разрушены ли те в свою очередь или нет. Если мы один раз в результате вызова метода begin() получили первый итератор (и создали первый же буфер), и он ушел на столько, что первый буфер уже удален, мы не сможем снова получить итератор методом begin(). Также (как будет видно из следующего параграфа) у потока нет метода end(). В результате чего мной было принято решение сделать внутренний итератор в потоке, который инициализируется при инициализации всего потока, и ссылку на который можно получить методом iter(). Также при использовании в алгоритмах не стоит лишний раз копировать итераторы, т.к. в памяти хранятся буфера от самого левого до самого правого итератора, и в случае больших файлов это может привести к большому расходу памяти.
В качестве бонуса, есть различные типы буферов: простые (basic_simple_buffer), с вычислением строки-столбца по итератору (basic_adressed_buffer), планируется сделать буфер, осуществляющий перекодировку между различными кодировками. В связи с чем поток параметризуется типом буфера.
atend()
Конец сишной строки определяется нулевым символом. Это означает, что пока мы движемся по строке, чтобы обнаружить ее конец, нам надо не сравнивать указатель с другим указателем (как это традиционно делается в STL), а надо проверять значение, указываемое нашим указателем. С файлами примерно такая же ситуация: при посимвольном вводе char-ов мы получаем int-ы, и т.к. у них диапозон значений больше, мы опять же тестируем каждый символ на равенство EOF. Масла в огонь добавляет тот факт, что для forward потоков, поступающих в реальном времени, положение конца файла заранее неизвестно.
Эту информацию можно обобщить, сделав функцию atend(it), которая для указателей по строке будет выглядеть так:
А для итераторов по потоку она будет возвращать true, когда итератор указывает на конец файла.
strin
Для интерактивного взаимодействия с пользователем (через stdin) блочная буферизация не подходит, т.к. в блоке чаще всего помещается несколько строк, и после ввода одной строки программа продолжает ожидать ввода от пользователя, т.к. блок все еще не заполнен. Для этого необходима строковая буферизация, когда буфер заполняется символами вплоть до символа перевода строки. В этой библиотеке можно выбрать тип буферизации при помощи выбора типа файла, от которого инициализируется поток (basic_block_file_on_FILE или string_file_on_FILE).
strin — внутренний итератор потока над stdin’ом со строковой буферизацией.
Для неинтерактивных файлов при создании потока создается итератор, указывающий на первый символ, а значит загружается первый буфер. Для strin’а это не допустимо, т.к. программист может захотеть что-то выполнить или вывести на экран до того как программма перейдет в режим ожидания ввода строки.
По этому строковые файлы при заполнении первого буфера выдают фиктивную строку «\n». Для ее прочтения существует функция start_read_line(it), после выполнения которой программа переходит в режим ожидания ввода строки после чего можно произвести синтаксический анализ этой строки, не выводя при этом итераторы за пределы следующего символа ‘\n’.
Поле анализа прграммист может захотеть опять что-то вывести на экран, и если после этого ему опять понадобятся данные от пользователя, то перед их получением снова следует вызвать start_read_line(strin).
Т.о. получается цикл:
Конечно это костыль, и можно было бы сделать итераторы, которые требуют загрузки буфера только при разыменовании, но это привело бы к дополнительным проверкам при разименовании и просто усложнению всей системы…
Базовые функции парсинга
Что бы пользователю не приходилось каждый раз заново писать терминальные функции, они в «base_parse.h» уже реализованы. Сейчас они реализованы (кроме обработки плавающих чисел) в общем виде, в дальнейшам планируется специализировать их с использованием строковых функций (таких как strcmp, strstr, strchr, strspn, strcspn) для указателей по строкам и для итераторов по потокам. Также они позволяют пользователю почти не думать о конце файла, и просто задают стиль кода.
Ниже представлена краткая сводка базовых функций парсинга, возвращаемые значиния и статистика их использования при реализации двух тестовых парсеров.
Т.к. через имя функции удобно возвращать код ошибки или сообщение об ошибке, что бы текст парсеров выглядел более очевидно, я сделал специальные макросы:
Хотя вполне возможно сделать какой-нибудь класс, хранящий эту информацию и преобразуемый к bool соответствующим образом.
Вообще я противник неконстантных ссылок, и считаю, что аргументы, которые функция должна изменить, должны передаваться в нее по указателю а не по ссылке, что бы при вызове это было видно, но всвязи с тем, что операторы для указателей на что бы то ни было перегружать нельзя, специально для совместимости с operator>>() (парочка таких определена в «strin.h») я итераторы везде передаю по ссылке (а возвращаемые значения по указателю).
На данный момент имеется два примера использования этих функций: calc.cpp и winreg.cpp.
Таким образом для написания парсера не требуется умения обращаться с другими программами генерации парсеров. Каждый нетерминал БНФ взаимнооднозначно переводится в функцию, которая, конечно, громоздковата по сравнению с описанием в БНФ (это можно в дальнейшем исправить, сделав функцию, делающую разбор по регулярному выражению, аналогично как в ), но зато в нее можно добавить любую проверку и обработку данных. Все это можно делать как со строками, так и с потоками в одинаковой форме. Поток ввода по умолчанию готов к вводу по умолчанию, а операторы >>, аналогичные таким же из стандартной библиотеки, дают возможность использовать эту библиотеку вместо стандартной библиотеки ввода.
Как с помощью forward_stream делать токенезацию, я попробую рассказать и показать в следующей статье.
Источник
Синтаксический разбор предложения
Синтаксический разбор предложения — это полная характеристика предложения с указанием цели высказывания, интонации, количества и типа грамматических основ, разбор по членам предложения и пр., составление схемы.
Синтаксический разбор простого предложения
Одним из важных признаков предложения является грамматическая основа, в которой сосредоточен смысл высказывания. Предложение является простым, если в нём содержится одна грамматическая основа. Она представляет собой сочетание подлежащего и сказуемого или содержит один главный член (подлежащее или сказуемое).
Синтаксический разбор простого предложения выполняем пошагово в соответствии со следующим алгоритмом:
- Определить вид предложения по цели высказывания
- Характеристика предложения по эмоциональной окраске
- Выяснить грамматическую основу
- Указать вид простого предложения по наличию главных членов (двусоставное или односоставное)
- Определить тип односоставного предложения
- Характеризовать предложение как распространённое или нераспространённое
- Определить, полное предложение или неполное
- Указать, осложнённое предложение или неосложнённое
- Разобрать по членам предложения, подчеркивая их соответствующей линией
- Составить схему предложения
Рассмотрим подробнее и объясним все пункты синтаксического разбора простого предложения.
Характеристика простого предложения
1. По цели высказывания различают предложения:
Повествовательное предложение сообщает о ком-то или о чём-то и произносится со спокойной интонацией.
На улице дует сильный ветер. Он быстро разогнал облака на небе. Вскоре засветило яркое солнце.
Вопросительное предложение выражает вопрос, на который нужно получить ответ. С помощью вопросительного предложения говорящий хочет узнать о чём-то, получить достоверную информацию. Вопросительное предложение произносится с особой интонацией, подчеркивающей главное слово в нём.
Побудительное предложение содержит совет, приказ, запрет, просьбу, призыв к действию.
2. По эмоциональной окраске, по силе выраженного чувства предложения делят на
Невосклицательные предложения произносятся без проявления чувств со спокойной интонацией.
Дети с интересом слушают бабушкину сказку.
Восклицательные предложения выражают определённое чувство. Они произносятся с особой интонацией. В конце их ставится восклицательный знак.
3. Следующий шаг разбора — определение грамматической основы. Если в предложении выявлена одна грамматическая основа, это простое предложение. В сложном предложении содержатся две и более грамматических основ.
4. Если в предложении налицо оба главных члена предложения, подлежащее и сказуемое, такое предложение является двусоставным.
Осеннее небо заплакало мелким дождем.
Если в предложении выявлен один главный член (подлежащее или только сказуемое), такое предложение называется односоставным.
5. Определяем тип односоставного предложения по тому, чем выражен его главный член. Если это подлежащее в форме именительного падежа, то это назывное предложение.
Односоставные глагольные предложения различают по грамматической форме сказуемого:
6. Выясним, есть ли в предложении второстепенные члены, по наличию которых или отсутствию предложение характеризуется как распространённое или нераспространённое .
7. Если в структуре предложения можно указать все члены, необходимые для понимания его смысла, такое предложение является полным. В неполных предложениях отсутствует один или несколько членов, которые подсказывает предыдущий контекст.
Ты где сейчас находишься? — Дома (Я сейчас нахожусь дома).
8. Осложнённым является простое предложение, если в нем имеются
- однородные члены;
- обращения
- вводные слова
- вставные конструкции
- обособленные члены предложения.
Если этих элементов нет в простом предложении, то охарактеризуем его как неосложнённое.
9. Далее приступим к разбору по членам предложения, выявив подлежащее и сказуемое и второстепенные члены предложения. Подчеркнем каждый из членов предложения соответствующей линией:
- подлежащее — одной прямой линией ( );
- сказуемое — двумя прямыми линиями ( );
- определение — волнистой линией ( );
- дополнение — штриховой линией ( );
- обстоятельство — линией, в которой чередуются штрих и точка ( ).
Для наглядности приведем примеры синтаксического разбора простого предложения.
Примеры синтаксического разбора простого предложения
После дождя над лесом повисла разноцветная радуга.
Повествовательное, невосклицательное, простое, двусоставное, распространённое, полное, неосложненное предложение.
После дождя над лесом повисла разноцветная радуга .
Чтобы найти подлежащее, к слову с предметным значением зададим вопрос что?
Радуга — это подлежащее, выражено существительным в именительном падеже ед. ч. женского рода.
Радуга (что сделала?) повисла. Это простое глагольное сказуемое, которое выражено глаголом изъявительного наклонения прошедшего времени ед. ч. ж. р.
Радуга (какая?) разноцветная. Определение выражено прилагательным в форме ед. ч. ж. р. именительного падежа.
Повисла (где?) над лесом. Обстоятельством места выступает существительное в форме творительного падежа ед. ч. мужского рода.
Повисла (когда?) после дождя. В роли обстоятельства времени используется существительное в форме родительного падежа ед. ч. мужского рода.
Каждый член предложения обозначим, какой частью речи он выражен.
Побудительное, восклицательное, простое, односоставное, определённо-личное, распространённое, полное предложение, осложненное обращением.
Синтаксический разбор сложного предложения
Синтаксический разбор сложного предложения начинается с общей характеристики, как и простого предложения. Выполним разбор в соответствии с планом:
- Вид предложения по цели высказывания.
- Вид предложения по эмоциональной окраске.
- Указать количество простых предложений, выделив их грамматические основы.
- Определить связь в предложении (союзная или бессоюзная).
- Если связь союзная, уточним, сочинительная или подчинительная.
- Укажем тип сложного предложения (сложносочиненное, сложноподчиненное или бессоюзное)
- Разобрать каждое простое предложение.
- Составить схему предложения.
Выполним синтаксический разбор сложных предложений.
Примеры синтаксического разбора сложного предложения
На темном небе сверкнула яркая молния, и раздался оглушительный гром.
Повествовательное, невосклицательное, сложное предложение, состоящее из двух грамматических основ (молния сверкнула, гром раздался); союзное, соединительный союз «и», сложносочиненное.
На темном небе сверкнула яркая молния , и раздался оглушительный гром .
Городская площадь, на которой шумела ярмарка, была украшена шарами, флагами и яркими транспарантами.
Повествовательное, невосклицательное, сложное предложение, две грамматические основы (площадь была украшена; ярмарка шумела), союзная связь, союзное слово «на которой» соединяет главное предложение (Городская площадь была украшена шарами, флагами и яркими транспарантами) с зависимым (на которой шумела ярмарка), сложноподчиненное предложение с придаточным определительным.
Городская площадь , на которой шумела ярмарка , была украшена шарами , флагами и яркими транспарантами .
Девушка огорчилась: она забыла вернуть подруге журнал.
Повествовательное, невосклицательное, сложное предложение, две грамматические основы (девушка огорчилась; она забыла вернуть), бессоюзная связь, второе простое предложение выражает причину того, о чем идет речь в первом предложении; бессоюзное сложное предложение.
Девушка огорчилась : она забыла вернуть подруге журнал .
Источник