Письменный синтаксический разбор предложения: Синтаксический разбор простого предложений — Правила и примеры

Конспект урока по русскому языку «Синтаксический разбор предложения» (5 класс)

УРОК РУССКОГО ЯЗЫКА В 5 КЛАССЕ

Тема урока: Синтаксический разбор простого предложения

Цели: 

1) познакомить с  порядком  синтаксического  разбора

простого   предложения;

2) формировать  умение  производить  синтаксический

разбор (устный  и  письменный)  простого предложения;

3) активизация  умений  излагать  свои  мысли  чётко  и  лаконично;

4 ) воспитание  внимания  к  слову  через  конструирование

предложений;

5) повторение  изученного материала по теме «Синтаксис», частей  речи, изученных орфограмм, пунктограмм;

6) развивать коммуникативные навыки;

7) развивать критическое мышление;

6формировать представление о здоровье как одной из главных

ценностей человеческой жизни.

                                                     Ход урока.

1. Орг. момент.

2.Стадия вызова.

-Приступаем к работе. А сейчас, ребята, мы с вами поиграем в игру « Веришь ли ты?» Я буду задавать тонкие вопросы, на которые вы мне будете отвечать только «да» или «нет», и толстые вопросы, на которые надо ответить подробно.

СЛОВАРНЫЕ СЛОВА

Горох, колокольчик, жар-птица, миллиметр, дежурный

ПРОВЕРКА ДОМАШНЕГО ЗАДАНИЯ

Приём «Верные и неверные утверждения», « Тонкие и толстые вопросы»

1.       Верите ли вы, что предложения по эмоциональной окраске бывают восклицательные и невосклицательные? (да)

2.       Верите ли вы, что предложения по цели высказывания бывают распространённые и нераспространённые? (нет) А какие они бывают? (повествовательные, побудительные, вопросительные)

3.       Верите ли вы, что в простых предложениях одна грамматическая основа, а в сложных – две и более грамматических основ? (да)

4.       Верите ли вы, что дополнение, обстоятельство и определение – это главные члены предложения? (нет) А какие члены предложения являются главными? (подлежащее и сказуемое)

5.        Верите ли вы, что обращение- это слово, называющее того, к кому обращаются с речью? (да)

6.       Верите ли вы, что между однородными членами предложения запятая не ставится? (и да, и нет) Почему?

-Ребята, скажите мне, пожалуйста, а на какую тему я вам задавала вопросы? (предложение)

-Какой раздел науки о языке изучает предложение? (Синтаксис)

-Чему мы должны научиться на уроке? (Синтаксическому разбору

простого предложения.)

-Запишите, пожалуйста, тему урока в тетрадь.

-Какие задачи будут стоять перед нами на уроке?

Кроме того мы должны повторить и обобщить знания по теме «Синтаксис».

А помогут нам в этом загадки, пословицы, поговорки и тексты о здоровом образе жизни.

ОБЪЯСНЕНИЕ НОВОГО МАТЕРИАЛА

Вопрос-ответ:

·                     Назовите предложения по цели высказывания ( Повествовательное, побудительное, вопросительное)

— В побудительном предложении содержится совет, просьба, приказ, пожелание. ( пример)

 В повествовательном предложении содержится сообщение.(  пример)

 В вопросительном предложении содержится вопрос.( пример)

— Предложение по эмоциональной окраске может быть восклицательным и невосклицательным

 -Подлежащее и сказуемое- это грамматическая основа.

·                    — По наличию грамматических основ предложения бывают — односоставными и двусоставными.

 По наличию второстепенных чл. предложения -распространённые и нераспространённые. ( пример)

 

Что значит выполнить синтаксический разбор предложения?

1.      Назвать главные и второстепенные члены предложения, подчеркнуть.

2.      Указать, какими частями речи они выражены.

3.      Дать характеристику предложению.

 

 

 

 

 

 

