<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://pascalabc.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Extremall</id>
	<title>Вики проекта PascalABC.NET - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://pascalabc.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Extremall"/>
	<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Extremall"/>
	<updated>2026-04-18T12:33:00Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B8%D0%BA_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8&amp;diff=2231</id>
		<title>Разбиение списка квадрик на базовые блоки</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B8%D0%BA_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8&amp;diff=2231"/>
		<updated>2011-11-17T11:02:41Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Последняя версия проекта. &lt;br /&gt;
&lt;br /&gt;
17.11.2011&lt;br /&gt;
&lt;br /&gt;
http://webfiles.ru/27010051&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2230</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2230"/>
		<updated>2011-11-17T11:00:29Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br\&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Собранный проект с последними изменениями - всем скачать]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://files.mail.ru/KA9Z5M Изменения с пары 27.10.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://webfile.ru/5659541 Компилятор, который строит синтаксическое дерево программы (язык Pascal) 10.11.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://dl.dropbox.com/u/18182279/MSS/dvel.7z Удаление мертвых переменных внутри базового блока 17.11.2011]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Разбиение списка квадрик на базовые блоки]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%BE%D0%BB%D0%B8_%D0%B2_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B5_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC_2011&amp;diff=2214</id>
		<title>Роли в проекте и задания разработчикам 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%BE%D0%BB%D0%B8_%D0%B2_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B5_%D0%B8_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC_2011&amp;diff=2214"/>
		<updated>2011-10-19T19:06:37Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Темченко А. А. Соловьев Л. В.&lt;br /&gt;
&lt;br /&gt;
1) парсер С&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Венцко А.З. Владыкин К.В. &lt;br /&gt;
&lt;br /&gt;
1) парсер языка Pascal&lt;br /&gt;
&lt;br /&gt;
2) алгоритм удаления мертвых переменных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Баштанова Д.С., Найденов С.Г.&lt;br /&gt;
&lt;br /&gt;
1) первичное описание классов синтаксического дерева&lt;br /&gt;
&lt;br /&gt;
2) Инфраструктура visitor'ов&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Науменко А.Е., Ксения П.&lt;br /&gt;
&lt;br /&gt;
1) Обработчики грамматики &lt;br /&gt;
&lt;br /&gt;
2) Разбиение на блоки&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пронин А., Бувайло О.&lt;br /&gt;
&lt;br /&gt;
1) Visitor для генерации трехадресного кода. Структура для трехадрессного кода.&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B8%D0%BA_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8&amp;diff=2213</id>
		<title>Разбиение списка квадрик на базовые блоки</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B8%D0%BA_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8&amp;diff=2213"/>
		<updated>2011-10-19T19:04:50Z</updated>

		<summary type="html">&lt;p&gt;Extremall: Новая: Не знаю, у кого сейчас последняя версия проекта, поэтому выкладываю отдельно.   http://webfile.ru/5614773&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Не знаю, у кого сейчас последняя версия проекта, поэтому выкладываю отдельно. &lt;br /&gt;
