<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Два студента пишут лабы &#187; ASM</title>
	<atom:link href="http://www.studcode.ru/archiv/tag/asm-lekciya/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.studcode.ru</link>
	<description>Конспекты лекций, самостоятельные работы по  delphi, с++, php. Курсовые проекты. Все что мы сделали вы можете скачать без проблем!</description>
	<lastBuildDate>Wed, 27 Oct 2010 15:15:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Разбор рекурсивным спуском</title>
		<link>http://www.studcode.ru/archiv/razbor-rekursivnym-spuskom/</link>
		<comments>http://www.studcode.ru/archiv/razbor-rekursivnym-spuskom/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 11:33:15 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=953</guid>
		<description><![CDATA[Разбор рекурсивным спуском
Рассмотрим сначала разбор сверху в низ. Исходными данными для такого разбора является входная сентенциальная форма и дерево разбора, содержащее только корень, т.е. выделенный нетерминал. Задача разбора – ,используя правила грамматики построить полное дерево, соответствующее сентенциальной форме. Самый простой, но не самый оптимальный подход, состоит в создании рекурсивной программы, которая каждый раз выполняет подстановку [...]]]></description>
			<content:encoded><![CDATA[<p>Разбор рекурсивным спуском<br />
Рассмотрим сначала разбор сверху в низ. Исходными данными для такого разбора является входная сентенциальная форма и дерево разбора, содержащее только корень, т.е. выделенный нетерминал. Задача разбора – ,используя правила грамматики построить полное дерево, соответствующее сентенциальной форме. Самый простой, но не самый оптимальный подход, состоит в создании рекурсивной программы, которая каждый раз выполняет подстановку для самого левого нетерминала дерева с использованием первого правила подстановки для этого нетерминала.  Дойдя до терминалов, выполняется сравнение полученной части сентенциальной формы дерева с исходной. Если они совпадают, то часть дерева вывода принимается. Если нет, то выполняется рекурсивный шаг назад, и пытаемся подставить второе правило для нетерминала, а если больше правил нет, то выполняется еще шаг назад. Если в результате таких выводов будет построено дерево, соответствующее исходной сентенциальной форме, то исходная цепочка считается правильной и синтаксический анализ завершенным. Если дерево построить не удалось, то исходная цепочка отвергается.<br />
Разумеется, такая процедура будет работать только для правой грамматики, т.к. левая зациклится.<span id="more-953"></span></p>
<h2>Алгоритм</h2>
<p>1.	Создается корень дерева и заполняется выделенным символом грамматики<br />
2.	Вызывается процедура рекурсивного спуска, и ей передается дерево<br />
3.	Если процедура рекурсивного спуска вернула 1, то разбор успешен и дерев разбора заполнено, иначе ошибка.<br />
Процедура рекурсивного спуска<br />
1.	Найти самый левый нетерминал.<br />
2.	Если он не найден, то п.10<br />
3.	Для i=1, до NP выполнить 4<br />
4.	Если левая часть правила i грамматики содержит  текущий нетерминал, то перейти к п. 5, иначе п. 8<br />
5.	Достроить текущий нетерминал, согласно правилам<br />
6.	Если в результате подстановки 1 или несколько корней левых поддеревьев текущего узла содержат терминалы, то сравнить их с очередными символами исходной цепочки<br />
7.	Если они совпали, то эту часть цепочки считаем разобранной и возвращаем 1, иначе п.8<br />
8.	Перейти к следующей итерации цикла<br />
9.	Вернуть 0.<br />
10.	Если дерево соответствует цепочке, то вернуть 1, иначе 0.<br />
Основным недостатком такой процедуры, является большое количество возвратов, т.е. ошибочных выводов. Теперь рассмотрим способы их исключения.<br />
Ограниченные грамматики<br />
Однако такой разбор не будет столь эффективным, чтобы быть применимым на практике, и будет содержать большое количество проб и ошибок. Основная проблема предсказывающего разбора &#8211; определение правила вывода, которое нужно применить к нетерминалу.<br />
Впрочем, мож¬но определить ограниченные классы грамматик, которые поддаются более эффективному анализу в той или иной из указанных стратегий. Естественно, эти ограниченные классы грамматик являются менее гибкими как с точки зрения получаемых языков, так и по способам порождения предложений.</p>
<p>•	LL(k) &#8211; грамматики, для которых левый нисходящий анализатор может определить какое правило использовать для вывода, если позволить ему принимать во внимание k-следующих входных символов, считая от текущей позиции просмотра.<br />
•	LR(k)-грамматики, для которых правый нисходящий анализатор работает детерминированно, если позволить ему принимать  во  внимание  k  входных символов, расположенных справа от текущей входной позиции.<br />
•	Грамматики предшествования, для которых правый анализатор может находить основу правовыводимой цепочки, учитывая только некоторые отношения между парами ее смежных символов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/razbor-rekursivnym-spuskom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Стратегия разбора</title>
		<link>http://www.studcode.ru/archiv/strategiya-razbora/</link>
		<comments>http://www.studcode.ru/archiv/strategiya-razbora/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 09:59:20 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=950</guid>
		<description><![CDATA[Стратегия разбора
В процессе синтаксического анализа лексическая свертка программы обычно просматривается слева направо (и мы ограничимся рассмотрением только таких алгоритмов). Если программа допустима, то этот процесс завершается построением одного из ее деревьев разбора. Узнавая на каждом следующем шаге все большее число символов из лексической свертки транслируемой программы (и таким образом узнавая все большее число висячих вершин [...]]]></description>
			<content:encoded><![CDATA[<p>Стратегия разбора<br />
В процессе синтаксического анализа лексическая свертка программы обычно просматривается слева направо (и мы ограничимся рассмотрением только таких алгоритмов). Если программа допустима, то этот процесс завершается построением одного из ее деревьев разбора. Узнавая на каждом следующем шаге все большее число символов из лексической свертки транслируемой программы (и таким образом узнавая все большее число висячих вершин ее дерева разбора), мы попытаемся построить дерево разбора (которое согласуются с уже имеющейся информацией о программе), как бы заполняя его внутренними вершинами в некотором порядке. В принципе, мы можем выбрать произвольный порядок заполнения дерева. Однако этот порядок может в большой степени влиять на эффективность разбора, как в смысле трудоемкости, так и в смысле работы с ошибками (по отношению к той или иной конкретной грамматике). Он также тесно связан со всем процессом трансляции.<span id="more-950"></span><br />
В большинство существующих методов разбора порядок заполне¬ния дерева сводится к одному из двух основных вариантов (или стра¬тегий):<br />
•	Стратегия нисходящего анализа. При заполнении сверху вниз все предшественники каждой заполняемой в дереве внутренней вершины к этому моменту уже заполнены. Таким образом, заполняя дерево при нисхо¬дящем анализе, мы как бы движемся от его корня к висячим верши¬нам<br />
•	Восходящий анализ. Заполнение снизу вверх (стратегия так на¬зываемого) характеризуется тем, что все преем¬ники каждой заполняемой в дереве вершины уже принадлежат по¬строенной части дерева. При восходящем анализе мы строим дерево от висячих вершин к корню.<br />
В каждой из перечисленных стратегий можно реализовать ал¬горитм анализа для произвольного КС-языка.<br />
Процесс нисходящего разбора<br />
Процесс разбора (сверху-вниз) с точки зрения построения дерева разбора можно проиллюстрировать следующим образом.<br />
•	Фрагменты недостроенного дерева соответствуют сентенциальным формам вывода.<br />
•	Вначале дерево состоит только из одной вершины, соответствующей аксиоме S.<br />
•	В этот момент по первому символу входного потока предсказывающий анализатор должен определить правило S-&gt;X1 X2 &#8230;, которое должно быть применено к S.<br />
•	Затем необходимо определить правило, которое должно быть применено к X1, и т.д., до тех пор, пока в процессе такого построения сентенциальной формы, соответствующей левому выводу, не будет применено правило Y-&gt;a &#8230;.<br />
•	Этот процесс затем применяется для следующего самого левого нетерминального символа сентенциальной формы.<br />
Рассмотрим метод рекурсивного спуска, как один из методов рекурсивного спуска.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/strategiya-razbora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Синтаксический разбор &#8211; Построение дерева разбора</title>
		<link>http://www.studcode.ru/archiv/sintaksicheskij-razbor/</link>
		<comments>http://www.studcode.ru/archiv/sintaksicheskij-razbor/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 06:28:24 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=948</guid>
		<description><![CDATA[1.	Задача синтаксического анализатора
2.	Распознающие грамматики
3.	Дерево разбора
4.	Стратегии разбора
5.	Разбор рекурсивным спуском
6.	Ограниченные грамматики
7.	Магазинные автоматы
Задача синтаксического анализатора
Выходом сканера является лексическая свертка транслируемой программы. Процесс дальнейшей трансляции состоит в разборе (или синтаксическом анализе) структуры вхождений понятий в лексическую свертку программы и проверке, удовлетворяет ли эта структура синтаксису языка.
То, что в качестве результата (и задачи) синтаксического анализа ниже рассматривается построение дерева разбора, [...]]]></description>
			<content:encoded><![CDATA[<p>1.	Задача синтаксического анализатора<br />
2.	Распознающие грамматики<br />
3.	Дерево разбора<br />
4.	Стратегии разбора<br />
5.	Разбор рекурсивным спуском<br />
6.	Ограниченные грамматики<br />
7.	Магазинные автоматы</p>
<h2>Задача синтаксического анализатора</h2>
<p>Выходом сканера является лексическая свертка транслируемой программы. Процесс дальнейшей трансляции состоит в разборе (или синтаксическом анализе) структуры вхождений понятий в лексическую свертку программы и проверке, удовлетворяет ли эта структура синтаксису языка.<br />
То, что в качестве результата (и задачи) синтаксического анализа ниже рассматривается построение дерева разбора, ни в коей мере не означает, что в некоторый момент трансляции это дерево будет физически построено. Тем не менее, рассматривая выполнение любого алгоритма синтаксического анализа, можно всегда проследить процесс построения дерева разбора в нем.<span id="more-948"></span></p>
<h2>Распознающие грамматики</h2>
<p>Мы уже рассмотрели порождающие грамматики и способы построения сентенциальных форм, соответствующих языку с их использованием. Теперь мы попробуем применить эти грамматики к разбору сентенциальной формы.<br />
Одним из способов разбора, является построение всех возможных сентенциальных форм, для данного языка, и отыскания среди них исходной. Но построить все формы не представляется возможным. Ниже мы рассмотрим способы разбора без построения бесконечных множеств.</p>
<h2>Дерево разбора</h2>
<p>Дерево разбора в грамматике  G=(V, W, E, P) – это  помеченное упорядоченное дерево,   каждая  внутренняя вершина которого помечена символом из множества W, а каждый лист символом из множества V. Если внутренняя вершина помечена символом A, а ее прямые потомки – символами X1,&#8230;,Xn, то A → X1X2&#8230;Xn – правило этой грамматики. Причем левосторонний обход листьев этого дерева дает исходную сентенциальную форму. В таком случае говорят, что дерево соответствует сентенциальной форме или наоборот.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/sintaksicheskij-razbor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Программирование лексических анализаторов</title>
		<link>http://www.studcode.ru/archiv/programmirovanie-leksicheskix-analizatorov/</link>
		<comments>http://www.studcode.ru/archiv/programmirovanie-leksicheskix-analizatorov/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 13:48:33 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=946</guid>
		<description><![CDATA[Программирование лексических анализаторов
Рассмотрим для примера следующую схему лексического анализа.
Исходные данные и структуры
Имеется входная цепочка символов. Пустая таблица имен. И 3 множества символов
•	LA – множество символов латинского алфавита.
•	TZ – Множество знаков, являющихся терминалами языка
•	SP – Множество пробельных символов
•	ZPR – Множество знаков препинания (ZPR=SP U TZ).
Общая схема работы лексического анализатора такова.
•	Сначала выделяем отдельную лексему (используя  множества [...]]]></description>
			<content:encoded><![CDATA[<p>Программирование лексических анализаторов<br />
Рассмотрим для примера следующую схему лексического анализа.<br />
Исходные данные и структуры<br />
Имеется входная цепочка символов. Пустая таблица имен. И 3 множества символов<br />
•	LA – множество символов латинского алфавита.<br />
•	TZ – Множество знаков, являющихся терминалами языка<br />
•	SP – Множество пробельных символов<br />
•	ZPR – Множество знаков препинания (ZPR=SP U TZ).</p>
<p>Общая схема работы лексического анализатора такова.<br />
•	Сначала выделяем отдельную лексему (используя  множества ZPR и TZ).<br />
•	Если выделенная лексема – ограничитель, то он  выдается как результат лексического анализа.<br />
•	Если это идентификатор, то делается проверка на принадлежность его множеству ключевых слов. Если да, то выдается признак соответствующего ключевого слова, если нет &#8211; выдается лексема идентификатора. Сам идентификатор сохраняется в таблице имен, если его еще там нет. В лексему помещается ссылка на таблицу имен.<br />
•	Если выделенная лексема  принадлежит какому-либо  из других классов лексем (число,  строка и  т.д.), то  выдается признак лексема соответствующего класса, а значение лексемы сохраняется в качестве признака или в таблице имен.<span id="more-946"></span><br />
Лексический анализатор может работать или как самостоятельная фаза трансляции, или как подпрограмма, работающая по принципу &#8220;дай лексему&#8221;. В первом случае выходом лексического анализатора является файл лексем, во втором лексема выдается при каждом обращении к лексическому анализатору. Второй случай может быть предпочтительней, т.к. тогда синтаксический и лексический анализатор могут работать более слажено. Скажем синтаксический анализатор сообщает лексическому о возможности появления нового идентификатора или нет. Что улучшает обработку ошибок и позволяет проставить некоторые атрибуты лексем до контекстного анализа.<br />
Лексический анализатор, как правило, вызывается как подпрограмма. В результате обращения к ЛА вырабатываются как минимум два результата: тип выбранной лексемы и указатель на элемент таблицы или значение &#8211; для классов лексем (идентификаторов, чисел, строк и т.д.). Само значение передается, если ЛА не ведет таблицу литералов.<br />
Если ЛА реализован отдельным проходом, то он должен передавать сразу все лексемы программы. Например, через массив или файл. Если он возвращает по одной лексеме, то через параметры.<br />
В некоторых языках (например, ПЛ/1 или Фортран) ключевые слова могут использоваться в качестве обычных идентификаторов. В этом случае работа ЛА не может идти независимо от работы синтаксического анализатора, т.к. только окружающего контекста зависит, является ли лексема оператором или переменной.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/programmirovanie-leksicheskix-analizatorov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Лексический анализ</title>
		<link>http://www.studcode.ru/archiv/leksicheskij-analiz-3/</link>
		<comments>http://www.studcode.ru/archiv/leksicheskij-analiz-3/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 17:02:15 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=943</guid>
		<description><![CDATA[Лексический анализ
План
1.	Основная задача
2.	Классы лексем
3.	Построение анализатора
4.	Требования к таблице имен
5.	Структуры данных
6.	Реализация сканера
7.	Блок-схема
Основная задача лексического анализа – разбить входной текст, состоящий из последовательности одиночных символов, на последовательность слов, или лексем, т.е. выделить эти слова из непрерывной последовательности символов.
Все символы входной последовательности с этой точки зрения разделяются на символы, принадлежащие каким-либо лексемам, и символы, разделяющие лексемы (разделители). В некоторых [...]]]></description>
			<content:encoded><![CDATA[<p>Лексический анализ<br />
План<br />
1.	Основная задача<br />
2.	Классы лексем<br />
3.	Построение анализатора<br />
4.	Требования к таблице имен<br />
5.	Структуры данных<br />
6.	Реализация сканера<br />
7.	Блок-схема<br />
Основная задача лексического анализа – разбить входной текст, состоящий из последовательности одиночных символов, на последовательность слов, или лексем, т.е. выделить эти слова из непрерывной последовательности символов.<br />
Все символы входной последовательности с этой точки зрения разделяются на символы, принадлежащие каким-либо лексемам, и символы, разделяющие лексемы (разделители). В некоторых случаях между лексемами может  и не быть разделителей. С другой стороны, в некоторых языках лексемы могут содержать незначащие  символы (пробелы и комментарии). <span id="more-943"></span></p>
<h2>Классы лексем</h2>
<p>Обычно все  лексемы делятся на классы. Примерами таких классов являются:<br />
•	Служебные слова (одним типом или каждое служебное слово отдельным типом лексем, в который будет входить только одна лексема)<br />
•	Числа (целые, восьмеричные, шестнадцатиричные, действительные и т.д.),<br />
•	Идентификаторы,<br />
•	Строки.<br />
•	Другие литералы</p>
<h2>Построение анализатора</h2>
<p>Отдельно выделяются ключевые слова и символы пунктуации (иногда их называют символы-ограничители). Как правило, ключевые слова – это некоторое конечное подмножество идентификаторов. С точки зрения дальнейших фаз анализа лексический анализатор выдает информацию двух сортов:<br />
На вход лексическому анализатору подается<br />
•	Текст исходной программы;<br />
•	Список зарезервированных слов языка;<br />
•	Список служебных символов и символов разделителей.</p>
<p>На выходе лексического анализатор выдает:<br />
•	Последовательность классов лексем. (Ограничителей, ключевых слов, идентификаторов, литералов и т.д.)<br />
•	Таблица имен, содержащая уточняющую информацию для идентификаторов и возможно литералов.</p>
<p>В обязанность лексического анализатора так же входит игнорирование комментариев.<br />
Существует много способов построения лексического анализатора. Классическим является анализатор на основе автоматной модели и графа переходов. Достоинством такого подхода, является простота программы, но высокая сложность таблицы переходов. Такой подход рекомендуется при использовании  ассемблера.<br />
Мы будем рассматривать программный подход, в котором несколько усложняется программа, но нет необходимости строить и оптимизировать таблицы для автоматов.<br />
Лексический анализатор должен самостоятельно строить таблицы объектов (идентификаторов, строк, чисел и т.д.). В лексему помещается указатель на вход в соответствующую таблицу.</p>
<h3>Требования к таблице имен</h3>
<p>Таблица имен должна удовлетворять следующим требованиям<br />
•	Выполнять быстрый поиск;<br />
•	Быть динамически расширяемой;<br />
•	При обнаружении искомого имени возвращать адрес элемента таблицы;<br />
•	Добавлять новый элемент, если такого еще нет в таблице (когда разрешено);<br />
•	Хранить дополнительные атрибуты для контекстного анализа (например тип переменной, принадлежность ее области видимости);<br />
•	Иметь возможность хранить переменные достаточно большой длинны и при этом экономно использовать память. Иногда ограничения на длину переменной не вводят, но в идентификации участвуют только N первых символов.<br />
•	Возможно, иметь иерархическую структуру по областям видимости;<br />
•	Может быть, иметь несколько таблиц: для переменных, типов, имен подпрограмм, литералов и зарезервированных слов языка. Причем в последнюю добавлять конечно нельзя.</p>
<h2>Структуры данных</h2>
<p>Можно предложить следующую структуру данных для хранения лексемы</p>
<p>struct TTableMember{char *Name;<br />
TType Type;<br />
int FormalParams[10];<br />
int VisibleRegion;<br />
void *Value;<br />
};</p>
<p>enum TTableType{tVarName, tProcName, tLiteral};</p>
<p>enum TLextType{ltName, ltLiteral, ltIF, ltTHEN,<br />
ltELSE, ltWHILE, ltFOR, &#8230;};</p>
<p>struct TLexema{TLexType LexType;<br />
TTableType NameTable;<br />
int NinTable;<br />
};</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/leksicheskij-analiz-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Синтаксический анализ</title>
		<link>http://www.studcode.ru/archiv/sintaksicheskij-analiz/</link>
		<comments>http://www.studcode.ru/archiv/sintaksicheskij-analiz/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 08:21:44 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=941</guid>
		<description><![CDATA[Синтаксический анализ
Основная задача  синтаксического анализа – разбор структуры программы. Как правило, под структурой понимается дерево, соответствующее разбору в
контекстно-свободной  грамматике языка. В настоящее время чаще всего используется следующие виды анализа:
Рекурсивный спуск чаще используется при ручном программировании синтаксического анализатора
•	LL(1)-анализ (и  его вариант &#8211; рекурсивный спуск)
•	LR(1)-анализ и его  варианты (LR(0), SLR(1), LALR(1) и другие)., [...]]]></description>
			<content:encoded><![CDATA[<p>Синтаксический анализ<br />
Основная задача  синтаксического анализа – разбор структуры программы. Как правило, под структурой понимается дерево, соответствующее разбору в<br />
контекстно-свободной  грамматике языка. В настоящее время чаще всего используется следующие виды анализа:<br />
Рекурсивный спуск чаще используется при ручном программировании синтаксического анализатора<span id="more-941"></span><br />
•	LL(1)-анализ (и  его вариант &#8211; рекурсивный спуск)<br />
•	LR(1)-анализ и его  варианты (LR(0), SLR(1), LALR(1) и другие)., LR(1) &#8211; при использовании систем автоматизации построения синтаксических анализаторов.<br />
•	Анализ простого предшествования<br />
Результатом синтаксического  анализа является синтаксическое дерево со ссылками на таблицу имен. В процессе синтаксического анализа также  обнаруживаются ошибки,  связанные со структурой программы.<br />
Контекстный анализ<br />
На этапе  контекстного анализа  выявляются зависимости между частями программы,  которые не  могут быть описаны контекстно-свободным  синтаксисом. Это в основном связи &#8220;описание-использование&#8221;, в частности анализ типов объектов, анализ областей видимости, соответствие параметров, метки и другие.<br />
В процессе контекстного анализа строится таблица символов, которую можно рассматривать как таблицу имен, пополненную информацией об описаниях (свойствах) объектов. Основным формализмом, использующимся при контекстном анализе, являются атрибутные грамматики.<br />
Результатом работы фазы контекстного анализа является снабженное атрибутами дерево разбора программы или.<br />
Информация об объектах может быть, как рассредоточена в самом дереве, так и сосредоточена в отдельных таблицах символов. В процессе контекстного анализа также могут быть обнаружены ошибки, связанные с неправильным использованием объектов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/sintaksicheskij-analiz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Лексический анализ</title>
		<link>http://www.studcode.ru/archiv/leksicheskij-analiz-2/</link>
		<comments>http://www.studcode.ru/archiv/leksicheskij-analiz-2/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 11:13:49 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=938</guid>
		<description><![CDATA[Лексический анализ
На фазе лексического анализа (ЛА) входная  программа, представляющая собой  поток символов, разбивается на лексемы &#8211; слова в соответствии с определениями языка.  Основным формализмом, лежащим в основе реализации лексических анализаторов, являются конечные автоматы и регулярные выражения. Лексический анализатор может работать в двух основных режимах:
•	Как подпрограмма, вызываемая синтаксическим анализатором за очередной лексемой;
•	Как полный [...]]]></description>
			<content:encoded><![CDATA[<p>Лексический анализ<br />
На фазе лексического анализа (ЛА) входная  программа, представляющая собой  поток символов, разбивается на лексемы &#8211; слова в соответствии с определениями языка.  Основным формализмом, лежащим в основе реализации лексических анализаторов, являются конечные автоматы и регулярные выражения. Лексический анализатор может работать в двух основных режимах:<br />
•	Как подпрограмма, вызываемая синтаксическим анализатором за очередной лексемой;<span id="more-938"></span><br />
•	Как полный проход, результатом которого является файл лексем.</p>
<p>В процессе выделения лексем ЛА может, как самостоятельно строить таблицы имен и констант, так и выдавать значения для каждой лексемы при очередном обращении к нему. В этом случае таблица имен строится совместно в нескольких фазах (например, в лексическом анализе делается попытка добавить новое имя, а синтаксический анализ разрешает или отвергает попытку и присваивает лексеме некоторые атрибуты, которые уточняются контекстным анализатором).<br />
На этапе  ЛА обнаруживаются  некоторые (простейшие)  ошибки (недопустимые символы,     неправильная    запись    чисел, идентификаторов и др.).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/leksicheskij-analiz-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Генератор промежуточного кода</title>
		<link>http://www.studcode.ru/archiv/generator-promezhutochnogo-koda/</link>
		<comments>http://www.studcode.ru/archiv/generator-promezhutochnogo-koda/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 06:33:43 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=936</guid>
		<description><![CDATA[Генератор промежуточного кода
Затем программа может быть переведена во внутреннее представление. Это делается для целей оптимизации и/или удобства генерации кода. Еще одной целью преобразования программы во внутреннее представление является желание иметь переносимый компилятор. Тогда только последняя фаза (генерация кода) является машинно-зависимой. В качестве внутреннего представления может  использоваться префиксная или постфиксная запись, ориентированный граф, тройки, четверки [...]]]></description>
			<content:encoded><![CDATA[<p>Генератор промежуточного кода<br />
Затем программа может быть переведена во внутреннее представление. Это делается для целей оптимизации и/или удобства генерации кода. Еще одной целью преобразования программы во внутреннее представление является желание иметь переносимый компилятор. Тогда только последняя фаза (генерация кода) является машинно-зависимой. В качестве внутреннего представления может  использоваться префиксная или постфиксная запись, ориентированный граф, тройки, четверки и другое.<br />
Оптимизация<br />
Оптимизация призвана улучшить характеристики программы. Скажем, уменьшить длину объектного кода или увеличить быстродействие.<br />
Фаз оптимизации может быть несколько. Оптимизации  обычно делят на<br />
•	Машинно-зависимые.и машинно-независимые,<br />
•	Локальные и глобальные.</p>
<p>Часть машинно-зависимой оптимизации выполняется на фазе генерации  кода. Глобальная  оптимизация пытается принять во внимание структуру всей программы, локальная &#8211; только небольших ее  фрагментов. Глобальная оптимизация основывается на глобальном потоковом анализе, который выполняется на графе программы и представляет по существу преобразование этого графа. При  этом могут учитываться такие свойства программы, как межпроцедурный анализ, межмодульный анализ, анализ областей жизни переменных и т.д.<br />
Генерация кода<br />
Наконец, генерация кода – последняя фаза трансляции. Результатом ее является либо ассемблерный модуль, либо объектный (или  загрузочный) модуль. В процессе генерации кода могут выполняться некоторые локальные оптимизации, такие как распределение регистров, выбор длинных или коротких переходов, учет стоимости команд при выборе конкретной последовательности команд. Для генерации кода разработаны различные методы, такие как таблицы решений, сопоставление образцов, включающее динамическое программирование, различные синтаксические методы.<br />
Интерпретация<br />
Второй вариант вместо генерации объектного кода, выполнить иго пошаговую интерпретацию. Интерпретатор промежуточного кода работает намного быстрее интерпретатора исходной программы, к тому же прямая интерпретация большинства языков не возможна. Этот подход можно использовать при написании платформенно-независимых программ. Но скорость выполнения таких программ все же значительно ниже, чем объектного кода</p>
<p>Конечно, те или иные фазы транслятора могут либо отсутствовать совсем, либо объединяться. В простейшем случае однопроходного транслятора нет явной фазы генерации промежуточного представления и оптимизации, остальные  фазы объединены в одну, причем нет и явно построенного синтаксического дерева.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/generator-promezhutochnogo-koda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Лексический анализ</title>
		<link>http://www.studcode.ru/archiv/leksicheskij-analiz/</link>
		<comments>http://www.studcode.ru/archiv/leksicheskij-analiz/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 14:18:01 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=932</guid>
		<description><![CDATA[Лексический анализ
На фазе лексического анализа (ЛА) входная  программа, представляющая собой  поток символов, разбивается на лексемы &#8211; слова в соответствии с определениями языка.  Основным формализмом, лежащим в основе реализации лексических анализаторов, являются конечные автоматы и регулярные выражения. Лексический анализатор может работать в двух основных режимах:
•	Как подпрограмма, вызываемая синтаксическим анализатором за очередной лексемой;
•	Как полный [...]]]></description>
			<content:encoded><![CDATA[<p>Лексический анализ<br />
На фазе лексического анализа (ЛА) входная  программа, представляющая собой  поток символов, разбивается на лексемы &#8211; слова в соответствии с определениями языка.  Основным формализмом, лежащим в основе реализации лексических анализаторов, являются конечные автоматы и регулярные выражения. Лексический анализатор может работать в двух основных режимах:<br />
•	Как подпрограмма, вызываемая синтаксическим анализатором за очередной лексемой;<br />
•	Как полный проход, результатом которого является файл лексем.</p>
<p>В процессе выделения лексем ЛА может, как самостоятельно строить таблицы имен и констант, так и выдавать значения для каждой лексемы при очередном обращении к нему. В этом случае таблица имен строится совместно в нескольких фазах (например, в лексическом анализе делается попытка добавить новое имя, а синтаксический анализ разрешает или отвергает попытку и присваивает лексеме некоторые атрибуты, которые уточняются контекстным анализатором).<br />
На этапе  ЛА обнаруживаются  некоторые (простейшие)  ошибки (недопустимые символы,     неправильная    запись    чисел, идентификаторов и др.).<br />
Синтаксический анализ<br />
Основная задача  синтаксического анализа – разбор структуры программы. Как правило, под структурой понимается дерево, соответствующее разбору в<br />
контекстно-свободной  грамматике языка. В настоящее время чаще всего используется следующие виды анализа:<br />
Рекурсивный спуск чаще используется при ручном программировании синтаксического анализатора<br />
•	LL(1)-анализ (и  его вариант &#8211; рекурсивный спуск)<br />
•	LR(1)-анализ и его  варианты (LR(0), SLR(1), LALR(1) и другие)., LR(1) &#8211; при использовании систем автоматизации построения синтаксических анализаторов.<br />
•	Анализ простого предшествования<br />
Результатом синтаксического  анализа является синтаксическое дерево со ссылками на таблицу имен. В процессе синтаксического анализа также  обнаруживаются ошибки,  связанные со структурой программы.<br />
Контекстный анализ<br />
На этапе  контекстного анализа  выявляются зависимости между частями программы,  которые не  могут быть описаны контекстно-свободным  синтаксисом. Это в основном связи &#8220;описание-использование&#8221;, в частности анализ типов объектов, анализ областей видимости, соответствие параметров, метки и другие.<br />
В процессе контекстного анализа строится таблица символов, которую можно рассматривать как таблицу имен, пополненную информацией об описаниях (свойствах) объектов. Основным формализмом, использующимся при контекстном анализе, являются атрибутные грамматики.<br />
Результатом работы фазы контекстного анализа является снабженное атрибутами дерево разбора программы или.<br />
Информация об объектах может быть, как рассредоточена в самом дереве, так и сосредоточена в отдельных таблицах символов. В процессе контекстного анализа также могут быть обнаружены ошибки, связанные с неправильным использованием объектов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/leksicheskij-analiz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Структура транслятора</title>
		<link>http://www.studcode.ru/archiv/struktura-translyatora/</link>
		<comments>http://www.studcode.ru/archiv/struktura-translyatora/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 14:01:58 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Построение компиляторов]]></category>
		<category><![CDATA[ASM]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=926</guid>
		<description><![CDATA[Структура транслятора
1.	Примеры грамматик
2.	Структура компилятора
3.	Лексический анализ
4.	Синтаксический анализ
5.	Контекстный анализ
6.	Генерация промежуточного кода
7.	Оптимизация
8.	Генерация объектного кода
9.	Интерпретация промежуточного кода
Примеры грамматик
&#60;выражение&#62;::=	&#60;слагаемое&#62;&#124;&#60;выражение&#62;+&#60;слагаемое&#62;&#124;
&#60;выражение&#62;-&#60;слагаемое&#62;
&#60;слагаемое&#62;::=	&#60;множитель&#62;&#124;&#60;слагаемое&#62;*&#60;множитель&#62;&#124;
&#60;слагаемое&#62;/&#60;множитель&#62;
&#60;множитель&#62;::=	&#60;переменная&#62;&#124;&#60;число&#62;&#124;(&#60;выражение&#62;)
&#60;идентификатор&#62;::=	&#60;буква&#62;&#124;&#60;идентификатор&#62;&#60;буква&#62;&#124;
&#60;идентификатор&#62;&#60;цифра&#62;
&#60;число&#62;::=	&#60;натуральное число&#62;&#124;+&#60;натуральное число&#62;&#124;
-&#60;натуральное число&#62;
&#60;натуральное число&#62;::=&#60;цифра&#62;&#124;&#60;натуральное число&#62;&#60;цифра&#62;
&#60;буква&#62;::=A&#124;B&#124;C&#124;D&#124;E&#124;F&#124;G&#124;N&#124;I&#124;J&#124;K&#124;L&#124;M&#124;N&#124;O&#124;P&#124;Q&#124;R&#124;S&#124;T&#124;U&#124;V&#124;W&#124;X&#124;Y&#124;Z
&#60;цифра&#62;::=0&#124;1&#124;2&#124;3&#124;4&#124;5&#124;6&#124;7&#124;8&#124;9
]]></description>
			<content:encoded><![CDATA[<p>Структура транслятора</p>
<p>1.	Примеры грамматик<br />
2.	Структура компилятора<br />
3.	Лексический анализ<br />
4.	Синтаксический анализ<br />
5.	Контекстный анализ<br />
6.	Генерация промежуточного кода<br />
7.	Оптимизация<br />
8.	Генерация объектного кода<br />
9.	Интерпретация промежуточного кода<span id="more-926"></span><br />
Примеры грамматик<br />
&lt;выражение&gt;::=	&lt;слагаемое&gt;|&lt;выражение&gt;+&lt;слагаемое&gt;|<br />
&lt;выражение&gt;-&lt;слагаемое&gt;<br />
&lt;слагаемое&gt;::=	&lt;множитель&gt;|&lt;слагаемое&gt;*&lt;множитель&gt;|<br />
&lt;слагаемое&gt;/&lt;множитель&gt;<br />
&lt;множитель&gt;::=	&lt;переменная&gt;|&lt;число&gt;|(&lt;выражение&gt;)<br />
&lt;идентификатор&gt;::=	&lt;буква&gt;|&lt;идентификатор&gt;&lt;буква&gt;|<br />
&lt;идентификатор&gt;&lt;цифра&gt;<br />
&lt;число&gt;::=	&lt;натуральное число&gt;|+&lt;натуральное число&gt;|<br />
-&lt;натуральное число&gt;<br />
&lt;натуральное число&gt;::=&lt;цифра&gt;|&lt;натуральное число&gt;&lt;цифра&gt;<br />
&lt;буква&gt;::=A|B|C|D|E|F|G|N|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z<br />
&lt;цифра&gt;::=0|1|2|3|4|5|6|7|8|9</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/struktura-translyatora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