ПОЛНЫЙ СИНТАКСИЧЕСКИЙ РАЗБОР ПРЕДЛОЖЕНИЯ

РАБОТА ПО ТЕМЕ (САМОСТОЯТЕЛЬНО)

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

1 вариант

Из предложения

взять сказуемое.

Из предложения

взять определение.

Добавить подлежащее из предложения

Взять существительное, выступающее в роли дополнения:

Употребить данное существительное в винительном падеже с предлогом НА.

Опустились лёгкие снежинки на тропинки.

2 вариант

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

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

3. Добавьте сказуемое из предложения Мама от усталости опустилась на диван.

4. Из предложения Над городом пролетел быстрокрылый самолёт возьмите обстоятельство места, выраженное существительным с предлогом над.

Запишите данное существительное в форме винительного падежа с предлогом НА.

— Какое предложение у вас получилось? (Тихая ночь опустилась на город).

ПРОВЕРКА ЗАДАНИЯ, ВЫПОЛНЕНИЕ ПОЛНОГО СИНТАКСИЧЕСКОГО РАЗБОРА

 

СИНТАКСИЧЕСКИЙ РАЗБОР ПРЕДЛОЖЕНИЙ У ДОСКИ

 

РЕФЛЕКСИЯ

ВЫСТАВЛЕНИЕ ОЦЕНОК

ДОМАШНЕЕ ЗАДАНИЕ: составить предложения по следующим характеристикам:

1)     Повествовательное, невосклицательное, простое, двусоставное, нераспространённое

2)     Побудительное, восклицательное,  простое, односоставное, распространенное

3)     Вопросительное, невосклицательное, простое, двусоставное, распространенное

4)     Повествовательное, невосклицательное, простое, односоставное, распространённое

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 вариант

1.

Из предложения Парашютисты опустились в центре стадиона взять сказуемое.

2.Из предложения Вдруг послышались легкие шаги взять определение.

3.Добавить подлежащее из предложения На щеках тают снежинки

4.Взять существительное, выступающее в роли дополнения: Тропинки в саду засыпали листья

Употребить данное существительное в винительном падеже с предлогом НА.

— Какое предложение у вас получилось?

2 вариант

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

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

3. Добавьте сказуемое из предложения

Мама от усталости опустилась на диван.

4. Из предложения Над городом пролетел быстрокрылый самолёт возьмите обстоятельство места, выраженное существительным с предлогом над.

Запишите данное существительное в форме винительного падежа с предлогом НА.

— Какое предложение у вас получилось?

 

 

 

 

 

 

 

1)           Повествовательное, невосклицательное, простое, двусоставное, нераспространённое

2)           Побудительное, восклицательное,  простое, односоставное, распространенное

3)           Вопросительное, невосклицательное, простое, двусоставное, распространенное

4)           Повествовательное, невосклицательное, простое, односоставное, распространённое

 

1)           Повествовательное, невосклицательное, простое, двусоставное, нераспространённое

2)           Побудительное, восклицательное,  простое, односоставное, распространенное

3)           Вопросительное, невосклицательное, простое, двусоставное, распространенное

4)           Повествовательное, невосклицательное, простое, односоставное, распространённое

 

1)           Повествовательное, невосклицательное, простое, двусоставное, нераспространённое

2)           Побудительное, восклицательное,  простое, односоставное, распространенное

3)           Вопросительное, невосклицательное, простое, двусоставное, распространенное

4)           Повествовательное, невосклицательное, простое, односоставное, распространённое

 

1)           Повествовательное, невосклицательное, простое, двусоставное, нераспространённое

2)           Побудительное, восклицательное,  простое, односоставное, распространенное

3)           Вопросительное, невосклицательное, простое, двусоставное, распространенное

4)           Повествовательное, невосклицательное, простое, односоставное, распространённое

 

1)           Повествовательное, невосклицательное, простое, двусоставное, нераспространённое

2)           Побудительное, восклицательное,  простое, односоставное, распространенное