&lt;br /&gt;
http://webfile.ru/5614773&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2212</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2212"/>
		<updated>2011-10-19T19:02:44Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Первичное описание классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Собранный проект с последними изменениями - всем скачать]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Разбиение списка квадрик на базовые блоки]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_C_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2193</id>
		<title>Грамматика C + Код</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_C_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2193"/>
		<updated>2011-09-28T19:13:56Z</updated>

		<summary type="html">&lt;p&gt;Extremall: Новая: &amp;lt;source lang=&amp;quot;&amp;quot;&amp;gt; progr: { 		$$ = new Program(@$); 	} 	| progr OperatorSequence { 		for (int i = 0; i &amp;lt; $2.list.Count) 			$1.list.Add($2.list[i]); 		$$ = $1; 	} 	;   Operator: def { 		$$ ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
progr: {&lt;br /&gt;
		$$ = new Program(@$);&lt;br /&gt;
	}&lt;br /&gt;
	| progr OperatorSequence {&lt;br /&gt;
		for (int i = 0; i &amp;lt; $2.list.Count)&lt;br /&gt;
			$1.list.Add($2.list[i]);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
Operator: def {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	| assign {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	| if {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	| while {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	| OutPut&lt;br /&gt;
	| BOperator {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
BOperator: BEGIN OperatorSequense END {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
OperatorSequense: {&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
	}&lt;br /&gt;
	| Operatorsequense operator {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;		&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
def: ident varlist SEMICOLUMN{&lt;br /&gt;
		TipType type;&lt;br /&gt;
		if ($1 == &amp;quot;int&amp;quot;)&lt;br /&gt;
			type = TipType.IntType;&lt;br /&gt;
		else if ($1 == &amp;quot;double&amp;quot;)&lt;br /&gt;
			type = TipType.DoubleType;&lt;br /&gt;
		else if ($1 == &amp;quot;bool&amp;quot;)&lt;br /&gt;
			type = TipType.BoolType;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			// Error: unknown type&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new VarDef(@$, $2, type);&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
varlist: ident {&lt;br /&gt;
		if (GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($1, @1);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$$ = new List&amp;lt;Ident&amp;gt;();&lt;br /&gt;
		$$.Add(Id);&lt;br /&gt;
	}&lt;br /&gt;
	| varlist COMMA ident{&lt;br /&gt;
		if (GlobalStructures.isNameExists($3))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($3, @3);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$1.Add(Id);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
assgin: ident ASS expr SEMICOLUMN {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = GlobalStructures.getIdentByName($1);&lt;br /&gt;
		$$ = new Assign(Id, $3, @3);&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
expr 	&lt;br /&gt;
	: ident {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new Ident($1, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| INTNUM {&lt;br /&gt;
		int i = int.Parse($1);&lt;br /&gt;
		$$ = new IntConst(i, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| REALNUM {&lt;br /&gt;
		double d = double.Parse($1);&lt;br /&gt;
		$$ = new DoubleConst(d, @1);&lt;br /&gt;
	}&lt;br /&gt;
	| TRUE {&lt;br /&gt;
		$$ = new BoolConst(true, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| FALSE{&lt;br /&gt;
		$$ = new BoolConst(false, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| MINUS expr %prec UMINUS {&lt;br /&gt;
		if ($2.getType() != TipType.IntType &amp;amp;&amp;amp; $2.getType() != TipType.DoubleType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Minus, @2);&lt;br /&gt;
	}&lt;br /&gt;
	| LB expr RB {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	| expr PLUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Plus, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr MINUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Minus, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr MULT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Mult, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr DIVIDE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Divide, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr EQ expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Equal, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr NE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.NotEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr LT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Less, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr LE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.LessEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr GT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.More, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| expr GE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.MoreEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
  &lt;br /&gt;
if: IF LB expr RB operator elsepart {&lt;br /&gt;
		if ($3.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$=new If($3,$5,$6,@$);&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
 &lt;br /&gt;
elsepart: { $$ = null; }&lt;br /&gt;
	| operator {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
while: WHILE LB expr RB operator {&lt;br /&gt;
		if ($3.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new While($3, $5, @$);&lt;br /&gt;
	}&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2192</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2192"/>
		<updated>2011-09-28T19:13:21Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
Первичное описание классов синтаксического дерева 24.09.11 [http://files.mail.ru/47O3R5]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика C + Код]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_Pascal_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2191</id>
		<title>Грамматика Pascal + Код</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_Pascal_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2191"/>
		<updated>2011-09-28T19:12:55Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;&amp;quot;&amp;gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {&lt;br /&gt;
		$$ = new Program(@$);&lt;br /&gt;
	}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
		foreach (Operator oper in $3.list)&lt;br /&gt;
			$$.list.Add(oper);&lt;br /&gt;
	}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs {&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	|defss defs {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {&lt;br /&gt;
		TipType type;&lt;br /&gt;
		if ($4 == &amp;quot;int&amp;quot;)&lt;br /&gt;
			type = TipType.IntType;&lt;br /&gt;
		else if ($4 == &amp;quot;double&amp;quot;)&lt;br /&gt;
			type = TipType.DoubleType;&lt;br /&gt;
		else if ($4 == &amp;quot;bool&amp;quot;)&lt;br /&gt;
			type = TipType.BoolType;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			// Error: unknown type&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new VarDef(@$, $2, type);&lt;br /&gt;
	}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident: ID {&lt;br /&gt;
		if (GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($1, @1);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$$ = new List&amp;lt;Ident&amp;gt;();&lt;br /&gt;
		$$.Add(Id);&lt;br /&gt;
	}	&lt;br /&gt;
    |ident COLUMN ID {&lt;br /&gt;
		if (GlobalStructures.isNameExists($3))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($3, @3);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$1.Add(Id);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator : operator {&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| listoperator SEMICOLUMN operator {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {&lt;br /&gt;
		$$ = &amp;quot;double&amp;quot;;&lt;br /&gt;
	} &lt;br /&gt;
	| kINTEGER {&lt;br /&gt;
		$$ = &amp;quot;int&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	| ID ASSIGN expr {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = GlobalStructures.getIdentByName($1);&lt;br /&gt;
		$$ = new Assign(Id, $3, @3);&lt;br /&gt;
	}&lt;br /&gt;
	| kWHILE expr kDO operator {&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new While($2, $4, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$=new If($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN listoperator kEND {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {&lt;br /&gt;
		$$ = null;&lt;br /&gt;
	}&lt;br /&gt;
	| kELSE operator {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {&lt;br /&gt;
		// Не понятно, зачем нам нужен список выражений. Реализую, на всякий случай, в виде списка, но класса под это не создавали.&lt;br /&gt;
		$$ = new List&amp;lt;Expression&amp;gt;();&lt;br /&gt;
		$$.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| exprlist COLUMN expr {&lt;br /&gt;
		$1.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr: INTNUM {&lt;br /&gt;
		int i = int.Parse($1);&lt;br /&gt;
		$$ = new IntConst(i, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | REALNUM {&lt;br /&gt;
		double d = double.Parse($1);&lt;br /&gt;
		$$ = new DoubleConst(d, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | STRINGLITERAL {&lt;br /&gt;
		// Нет у нас таких!!!&lt;br /&gt;
	}&lt;br /&gt;
    | ID {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new Ident($1, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | expr PLUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Plus, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr MINUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Minus, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr MULT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Mult, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr DIVIDE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Divide, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr DIV expr {&lt;br /&gt;
		// Не поддерживается!&lt;br /&gt;
	}&lt;br /&gt;
    | expr MOD expr {&lt;br /&gt;
		// Не поддерживается!&lt;br /&gt;
	}&lt;br /&gt;
    | expr AND expr {&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.And, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr OR expr {&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Or, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr LT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Less, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr GT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.More, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr LE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.LessEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr GE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.MoreEqual, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | expr EQ expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Equal, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | expr NE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.NotEqual, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | NOT expr {&lt;br /&gt;
		if ($2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Not, @2);&lt;br /&gt;
	}&lt;br /&gt;
    | MINUS expr %prec UMINUS {&lt;br /&gt;
		if ($2.getType() != TipType.IntType &amp;amp;&amp;amp; $2.getType() != TipType.DoubleType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Minus, @2);&lt;br /&gt;
	} &lt;br /&gt;
    | LPAREN expr RPAREN {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_Pascal_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2190</id>
		<title>Грамматика Pascal + Код</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_Pascal_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2190"/>
		<updated>2011-09-28T19:12:36Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:Extremall|Extremall]] 19:12, 28 сентября 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;&amp;quot;&amp;gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {&lt;br /&gt;
		$$ = new Program(@$);&lt;br /&gt;
	}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
		foreach (Operator oper in $3.list)&lt;br /&gt;
			$$.list.Add(oper);&lt;br /&gt;
	}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs {&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	|defss defs {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {&lt;br /&gt;
		TipType type;&lt;br /&gt;
		if ($4 == &amp;quot;int&amp;quot;)&lt;br /&gt;
			type = TipType.IntType;&lt;br /&gt;
		else if ($4 == &amp;quot;double&amp;quot;)&lt;br /&gt;
			type = TipType.DoubleType;&lt;br /&gt;
		else if ($4 == &amp;quot;bool&amp;quot;)&lt;br /&gt;
			type = TipType.BoolType;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			// Error: unknown type&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new VarDef(@$, $2, type);&lt;br /&gt;
	}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident: ID {&lt;br /&gt;
		if (GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($1, @1);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$$ = new List&amp;lt;Ident&amp;gt;();&lt;br /&gt;
		$$.Add(Id);&lt;br /&gt;
	}	&lt;br /&gt;
    |ident COLUMN ID {&lt;br /&gt;
		if (GlobalStructures.isNameExists($3))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($3, @3);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$1.Add(Id);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator : operator {&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| listoperator SEMICOLUMN operator {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {&lt;br /&gt;
		$$ = &amp;quot;double&amp;quot;;&lt;br /&gt;
	} &lt;br /&gt;
	| kINTEGER {&lt;br /&gt;
		$$ = &amp;quot;int&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	| ID ASSIGN expr {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = GlobalStructures.getIdentByName($1);&lt;br /&gt;
		$$ = new Assign(Id, $3, @3);&lt;br /&gt;
	}&lt;br /&gt;
	| kWHILE expr kDO operator {&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new While($2, $4, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$=new If($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN listoperator kEND {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {&lt;br /&gt;
		$$ = null;&lt;br /&gt;
	}&lt;br /&gt;
	| kELSE operator {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {&lt;br /&gt;
		// Не понятно, зачем нам нужен список выражений. Реализую, на всякий случай, в виде списка, но класса под это не создавали.&lt;br /&gt;
		$$ = new List&amp;lt;Expression&amp;gt;();&lt;br /&gt;
		$$.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| exprlist COLUMN expr {&lt;br /&gt;
		$1.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr: INTNUM {&lt;br /&gt;
		int i = int.Parse($1);&lt;br /&gt;
		$$ = new IntConst(i, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | REALNUM {&lt;br /&gt;
		double d = double.Parse($1);&lt;br /&gt;
		$$ = new DoubleConst(d, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | STRINGLITERAL {&lt;br /&gt;
		// Нет у нас таких!!!&lt;br /&gt;
	}&lt;br /&gt;
    | ID {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new Ident($1, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | expr PLUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Plus, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr MINUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Minus, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr MULT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Mult, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr DIVIDE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Divide, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr DIV expr {&lt;br /&gt;
		// Не поддерживается!&lt;br /&gt;
	}&lt;br /&gt;
    | expr MOD expr {&lt;br /&gt;
		// Не поддерживается!&lt;br /&gt;
	}&lt;br /&gt;
    | expr AND expr {&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.And, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr OR expr {&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Or, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr LT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Less, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr GT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.More, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr LE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.LessEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr GE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.MoreEqual, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | expr EQ expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Equal, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | expr NE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.NotEqual, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | NOT expr {&lt;br /&gt;
		if ($2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Not, @2);&lt;br /&gt;
	}&lt;br /&gt;
    | MINUS expr %prec UMINUS {&lt;br /&gt;
		if ($2.getType() != TipType.IntType &amp;amp;&amp;amp; $2.getType() != TipType.DoubleType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Minus, @2);&lt;br /&gt;
	} &lt;br /&gt;
    | LPAREN expr RPAREN {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_Pascal_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2189</id>
		<title>Грамматика Pascal + Код</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_Pascal_%2B_%D0%9A%D0%BE%D0%B4&amp;diff=2189"/>
		<updated>2011-09-28T19:11:56Z</updated>

		<summary type="html">&lt;p&gt;Extremall: Новая: &amp;lt;source lang=&amp;quot;&amp;quot;&amp;gt;%{     Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;(); %} %union {  	 public int iVal;  	 public double dVal;           public string sVal;           pu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;&amp;quot;&amp;gt;%{&lt;br /&gt;
    Dictionary&amp;lt;string,double&amp;gt; vars = new Dictionary&amp;lt;string,double&amp;gt;();&lt;br /&gt;
%}&lt;br /&gt;
%union { &lt;br /&gt;
	 public int iVal; &lt;br /&gt;
	 public double dVal; &lt;br /&gt;
         public string sVal; &lt;br /&gt;
         public ExprNode eVal;&lt;br /&gt;
         public List&amp;lt;ExprNode&amp;gt; elVal;&lt;br /&gt;
         public TreeNode tVal;&lt;br /&gt;
         public BlockNode lVal;&lt;br /&gt;
         public List&amp;lt;string&amp;gt; lsVal;&lt;br /&gt;
	 public GreatType dtVal;&lt;br /&gt;
       }&lt;br /&gt;
%output=PascalYacc.cs &lt;br /&gt;
%using System.IO&lt;br /&gt;
%using Syntax_node_tree&lt;br /&gt;
%namespace LexScanner&lt;br /&gt;
%start progr&lt;br /&gt;
&lt;br /&gt;
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR&lt;br /&gt;
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON POINT  &lt;br /&gt;
%token PLUS MINUS MULT DIVIDE &lt;br /&gt;
%token AND OR NOT LT GT EQ NE LE GE DIV MOD&lt;br /&gt;
%token &amp;lt;iVal&amp;gt; INTNUM &lt;br /&gt;
%token &amp;lt;dVal&amp;gt; REALNUM &lt;br /&gt;
%token &amp;lt;sVal&amp;gt; STRINGLITERAL&lt;br /&gt;
%token &amp;lt;sVal&amp;gt; ID&lt;br /&gt;
%token &amp;lt;dtVal&amp;gt; kREAL kINTEGER &lt;br /&gt;
&lt;br /&gt;
%type &amp;lt;eVal&amp;gt; expr&lt;br /&gt;
%type &amp;lt;tVal&amp;gt; operator elsepart&lt;br /&gt;
%type &amp;lt;lVal&amp;gt; listoperator progr &lt;br /&gt;
%type &amp;lt;lsVal&amp;gt; ident &lt;br /&gt;
%type &amp;lt;elVal&amp;gt; exprlist &lt;br /&gt;
%type &amp;lt;dtVal&amp;gt; ktype kSimpleType&lt;br /&gt;
&lt;br /&gt;
%left LT GT LE GE EQ NE&lt;br /&gt;
%left MINUS PLUS OR&lt;br /&gt;
%left MULT DIVIDE AND DIV MOD&lt;br /&gt;
%left UMINUS NOT&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
progr   : {&lt;br /&gt;
		$$ = new Program(@$);&lt;br /&gt;
	}&lt;br /&gt;
	| defss kBEGIN listoperator kEND {&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
		foreach (Operator oper in $3.list)&lt;br /&gt;
			$$.list.Add(oper);&lt;br /&gt;
	}&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD TEXT!!!&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	} &lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
defss : defs {&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	|defss defs {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	|&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
defs : kVAR ident COLON ktype SEMICOLUMN {&lt;br /&gt;
		TipType type;&lt;br /&gt;
		if ($4 == &amp;quot;int&amp;quot;)&lt;br /&gt;
			type = TipType.IntType;&lt;br /&gt;
		else if ($4 == &amp;quot;double&amp;quot;)&lt;br /&gt;
			type = TipType.DoubleType;&lt;br /&gt;
		else if ($4 == &amp;quot;bool&amp;quot;)&lt;br /&gt;
			type = TipType.BoolType;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			// Error: unknown type&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new VarDef(@$, $2, type);&lt;br /&gt;
	}&lt;br /&gt;
	;	&lt;br /&gt;
&lt;br /&gt;
ident: ID {&lt;br /&gt;
		if (GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($1, @1);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$$ = new List&amp;lt;Ident&amp;gt;();&lt;br /&gt;
		$$.Add(Id);&lt;br /&gt;
	}	&lt;br /&gt;
    |ident COLUMN ID {&lt;br /&gt;
		if (GlobalStructures.isNameExists($3))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: this name is already used&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = new Ident($3, @3);&lt;br /&gt;
		listVars.Add(Id);&lt;br /&gt;
		$1.Add(Id);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
	&lt;br /&gt;
listoperator : operator {&lt;br /&gt;
		$$ = new BlockOperator(@$);&lt;br /&gt;
		$$.list.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| listoperator SEMICOLUMN operator {&lt;br /&gt;
		$1.list.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
ktype : kSimpleType&lt;br /&gt;
	| error &lt;br /&gt;
	{ &lt;br /&gt;
		System.Console.WriteLine(&amp;quot;BAD GREATE TYPE&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
kSimpleType : kREAL {&lt;br /&gt;
		$$ = &amp;quot;double&amp;quot;;&lt;br /&gt;
	} &lt;br /&gt;
	| kINTEGER {&lt;br /&gt;
		$$ = &amp;quot;int&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
operator: {&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	| ID ASSIGN expr {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		Ident Id = GlobalStructures.getIdentByName($1);&lt;br /&gt;
		$$ = new Assign(Id, $3, @3);&lt;br /&gt;
	}&lt;br /&gt;
	| kWHILE expr kDO operator {&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new While($2, $4, @$);&lt;br /&gt;
	}&lt;br /&gt;
	| kIF expr kTHEN operator elsepart {&lt;br /&gt;
		if ($2.getType()!=TypType.Boolean)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Условие должно иметь логический тип&lt;br /&gt;
		}&lt;br /&gt;
		$$=new If($2,$4,$5,@$);&lt;br /&gt;
	}&lt;br /&gt;
	| kBEGIN listoperator kEND {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
elsepart: {&lt;br /&gt;
		$$ = null;&lt;br /&gt;
	}&lt;br /&gt;
	| kELSE operator {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
exprlist : expr {&lt;br /&gt;
		// Не понятно, зачем нам нужен список выражений. Реализую, на всякий случай, в виде списка, но класса под это не создавали.&lt;br /&gt;
		$$ = new List&amp;lt;Expression&amp;gt;();&lt;br /&gt;
		$$.Add($1);&lt;br /&gt;
	}&lt;br /&gt;
	| exprlist COLUMN expr {&lt;br /&gt;
		$1.Add($2);&lt;br /&gt;
		$$ = $1;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
expr: INTNUM {&lt;br /&gt;
		int i = int.Parse($1);&lt;br /&gt;
		$$ = new IntConst(i, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | REALNUM {&lt;br /&gt;
		double d = double.Parse($1);&lt;br /&gt;
		$$ = new DoubleConst(d, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | STRINGLITERAL {&lt;br /&gt;
		// Нет у нас таких!!!&lt;br /&gt;
	}&lt;br /&gt;
    | ID {&lt;br /&gt;
		if (!GlobalStructures.isNameExists($1))&lt;br /&gt;
		{&lt;br /&gt;
			// Error: Undeclarated identifier&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new Ident($1, @1);&lt;br /&gt;
	}&lt;br /&gt;
    | expr PLUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Plus, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr MINUS expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Minus, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr MULT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Mult, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr DIVIDE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Divide, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr DIV expr {&lt;br /&gt;
		// Не поддерживается!&lt;br /&gt;
	}&lt;br /&gt;
    | expr MOD expr {&lt;br /&gt;
		// Не поддерживается!&lt;br /&gt;
	}&lt;br /&gt;
    | expr AND expr {&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.And, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr OR expr {&lt;br /&gt;
		if ($1.getType() != TipType.BoolType || $2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: only for bool types&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Or, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr LT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Less, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr GT expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.More, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr LE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.LessEqual, @$);&lt;br /&gt;
	}&lt;br /&gt;
    | expr GE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.MoreEqual, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | expr EQ expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.Equal, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | expr NE expr {&lt;br /&gt;
		$$ = new BinExpression($1, $3, Op.NotEqual, @$);		&lt;br /&gt;
	}&lt;br /&gt;
    | NOT expr {&lt;br /&gt;
		if ($2.getType() != TipType.BoolType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Not, @2);&lt;br /&gt;
	}&lt;br /&gt;
    | MINUS expr %prec UMINUS {&lt;br /&gt;
		if ($2.getType() != TipType.IntType &amp;amp;&amp;amp; $2.getType() != TipType.DoubleType)&lt;br /&gt;
		{&lt;br /&gt;
			// Error: type is wrong.&lt;br /&gt;
		}&lt;br /&gt;
		$$ = new UnarExpression($2, Op.Minus, @2);&lt;br /&gt;
	} &lt;br /&gt;
    | LPAREN expr RPAREN {&lt;br /&gt;
		$$ = $2;&lt;br /&gt;
	}&lt;br /&gt;
	;&lt;br /&gt;
&lt;br /&gt;
%%&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
	<entry>
		<id>https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2188</id>
		<title>МПОК 2011</title>
		<link rel="alternate" type="text/html" href="https://pascalabc.net/wiki/index.php?title=%D0%9C%D0%9F%D0%9E%D0%9A_2011&amp;diff=2188"/>
		<updated>2011-09-28T19:07:53Z</updated>

		<summary type="html">&lt;p&gt;Extremall: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Роли в проекте и задания разработчикам 2011]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка Pascal]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика языка С]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Диаграмма классов синтаксического дерева]]&amp;lt;br&amp;gt;&lt;br /&gt;
Первичное описание классов синтаксического дерева 24.09.11 [http://files.mail.ru/47O3R5]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Грамматика Pascal + Код]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Extremall</name></author>
	</entry>
</feed>