<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Итерация №2: разбор выражений on Компиляторы | ПС</title><link>https://compilers-course.ru/docs/projects/frontend/02_expressions/</link><description>Recent content in Итерация №2: разбор выражений on Компиляторы | ПС</description><generator>Hugo</generator><language>ru-ru</language><atom:link href="https://compilers-course.ru/docs/projects/frontend/02_expressions/index.xml" rel="self" type="application/rss+xml"/><item><title>EBNF грамматика в спецификации</title><link>https://compilers-course.ru/docs/projects/frontend/02_expressions/ebnf-grammar/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://compilers-course.ru/docs/projects/frontend/02_expressions/ebnf-grammar/</guid><description>&lt;h1 id="ebnf-грамматика-в-спецификации"&gt;&#10; EBNF грамматика в спецификации&#10; &#10; &lt;a class="anchor" href="#ebnf-%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b0%d1%82%d0%b8%d0%ba%d0%b0-%d0%b2-%d1%81%d0%bf%d0%b5%d1%86%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;Нужно добавить в спецификацию EBNF-грамматику языка.&lt;/p&gt;&#10;&lt;p&gt;Кроме EBNF-грамматики в спецификацию надо добавить таблицу со списком операторов с указанием их приоритета и ассоциативности (левой/правой).&lt;/p&gt;&#10;&lt;h2 id="требования-к-оформлению-ebnf-грамматики"&gt;&#10; Требования к оформлению EBNF-грамматики&#10; &#10; &lt;a class="anchor" href="#%d1%82%d1%80%d0%b5%d0%b1%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%ba-%d0%be%d1%84%d0%be%d1%80%d0%bc%d0%bb%d0%b5%d0%bd%d0%b8%d1%8e-ebnf-%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b0%d1%82%d0%b8%d0%ba%d0%b8"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Добавляется в файл спецификации &lt;code&gt;docs/specification.md&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Оформляется как блок кода на языке &lt;code&gt;ebnf&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Используется диалект ISO EBNF — см. &lt;a href="https://compilers-course.ru/docs/articles/ebnf/"&gt;EBNF для описания грамматик&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Должны быть описаны правила для всех нетерминалов&lt;/li&gt;&#10;&lt;li&gt;Не следует описывать правила для терминальных символов — они уже описаны в разделе про лексику&lt;/li&gt;&#10;&lt;li&gt;Именование символов грамматики должно быть очевидным — однако можно добавлять комментарии для ясности&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="требования-к-ebnf-грамматике"&gt;&#10; Требования к EBNF-грамматике&#10; &#10; &lt;a class="anchor" href="#%d1%82%d1%80%d0%b5%d0%b1%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%ba-ebnf-%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b0%d1%82%d0%b8%d0%ba%d0%b5"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Нужно устранить левую рекурсию, поскольку по грамматике вы будете писать парсер на основе рекурсивного спуска&lt;/li&gt;&#10;&lt;li&gt;Рекомендуется устранить левую факторизацию, чтобы упросить разработку парсера&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="требования-к-языку"&gt;&#10; Требования к языку&#10; &#10; &lt;a class="anchor" href="#%d1%82%d1%80%d0%b5%d0%b1%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%ba-%d1%8f%d0%b7%d1%8b%d0%ba%d1%83"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;На данном этапе надо описать грамматику в том объёме, который вы реализуете в этой же итерации:&lt;/p&gt;</description></item><item><title>Парсер точки входа и выражений</title><link>https://compilers-course.ru/docs/projects/frontend/02_expressions/expressions-parser/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://compilers-course.ru/docs/projects/frontend/02_expressions/expressions-parser/</guid><description>&lt;h1 id="парсер-точки-входа-и-выражений"&gt;&#10; Парсер точки входа и выражений&#10; &#10; &lt;a class="anchor" href="#%d0%bf%d0%b0%d1%80%d1%81%d0%b5%d1%80-%d1%82%d0%be%d1%87%d0%ba%d0%b8-%d0%b2%d1%85%d0%be%d0%b4%d0%b0-%d0%b8-%d0%b2%d1%8b%d1%80%d0%b0%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;Нужно написать парсер для разбора простейших программ, которые имеют:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Одну точку входа&lt;/li&gt;&#10;&lt;li&gt;Список инструкций, где инструкция — это выражение либо операция ввода/вывода&lt;/li&gt;&#10;&lt;li&gt;Арифметические операции в выражениях&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;На основе парсера надо реализовать консольный интерпретатор.&lt;/p&gt;&#10;&lt;p&gt;Пример такой программы:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#09f;font-style:italic"&gt;/* Сложение, умножение и унарный минус */&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#09f;font-style:italic"&gt;/* Ожидаемый результат: 80 */&lt;/span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#069;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#0a8;font-weight:bold"&gt;AddMultiply&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#069;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#069;font-weight:bold"&gt;static&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#078;font-weight:bold"&gt;void&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#c0f"&gt;main&lt;/span&gt;(String&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;[]&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;a)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;System.&lt;span style="color:#309"&gt;out&lt;/span&gt;.&lt;span style="color:#309"&gt;println&lt;/span&gt;(10&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;+&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;7&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;*&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(2&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;*&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;3&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;+&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;4)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;+&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;5&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;+&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#555"&gt;-&lt;/span&gt;5);&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="соответствие-спецификации"&gt;&#10; Соответствие спецификации&#10; &#10; &lt;a class="anchor" href="#%d1%81%d0%be%d0%be%d1%82%d0%b2%d0%b5%d1%82%d1%81%d1%82%d0%b2%d0%b8%d0%b5-%d1%81%d0%bf%d0%b5%d1%86%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Парсер должен соответствовать спецификации вашего языка:&lt;/p&gt;</description></item><item><title>Приёмочные тесты интерпретатора</title><link>https://compilers-course.ru/docs/projects/frontend/02_expressions/acceptance-tests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://compilers-course.ru/docs/projects/frontend/02_expressions/acceptance-tests/</guid><description>&lt;h1 id="приёмочные-тесты-интерпретатора"&gt;&#10; Приёмочные тесты интерпретатора&#10; &#10; &lt;a class="anchor" href="#%d0%bf%d1%80%d0%b8%d1%91%d0%bc%d0%be%d1%87%d0%bd%d1%8b%d0%b5-%d1%82%d0%b5%d1%81%d1%82%d1%8b-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bf%d1%80%d0%b5%d1%82%d0%b0%d1%82%d0%be%d1%80%d0%b0"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;h2 id="концептуальные-требования-к-тестам"&gt;&#10; Концептуальные требования к тестам&#10; &#10; &lt;a class="anchor" href="#%d0%ba%d0%be%d0%bd%d1%86%d0%b5%d0%bf%d1%82%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d1%82%d1%80%d0%b5%d0%b1%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%ba-%d1%82%d0%b5%d1%81%d1%82%d0%b0%d0%bc"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Приёмочные тесты должны быть одновременно функциональными и интеграционными. Объяснение:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Приёмочные тесты (Acceptance tests) проверяют пригодность ПО для решаемой задачи; в контексте интерпретатора они могут:&#10;&lt;ul&gt;&#10;&lt;li&gt;проверять отдельные возможности языка — например, арифметические операции &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;проверять полноценные программы — например, вычисление площади круга или сортировку пузырьком&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Функциональные тесты (Functional tests) проверяют интерфейс программы вместо деталей реализации; в контексте интерпретатора они могут запускать CLI либо эмулировать запуск CLI, вызывая внутренние&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="реализация-тестов"&gt;&#10; Реализация тестов&#10; &#10; &lt;a class="anchor" href="#%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d1%82%d0%b5%d1%81%d1%82%d0%be%d0%b2"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Приёмочные тесты должны запускать интерпретатор целиком, подменяя средства ввода/вывода через инъекцию зависимостей в конструктор или параметры.&lt;/p&gt;</description></item><item><title>Генерация кода для стековой виртуальной машины</title><link>https://compilers-course.ru/docs/projects/frontend/02_expressions/stack-vm-codegen/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://compilers-course.ru/docs/projects/frontend/02_expressions/stack-vm-codegen/</guid><description>&lt;h1 id="генерация-кода-для-стековой-виртуальной-машины"&gt;&#10; Генерация кода для стековой виртуальной машины&#10; &#10; &lt;a class="anchor" href="#%d0%b3%d0%b5%d0%bd%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d1%8f-%d0%ba%d0%be%d0%b4%d0%b0-%d0%b4%d0%bb%d1%8f-%d1%81%d1%82%d0%b5%d0%ba%d0%be%d0%b2%d0%be%d0%b9-%d0%b2%d0%b8%d1%80%d1%82%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d0%be%d0%b9-%d0%bc%d0%b0%d1%88%d0%b8%d0%bd%d1%8b"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Требования будут описаны позже — напомните преподавателю, если они нужны вам уже сейчас&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Кратко:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;стековая VM, программа = список инструкций VM&lt;/li&gt;&#10;&lt;li&gt;генерация списка инструкций по мере разбора в парсере&lt;/li&gt;&#10;&lt;li&gt;запуск VM интерпретатором после завершения разбора&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>LSP-сервер для диагностики ошибок</title><link>https://compilers-course.ru/docs/projects/frontend/02_expressions/lsp-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://compilers-course.ru/docs/projects/frontend/02_expressions/lsp-server/</guid><description>&lt;h1 id="lsp-сервер-для-диагностики-ошибок"&gt;&#10; LSP-сервер для диагностики ошибок&#10; &#10; &lt;a class="anchor" href="#lsp-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80-%d0%b4%d0%bb%d1%8f-%d0%b4%d0%b8%d0%b0%d0%b3%d0%bd%d0%be%d1%81%d1%82%d0%b8%d0%ba%d0%b8-%d0%be%d1%88%d0%b8%d0%b1%d0%be%d0%ba"&gt;#&lt;/a&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Требования будут описаны позже — напомните преподавателю, если они нужны вам уже сейчас&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Кратко:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;LSP-сервер на том же языке, что и парсер&lt;/li&gt;&#10;&lt;li&gt;LSP-сервер запускает парсер и получает синтакчические ошибки&lt;/li&gt;&#10;&lt;li&gt;LSP-сервер реализует только разбор и публикацию синтаксических ошибок в IDE&lt;/li&gt;&#10;&lt;li&gt;плагин VSCode интегрируется с LSP-сервером: передаёт ему открытые документы, забирает синтаксические ошибки&lt;/li&gt;&#10;&lt;/ul&gt;</description></item></channel></rss>