3)           Вопросительное, невосклицательное, простое, двусоставное, распространенное

4)           Повествовательное, невосклицательное, простое, односоставное, распространённое

 

1)           Повествовательное, невосклицательное, простое, двусоставное, нераспространённое

2)           Побудительное, восклицательное,  простое, односоставное, распространенное

3)           Вопросительное, невосклицательное, простое, двусоставное, распространенное

4)           Повествовательное, невосклицательное, простое, односоставное, распространённое

Синтаксический разбор простого предложения.

5-й класс

Цели:

  • познакомить с порядком синтаксического разбора простого предложения;
  • формировать  умение  производить синтаксический разбор (устный и письменный)  простого предложения;
  • способствовать развитию мышления, памяти, внимания;
  • воспитывать  внимания  к  слову  через  конструирование предложений;
  • воспитывать интерес к изучению русского языка;
  • повторить  изученного материала по теме «Синтаксис», частей  речи, изученных орфограмм, пунктограмм;
  • развивать  коммуникативные навыки; развивать критическое мышление;
  • формировать представление о здоровье как одной из главных ценностей человеческой жизни.

Оборудование: мультимедийная презентация, карточки

Ход урока

1. Орг. момент.

Здравствуйте, ребята. Я рада приветствовать вас на уроке русского языка.

Надеюсь, вы будете стараться работать хорошо, активно, творчески.

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

Итак, к уроку готовы? Тогда за работу, всем удачи.

Славная осень! Здоровый, ядреный
Воздух усталые силы бодрит;
Лед неокрепший на речке студеной
Словно как тающий сахар лежит;

Около леса, как в мягкой постели,
Выспаться можно — покой и простор!
Листья поблекнуть еще не успели,
Желты и свежи лежат, как ковер.

Славная осень! Морозные ночи,
Ясные, тихие дни…
Нет безобразья в природе! И кочи,
И моховые болота, и пни —

Всё хорошо под сиянием лунным,
Всюду родимую Русь узнаю…
Быстро лечу я по рельсам чугунным,
Думаю думу свою…

— Это отрывок из стихотворения А.Н.Некрасова «Железная дорога». А какую тему поднимает Некрасов в этом отрывке? Тема природы.

— Ребята, вы наверное, знаете, что 2017 год в России – год экологии, но уже сейчас мы с вами задумываемся об этом, и на уроке  мы также будем говорить о природе.

Презентация.

2. Проверка домашнего задания. Открыли тетради, записали число, классная работа.

1) Терминологический диктант

Подлежащее, сказуемое, дополнение, обстоятельство, определение, обращение.

Написать слова и подчеркнуть их так, как мы обозначаем их при разборе предложения. (Взаимопроверка в парах. Учитель проверяет 1 работу, оценивая и комментируя (на доске)

— А сейчас, ребята, мы с вами проверим, как вы усвоили материал. Я буду задавать вам вопросы, на которые вы мне будете отвечать только «да» или «нет», а также такие вопросы, на которые надо ответить подробно.

2) Приём «Верные и неверные утверждения».

  1. Согласны ли вы, что предложения по эмоциональной окраске бывают восклицательные и невосклицательные? (да)
  2. Верите ли вы, что предложения по цели высказывания бывают распространённые и нераспространённые? (нет) А какие они бывают? (повествовательные, побудительные, вопросительные)
  3. Верите ли вы, что в  простых предложениях одна грамматическая основа, а в сложных – две и более грамматических основ? (да)
  4. Согласны  ли вы, что дополнение, обстоятельство и определение – это главные члены предложения? (нет) А какие члены предложения являются главными? (подлежащее и сказуемое)
  5. Верите ли вы, что обращение — это слово, называющее того, к кому обращаются с речью? (да)
  6. Согласны ли вы, что между однородными членами предложения запятая не ставится? (и да, и нет) Почему?

— Ребята, скажите мне, пожалуйста, а на какую тему я вам задавала вопросы? (Предложение)

— Какой раздел науки о языке изучает предложение? (Синтаксис)

— Ребята, а как называется вид работы, когда нужно подчеркнуть члены предложения? (Синтаксический разбор)

— Объясните подробнее, что значит сделать синтаксический разбор?

— Значит,  о чем мы будем с вами говорить на уроке. Сформулируйте тему урока.

— Запишите, пожалуйста, тему урока в тетрадь.

— Чему мы должны научиться на уроке? (Синтаксическому разбору простого предложения.)

— Давайте сформулируем цели нашего урока.

1)  познакомиться с порядком синтаксического разбора простого   предложения;

2) учиться  производить синтаксический разбор (устный и письменный) простого предложения;

3) писать правильно, уметь проверять написанное

4) обобщить знания по теме «Синтаксис»

3. Объяснение нового материала.

1) — Что значит выполнить синтаксический разбор предложения?

  • Назвать главные и второстепенные члены предложения, подчеркнуть.
  • Указать, какими частями речи они выражены.
  • Дать характеристику предложения.
  • Запишем предложение, поработаем по тому плану, который вы предложили.

Я вам, друзья, открою тайны здешних мест.

А теперь откройте учебники на стр. 104. Познакомимся с порядком синтаксического разбора простого предложения.

Работа с учебником.

А теперь составим памятку «Порядок синтаксического разбора».

— На столе у вас карточка-памятка. Заполним вместе пропуски, вспомнив теоретический материал.

По каким признакам характеризуется предложение

Вид предложения

1

По цели высказывания

1) ________________________________
2) ________________________________
3) ________________________________

2

По эмоциональной окраске

1) ________________________________
2) ________________________________

3

По количеству грамматических основ

1) _________________________________
2) _________________________________

4

По наличию или отсутствию главного члена предложения

1) _________________________________
2) _________________________________

5

По второстепенным членам предложения

1) _________________________________
2) _________________________________

6

Осложнено

1)__________________________________
2) __________________________________

6. Конструирование предложения.

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

Опустились лёгкие снежинки на тропинки.

Дайте характеристику предложения (устно).

7. Физкультминутка. (Повторяй за улочкой).

8. Работа с текстом.

  • Как можно озаглавить данный текст?
  • Какова основная мысль текста?
  • Как вы понимаете значение слова ВРАЧЕВАТЕЛЬ?
  • Какими близкими по значению словами его можно заменить?
  • Как вы понимаете значение слова СУЕТА?
  • Выполните синтаксический разбор предложения №5.
  • Найдите в тексте
    • восклицательное предложение
    • побудительные предложения
  • В каких предложениях грамматическая основа состоит только из сказуемого? Как называются такие предложения?

8. Самостоятельная работа с текстом.

А теперь самостоятельная работа, запишите  предложение из стихотворения М.А.Лермонтова. Произведите синтаксический разбор одного предложения.

На севере диком стоит одиноко на голой вершине сосна

— Проверим, оцените себя. Прочитайте еще раз  это предложение. Что необычного заметили в построении предложения. Какой член предложения находится на первом месте?

Инверсия – обратный порядок слов.

9.  – Ребята, а кто из вас знает, как зовут художника, который написал очень много разных картин о природе? (Шишкин Иван Иванович)

— А вы знаете, что эту картину, изображающую сосну, тоже написал Шишкин.

— У Шишкина много картин, изображающих природу, посмотрите на слайды.

10. Проверочная работа. У Вас на парте листочки с заданием. Подпишите их, выполните задание.

11. Подведение итогов урока.

Наш урок подходит к концу, вы сегодня все очень хорошо поработали. Молодцы! На память о нашем уроке у вас останутся смайлики, на обратной стороне которых вы найдёте мои пожелания вам.

Я желаю вам, ребята,
Быть здоровыми всегда,
Но добиться результата
Невозможно без труда.

Урок окончен, всем спасибо!

Разбор предложений с помощью ДРУГОГО инструмента естественного языка: LinkGrammar

Джефф Элмор

Тип:
Разговор
Уровень аудитории:
Новичок
Категория:
Наука

11 марта 14:10 – 14:55


Описание

Многие из вас, вероятно, знакомы с NLTK, замечательным набором инструментов естественного языка для Python. Возможно, вы не знакомы с Linkgrammar — системой разбора предложений, созданной в университете Карнеги-Мелон. Linkgrammar довольно надежен и работает «из коробки» так, как NLTK не работает для синтаксического анализа предложений.


Abstract

NLTK — фантастическая библиотека с широкими возможностями. Но часто я обнаруживаю, что мне нужно что-то, что просто делает то, что я хочу, без необходимости выяснять все детали. Примером этого является разбор предложений. Быстрый поиск в Google по синтаксическому анализу предложений с помощью NLTK возвращает ряд статей, описывающих, как написать собственную грамматику и определить синтаксический анализатор на основе этой грамматики и синтаксического анализа предложений. Это отлично подходит для игрушечных задач и обучения, но если вам действительно нужно анализировать предложения «из дикой природы», написание собственной грамматики — огромная задача.

Введите Linkgrammar. Linkgrammar был разработан в университете Карнеги-Мелон и теперь поддерживается разработчиками Abiword в качестве основы для их возможностей проверки грамматики. Он отлично работает из коробки и терпим к неточностям, обнаруженным в аутентичном тексте.

Вот набросок структуры выступления:

  • Введение в выступление с обзором структуры
  • Обсудить NLTK и признать все, что он предлагает
  • Показать примеры кода, найденного в Интернете, для создания простого синтаксического анализатора с помощью NLTK
  • Показать предложение синтаксического анализа фрагмента кода с помощью pylinkgrammar
  • Существующие привязки представляли собой простую обертку SWIG библиотеки C. Я расширил эти привязки, чтобы предложить более Pythonic интерфейс.
  • Показать примеры: Сначала простые предложения
  • Связи между словами имеют разные типы, и существует набор правил, определяющих, какие слова и какого типа слова могут иметь определенные связи между собой
  • Покажите пример: несколько более сложные варианты исходного предложения для обозначения различий в типах ссылок
  • Показать примеры использования различных параметров синтаксического анализа
  • Показать примеры создания составляющих деревьев
  • Обсудить историю/предысторию системы грамматики ссылок: разработана в CMU, в настоящее время поддерживается AbiWord и используется в проекте RelEx и др.
  • Что такое грамматика ссылок и чем она отличается от других подходов?
  • Большинство систем синтаксического анализа создают составные деревья фраз; показать примеры
  • Опишите правила, которые Linkgrammar использует для создания ссылок между словами
  • Показать примеры определения грамматики
  • Постобработка этих связей позволяет создать стандартное составное дерево фраз.
  • Показать больше примеров составляющих деревьев фраз
  • Что нужно сделать?
  • Чем вы можете помочь?

Написание компилятора Markdown — часть 2 — блог beezwax

Привет и добро пожаловать во вторую часть серии статей «Написание компилятора Markdown»! Если вам это нужно, вот Часть 1, Введение/Токенизатор и Часть 3, Генерация кода.

В этой части мы поговорим о втором этапе компиляции: синтаксическом анализе, также известном как синтаксический анализ. В этой части немного больше теории, так что ее усвоение может занять некоторое время. Выпейте кофе, расслабьтесь, не торопитесь, и пока вы не торопитесь, вы обнаружите, что это совсем не сложно. 🙂

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

Например, скажем, мы разработали язык, в котором вы можете присвоить переменную следующим образом:

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

Как видите, мы принимаем только небольшое количество последовательностей токенов. На самом деле принятые последовательности должны быть тщательно упорядочены, чтобы быть действительными. Распространенное решение этой проблемы — сопоставление последовательностей — это регулярные выражения. Не очень распространенное решение — написание парсера.

Анализатор сам по себе является просто программой, которая возвращает true, если последовательность допустима, и false в противном случае. Наш синтаксический анализатор также вернет узел AST, об этом мы узнаем чуть позже.

Теория и грамматика

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

Правила могут состоять только из других правил и/или терминала. Например, если мы хотим сопоставить крошечный язык L = {a, b, c} мы могли бы написать:

L = {a, b, c} можно прочитать как «Язык L состоит из 3 элементов: a , b , и c ».

В данном случае a , b и c все терминалы, они совпадают друг с другом. Мы могли использовать любой символ для представления или , мы использовали | , так как это довольно распространено. Унифицированного представления грамматики не существует — каждая библиотека делает свой собственный выбор — тем не менее, все они исходят из чего-то, что называется формой Бэкуса Наура.

Мы также будем использовать что-то под названием Kleene star :

Это просто означает: Сопоставьте это 0 или более раз. Он будет соответствовать пустой строке "" , a , aa , aaa и так далее. Очень похожий помощник — это Kleen плюс , что означает: Сопоставьте это 1 или более раз.

Будет соответствовать b , bb , bbb и так далее, но не пустой строке.

Порядок, в котором грамматика пробует правила, формально не определен, любое возможное совпадение является допустимым совпадением. Например, рассмотрим следующую грамматику:

В этой грамматике у нас есть два способа порождения «аба», один — с использованием первой ветви или , а другой — с использованием второй ветви.

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

Языки, созданные грамматикой, называются формальными языками , вы уже знаете несколько формальных языков, некоторые из них HTML, XML, CSS, JavaScript, Ruby, Swift, Java и C.

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

О каких именно ограничениях идет речь? На самом деле их немного, нам просто нужно избегать левой рекурсии:

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

У нас бесконечный цикл! Хорошая новость заключается в том, что все грамматики с левой рекурсией можно записать как другую эквивалентную грамматику без левой рекурсии. В следующем разделе мы преобразуем леворекурсивную грамматику в нелеворекурсивную.

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

В приведенной выше грамматике я хочу сопоставить правило идентификатора, токен типа EQUALS (также известный как терминал) и число. Как видите, мы определили их с помощью некоторых строительных блоков, называемых терминалами или токенами. В нашем коде мы скажем 9Токен 0093 WORD соответствует [a-z]+ , а токен NUMBER будет соответствовать только [0-9].

Чтобы опробовать эту грамматику, нам нужно знать только модель подстановки. Мы просто заменяем правила их определением до тех пор, пока у нас не останутся только терминалы. Допустим, я хочу сопоставить foo = 1 . Мы должны начать с исходного правила и посмотреть, сможем ли мы добраться до него:

Мы смогли получить foo = 1 , так что это принадлежит нашему языку.

Об абстрактных синтаксических деревьях

Теперь еще немного теории, прежде чем я отпущу вас 🙂 Весь смысл грамматики в том, чтобы получить представление абстрактного синтаксического дерева — или сокращенно AST — нашего ввода. Например, грамматика уценки может анализировать hello __world__. как:

ПРИМЕЧАНИЕ Если вы никогда раньше не видели древовидную структуру данных, возможно, вам захочется
проверить ее.

Наш родительский узел — PARAGRAPH. У этого узла есть один дочерний узел SENTENCES, который, в свою очередь, имеет 3 дочерних узла: TEXT, BOLD и еще один TEXT. Начальным правилом в нашем парсере будет самый верхний родитель в нашем дереве.

Суть извлечения дерева из грамматики заключается в том, что мы можем устранить двусмысленность. Рассмотрим следующую грамматику:

Если бы мы вручную построили AST для 2 + 2 - 4 , мы получили

Способ чтения AST — это чтение всех листьев дерева — узлов без потомков — слева направо. верно. Если мы это сделаем, вы увидите, что мы сопоставили (2 + 2) - 4 . Проблема в том, что одинаково корректным представлением может быть:

На этот раз мы получаем 2 + (2 - 4) . У нас есть два возможных AST на выбор! Поскольку мы хотим, чтобы наши программы были детерминированными (при одних и тех же входных данных всегда возвращались одни и те же выходные данные), похоже, у нас есть некоторые проблемы.

Ну не совсем. К счастью для нас, мы используем леворекурсивные грамматики. У этих грамматик есть замечательное свойство: они никогда не имеют двусмысленности! Преобразуем старую грамматику:

Как видите, мы явно задаем порядок выполнения операций, в данном случае это умножение, деление, сложение и вычитание — точно так же, как в C. Сгенерированный AST теперь всегда будет одинаковый. Давайте посмотрим, как грамматика оценивает 2 + 2 , так что вы освоите этот трюк:

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

Простая грамматика Markdown

Ладно, хватит теории, давайте уже начнем программировать! Вот грамматика, которую мы реализуем:

Наше начальное правило — Body , которое соответствует 0 или более абзацам. Каждый абзац состоит из SentenceAndNewline 9правило 0108 или правило SentenceAndEOF . Предложение — это просто текст, полужирный или выделенный текст.

Обратите внимание, что правило Text кажется довольно глупым. Это просто упрощает реализацию, мы могли бы легко избавиться от него и просто заменить на TEXT .

Реализация

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

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

Начнем с правила TEXT , которое соответствует одному токену TEXT .

Все парсеры ведут себя очень похоже. Они берут список из 90 107 токенов 90 108 и просматривают список, чтобы убедиться, что последовательность верна. Затем они возвращают соответствующий узел или пустой узел (нулевой узел). Назовем результат узел , потому что мы хотим построить абстрактное синтаксическое дерево.

Давайте посмотрим на более сложный синтаксический анализатор, __bold__ **текст** :

Еще раз, мы просто проверяем правильность последовательности токенов и возвращаем узел. Метод peek_or находится в объекте TokenList , он принимает любое количество массивов в качестве входных данных и пробует токены, определенные в каждом массиве, один за другим. Он останавливается всякий раз, когда находит совпадение, возвращая true, в противном случае возвращает false. Как вы можете себе представить, порядок массивов очень важен, так как он соответствует принципу «первый-в-первом».

Парсер выделения очень похож на этот, так что давайте перейдем к чему-то более интересному: Парсер предложения. Наше правило: предложений := EmphasizedText | Жирный текст | Текст . Кажется достаточно простым, match_first помогает нам:

match_first — это проблема, которая включается по мере необходимости. Это чем-то похоже на или , он попробует данные парсеры и вернет первый найденный действительный узел. Как обычно, порядок парсеров очень важен, так как они проверяются в заданном порядке.

Теперь перейдем к следующему правилу: SentenceAndNewline := Sentence+ NEWLINE NEWLINE .

Подобно match_first , теперь у нас есть другая задача, match_star , которая соответствует чему-то 0 или более раз. Поскольку мы сопоставляем + (Kleen Plus), мы хотим сопоставить что-то один или несколько раз, поэтому мы ошибаемся, если не получаем ничего из нашего метода match_star . Затем мы просто сопоставляем два NEWLINE и возвращаем узел.

ЗАМЕТКА Здесь можно создать нового помощника, match_plus . Для простоты я решил сделать это «вручную». Если вы хотите поиграть с кодом, реализация match_plus — хорошее упражнение.

Наши небольшие заботы отнимают большую часть работы, так как остальные парсеры довольно тривиальны. Например, это наш парсер Body :

Теперь не хватает чего-то, чтобы начать вызывать парсеры. Давайте завернем всю функциональность синтаксического анализа в Parser объект, который абстрагирует все сложные вещи в простой API:

Мы уже далеко продвинулись.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *