{"id":191766,"date":"2013-08-28T23:17:03","date_gmt":"2013-08-28T19:17:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=191766"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=191766","title":{"rendered":"<span class=\"post_title\">\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MiniJava<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u041a\u0430\u043a \u0432 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0441\u0440\u043e\u043a\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MiniJava \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 .NET Framework.<\/p>\n<p>  \u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438. \u041d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MiniJava. \u0412\u044b\u0445\u043e\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f PE-\u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043e\u0439 CLR.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/f2d\/586\/b08\/f2d586b08de0b7f9e8be9b5c26d3897c.png\"\/><\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u042f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MiniJava<\/h4>\n<p>  MiniJava \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Java. \u041d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a, \u043f\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>System.out.println(...)<\/code>; \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>e.length<\/code> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c <code>int[]<\/code>.<br \/>  \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0435 \u0411\u0435\u043a\u0443\u0441\u0430-\u041d\u0430\u0443\u0440\u0430 (\u0432\u0437\u044f\u0442\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f\u0437\u044b\u043a\u0430 <a href=\"http:\/\/www.cambridge.org\/us\/features\/052182060X\/\">http:\/\/www.cambridge.org\/us\/features\/052182060X\/<\/a>):<\/p>\n<pre><code class=\"java\">Goal ::= MainClass ( ClassDeclaration )* &lt;EOF&gt; MainClass ::= &quot;class&quot; Identifier &quot;{&quot; &quot;public&quot; &quot;static&quot; &quot;void&quot; &quot;main&quot; &quot;(&quot; &quot;String&quot; &quot;[&quot; &quot;]&quot; Identifier &quot;)&quot; &quot;{&quot; Statement &quot;}&quot; &quot;}&quot; ClassDeclaration ::= &quot;class&quot; Identifier ( &quot;extends&quot; Identifier )? &quot;{&quot; ( VarDeclaration )* ( MethodDeclaration )* &quot;}&quot; VarDeclaration ::= Type Identifier &quot;;&quot; MethodDeclaration ::= &quot;public&quot; Type Identifier &quot;(&quot; ( Type Identifier ( &quot;,&quot; Type Identifier )* )? &quot;)&quot; &quot;{&quot; ( VarDeclaration )* ( Statement )* &quot;return&quot; Expression &quot;;&quot; &quot;}&quot; Type ::= &quot;int&quot; &quot;[&quot; &quot;]&quot; \t| &quot;boolean&quot; \t| &quot;int&quot; \t| Identifier Statement ::= &quot;{&quot; ( Statement )* &quot;}&quot; \t| &quot;if&quot; &quot;(&quot; Expression &quot;)&quot; Statement &quot;else&quot; Statement \t| &quot;while&quot; &quot;(&quot; Expression &quot;)&quot; Statement \t| &quot;System.out.println&quot; &quot;(&quot; Expression &quot;)&quot; &quot;;&quot; \t| Identifier &quot;=&quot; Expression &quot;;&quot; \t| Identifier &quot;[&quot; Expression &quot;]&quot; &quot;=&quot; Expression &quot;;&quot; Expression ::= Expression ( &quot;&&&quot; | &quot;&lt;&quot; | &quot;+&quot; | &quot;-&quot; | &quot;*&quot; ) Expression \t| Expression &quot;[&quot; Expression &quot;]&quot; \t| Expression &quot;.&quot; &quot;length&quot; \t| Expression &quot;.&quot; Identifier &quot;(&quot; ( Expression ( &quot;,&quot; Expression )* )? &quot;)&quot; \t| &lt;INTEGER_LITERAL&gt; \t| &quot;true&quot; \t| &quot;false&quot; \t| Identifier \t| &quot;this&quot; \t| &quot;new&quot; &quot;int&quot; &quot;[&quot; Expression &quot;]&quot; \t| &quot;new&quot; Identifier &quot;(&quot; &quot;)&quot; \t| &quot;!&quot; Expression \t| &quot;(&quot; Expression &quot;)&quot; Identifier ::= &lt;IDENTIFIER&gt; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u044f\u0437\u044b\u043a\u0430.<br \/>  \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u2013 \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438. \u041d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u2013 \u044d\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u044b\u0432\u043e\u0434\u0430, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0449\u0435\u0435 \u0435\u0433\u043e \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0437 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u0438\/\u0438\u043b\u0438 \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432, \u0442.\u0435. \u03b1\u2192\u03b2, \u0433\u0434\u0435 \u03b1\u2208V,\u03b2\u2208(N\u222aV)*. N \u2013 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432, V \u2013 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432.<br \/>  \u0412\u0441\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0434\u0432\u043e\u0439\u043d\u044b\u0445 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445, \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b \u2013 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445. \u0410\u043a\u0441\u0438\u043e\u043c\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u2013 \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b <code>Goal<\/code>.<br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (\u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 IL-\u043a\u043e\u0434\u0430) \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b <a href=\"http:\/\/www.cambridge.org\/us\/features\/052182060X\/programs\/factorial.java\">factorial.java<\/a>, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0435\u0439 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b, \u0432\u0437\u044f\u0442\u043e\u0439 \u0441 \u0441\u0430\u0439\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 MiniJava:<\/p>\n<pre><code class=\"java\">class Factorial{ \t\tpublic static void main(String[] a){ \t\tSystem.out.println(new Fac().ComputeFac(10));     } }  class Fac {      public int ComputeFac(int num){ \t\tint num_aux ; \t\tif (num &lt; 1) \t\t\tnum_aux = 1 ; \t\telse  \t\t\tnum_aux = num * (this.ComputeFac(num-1)) ; \t\treturn num_aux ;     }  } <\/code><\/pre>\n<h4>\u041b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437<\/h4>\n<p>  \u042d\u0442\u0438 \u0434\u0432\u0435 \u0444\u0430\u0437\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043b \u0432\u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432. \u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <a href=\"http:\/\/www.antlr.org\/\">ANTLR<\/a>, <a href=\"http:\/\/gppg.codeplex.com\/\">GPPG<\/a>, <a href=\"http:\/\/www.ssw.uni-linz.ac.at\/coco\/\">Coco\/R<\/a>, <a href=\"http:\/\/www.goldparser.org\/\">GOLD Parsing System<\/a> \u0438 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Comparison_of_parser_generators\">\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445<\/a>.<br \/>  \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b ANTLR, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0438\u043c\u0435\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 (\u0441\u0440\u0435\u0434\u0430 ANTLRWorks 1.4.3, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0443\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f 2.0 <a href=\"http:\/\/tunnelvisionlabs.com\/products\/demo\/antlrworks\">http:\/\/tunnelvisionlabs.com\/products\/demo\/antlrworks<\/a>).<br \/>  \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (Abstract Syntax Tree, AST), \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435.<br \/>  \u0418\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0435 \u0411\u0435\u043a\u0443\u0441\u0430-\u041d\u0430\u0443\u0440\u0430 \u044f \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0444\u0430\u0439\u043b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 ANTLR. \u041f\u0440\u0438\u0432\u0435\u0434\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u043a LL-\u0432\u0438\u0434\u0443, \u0443\u0434\u0430\u043b\u0438\u0432 \u043b\u0435\u0432\u0443\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438 \u0432\u043f\u0438\u0441\u0430\u0432 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u043d\u0430 C#, \u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 (\u0444\u0430\u0439\u043b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 MiniJava.g \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u043d\u0430 \u043d\u0438\u0436\u0435). <br \/>  \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cs\">mainClassDecl returns [NonTerm value] \t: \t\tCLASS^ id=ID LCURLY! \t\t\tPUBLIC! STATIC! VOID! MAIN! LPAREN! \t\t\t\tSTRING! LBRACK! RBRACK! ID \t\t\tRPAREN! \t\t\tLCURLY! statement=stmtList RCURLY! \t\tRCURLY! \t\t{  \t\t\t$value = NonTerm.CreateMainClassDecl(new Token(TokenType.ID, id.Text, id), statement.valueList); \t\t\tif (flagDebug) Console.WriteLine(&quot;mainClassDecl&quot;); \t\t} \t; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c mainClassDecl \u2013 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0435 \u0437\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"java\">MainClass ::= &quot;class&quot; Identifier &quot;{&quot; &quot;public&quot; &quot;static&quot; &quot;void&quot; &quot;main&quot; &quot;(&quot; &quot;String&quot; &quot;[&quot; &quot;]&quot; Identifier &quot;)&quot; &quot;{&quot; Statement &quot;}&quot; &quot;}&quot; <\/code><\/pre>\n<p>  \u0417\u043d\u0430\u043a &quot;^&quot; \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d <code>CLASS<\/code> \u043a\u043e\u0440\u043d\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0437\u043d\u0430\u043a &quot;!&quot; \u043f\u043e\u0441\u043b\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 ANTLR, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 (\u0442.\u0435. \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 AST). \u0422\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>ID<\/code> \u0438 \u0441\u043f\u0438\u0441\u043e\u043a <code>stmtList<\/code>), \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c (<code>id<\/code> \u0438 <code>statement<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e). \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435, \u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u2013 \u0432 \u043d\u0438\u0436\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435. <code>$value<\/code> \u2013 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443. \u0422\u0438\u043f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>returns<\/code> (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <code>NonTerm<\/code>).<br \/>  \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 ANTLR \u0434\u043b\u044f .NET (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c antlr-dotnet-tool-3.3.1.7705):<\/p>\n<p>  <code> Antlr3.exe -o &quot;\u043f\u0443\u0442\u044c_\u0434\u043e_\u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439_\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438&quot; &quot;\u043f\u0443\u0442\u044c_\u0434\u043e_\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438_\u0441_\u0444\u0430\u0439\u043b\u043e\u043c_\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438\\MiniJava.g&quot; <\/code><\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 (\u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430):  <\/p>\n<ul>\n<li>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0442\u0438\u043f <code>double<\/code>;<\/li>\n<li>\u043f\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u044c<code> printf(\u2026)<\/code> \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0443 <code>System.out.println(\u2026)<\/code>;<\/li>\n<li>\u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>Console.Readkey()<\/code> (\u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438).<\/li>\n<\/ul>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 xml-\u0444\u0430\u0439\u043b\u0430.<br \/>  \u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043b\u0435\u043a\u0441\u0438\u0447\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Lexer<\/code>.  <\/p>\n<pre><code class=\"cs\">public void SaveToFile(string fileName) {     List&lt;IToken&gt; tokens = TokenStream.GetTokens();      XElement xElement = new XElement(&quot;Lexer&quot;,          from token in tokens         select new XElement(&quot;Token&quot;,             new XAttribute(&quot;Text&quot;, token.Text.TokenToString()),                 new XAttribute(&quot;TokenIndex&quot;, token.TokenIndex),                 new XAttribute(&quot;Type&quot;, token.Type),                 new XAttribute(&quot;Line&quot;, token.Line),                 new XAttribute(&quot;CharPositionInLine&quot;, token.CharPositionInLine),                 new XAttribute(&quot;StartIndex&quot;, token.StartIndex),                 new XAttribute(&quot;StopIndex&quot;, token.StopIndex)            )         );      xElement.Save(fileName); } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u2013 152 \u0442\u043e\u043a\u0435\u043d\u0430 (\u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0435\u0440\u0432\u044b\u0435 30):  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0442\u043e\u043a \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;Lexer&gt;   &lt;Token Text=&quot;class&quot; TokenIndex=&quot;0&quot; Type=&quot;8&quot; Line=&quot;1&quot; CharPositionInLine=&quot;0&quot; StartIndex=&quot;0&quot; StopIndex=&quot;4&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;1&quot; Type=&quot;74&quot; Line=&quot;1&quot; CharPositionInLine=&quot;5&quot; StartIndex=&quot;5&quot; StopIndex=&quot;5&quot; \/&gt;   &lt;Token Text=&quot;Factorial&quot; TokenIndex=&quot;2&quot; Type=&quot;26&quot; Line=&quot;1&quot; CharPositionInLine=&quot;6&quot; StartIndex=&quot;6&quot; StopIndex=&quot;14&quot; \/&gt;   &lt;Token Text=&quot;{&quot; TokenIndex=&quot;3&quot; Type=&quot;32&quot; Line=&quot;1&quot; CharPositionInLine=&quot;15&quot; StartIndex=&quot;15&quot; StopIndex=&quot;15&quot; \/&gt;   &lt;Token Text=&quot;\\n&quot; TokenIndex=&quot;4&quot; Type=&quot;74&quot; Line=&quot;1&quot; CharPositionInLine=&quot;16&quot; StartIndex=&quot;16&quot; StopIndex=&quot;16&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;5&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;0&quot; StartIndex=&quot;17&quot; StopIndex=&quot;17&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;6&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;1&quot; StartIndex=&quot;18&quot; StopIndex=&quot;18&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;7&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;2&quot; StartIndex=&quot;19&quot; StopIndex=&quot;19&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;8&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;3&quot; StartIndex=&quot;20&quot; StopIndex=&quot;20&quot; \/&gt;   &lt;Token Text=&quot;public&quot; TokenIndex=&quot;9&quot; Type=&quot;56&quot; Line=&quot;2&quot; CharPositionInLine=&quot;4&quot; StartIndex=&quot;21&quot; StopIndex=&quot;26&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;10&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;10&quot; StartIndex=&quot;27&quot; StopIndex=&quot;27&quot; \/&gt;   &lt;Token Text=&quot;static&quot; TokenIndex=&quot;11&quot; Type=&quot;64&quot; Line=&quot;2&quot; CharPositionInLine=&quot;11&quot; StartIndex=&quot;28&quot; StopIndex=&quot;33&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;12&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;17&quot; StartIndex=&quot;34&quot; StopIndex=&quot;34&quot; \/&gt;   &lt;Token Text=&quot;void&quot; TokenIndex=&quot;13&quot; Type=&quot;72&quot; Line=&quot;2&quot; CharPositionInLine=&quot;18&quot; StartIndex=&quot;35&quot; StopIndex=&quot;38&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;14&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;22&quot; StartIndex=&quot;39&quot; StopIndex=&quot;39&quot; \/&gt;   &lt;Token Text=&quot;main&quot; TokenIndex=&quot;15&quot; Type=&quot;41&quot; Line=&quot;2&quot; CharPositionInLine=&quot;23&quot; StartIndex=&quot;40&quot; StopIndex=&quot;43&quot; \/&gt;   &lt;Token Text=&quot;(&quot; TokenIndex=&quot;16&quot; Type=&quot;40&quot; Line=&quot;2&quot; CharPositionInLine=&quot;27&quot; StartIndex=&quot;44&quot; StopIndex=&quot;44&quot; \/&gt;   &lt;Token Text=&quot;String&quot; TokenIndex=&quot;17&quot; Type=&quot;66&quot; Line=&quot;2&quot; CharPositionInLine=&quot;28&quot; StartIndex=&quot;45&quot; StopIndex=&quot;50&quot; \/&gt;   &lt;Token Text=&quot;[&quot; TokenIndex=&quot;18&quot; Type=&quot;31&quot; Line=&quot;2&quot; CharPositionInLine=&quot;34&quot; StartIndex=&quot;51&quot; StopIndex=&quot;51&quot; \/&gt;   &lt;Token Text=&quot;]&quot; TokenIndex=&quot;19&quot; Type=&quot;57&quot; Line=&quot;2&quot; CharPositionInLine=&quot;35&quot; StartIndex=&quot;52&quot; StopIndex=&quot;52&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;20&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;36&quot; StartIndex=&quot;53&quot; StopIndex=&quot;53&quot; \/&gt;   &lt;Token Text=&quot;a&quot; TokenIndex=&quot;21&quot; Type=&quot;26&quot; Line=&quot;2&quot; CharPositionInLine=&quot;37&quot; StartIndex=&quot;54&quot; StopIndex=&quot;54&quot; \/&gt;   &lt;Token Text=&quot;)&quot; TokenIndex=&quot;22&quot; Type=&quot;60&quot; Line=&quot;2&quot; CharPositionInLine=&quot;38&quot; StartIndex=&quot;55&quot; StopIndex=&quot;55&quot; \/&gt;   &lt;Token Text=&quot;{&quot; TokenIndex=&quot;23&quot; Type=&quot;32&quot; Line=&quot;2&quot; CharPositionInLine=&quot;39&quot; StartIndex=&quot;56&quot; StopIndex=&quot;56&quot; \/&gt;   &lt;Token Text=&quot;\\n&quot; TokenIndex=&quot;24&quot; Type=&quot;74&quot; Line=&quot;2&quot; CharPositionInLine=&quot;40&quot; StartIndex=&quot;57&quot; StopIndex=&quot;57&quot; \/&gt;   &lt;Token Text=&quot;\\t&quot; TokenIndex=&quot;25&quot; Type=&quot;74&quot; Line=&quot;3&quot; CharPositionInLine=&quot;0&quot; StartIndex=&quot;58&quot; StopIndex=&quot;58&quot; \/&gt;   &lt;Token Text=&quot;System.out.println&quot; TokenIndex=&quot;26&quot; Type=&quot;54&quot; Line=&quot;3&quot; CharPositionInLine=&quot;1&quot; StartIndex=&quot;59&quot; StopIndex=&quot;76&quot; \/&gt;   &lt;Token Text=&quot;(&quot; TokenIndex=&quot;27&quot; Type=&quot;40&quot; Line=&quot;3&quot; CharPositionInLine=&quot;19&quot; StartIndex=&quot;77&quot; StopIndex=&quot;77&quot; \/&gt;   &lt;Token Text=&quot;new&quot; TokenIndex=&quot;28&quot; Type=&quot;50&quot; Line=&quot;3&quot; CharPositionInLine=&quot;20&quot; StartIndex=&quot;78&quot; StopIndex=&quot;80&quot; \/&gt;   &lt;Token Text=&quot; &quot; TokenIndex=&quot;29&quot; Type=&quot;74&quot; Line=&quot;3&quot; CharPositionInLine=&quot;23&quot; StartIndex=&quot;81&quot; StopIndex=&quot;81&quot; \/&gt; ... &lt;\/Lexer&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f AST \u044f \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438. \u041a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\u043c \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\u043c. \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0438\u0441\u0443\u043d\u043a\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/031\/053\/124\/031053124ae83cde9cef4f3b195e7f83.png\"\/><\/p>\n<p>  \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>BaseSymbol<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0438\u0437 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430, \u043e\u0442 \u043d\u0435\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f <code>Token<\/code> \u2013 \u0442\u043e\u043a\u0435\u043d (\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b) \u0438 <code>NonTerm<\/code> \u2013 \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b. \u041d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f: <code>ProgramStatement<\/code> \u2013 \u0430\u043a\u0441\u0438\u043e\u043c\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, <code>MainClassDecl<\/code> \u2013 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, <code>ClassDecl<\/code> \u2013 \u043a\u043b\u0430\u0441\u0441, <code>MethodDecl<\/code> \u2013 \u043c\u0435\u0442\u043e\u0434, <code>ExtendsClause<\/code> \u2013 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, <code>TypeDecl<\/code> \u2013 \u0442\u0438\u043f, <code>VarDecl<\/code> \u2013 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, <code>ExpressionDecl<\/code> \u2013 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, <code>StatementDecl<\/code> \u2013 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041a\u043b\u0430\u0441\u0441\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432: <code>IfStatement<\/code> \u2013 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, <code>WhileStatement<\/code> \u2013 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0446\u0438\u043a\u043b\u0430 <code>while<\/code>, <code>StatementList<\/code> \u2013 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, <code>AssignVarStatement<\/code> \u2013 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, <code>AssignIdStatement<\/code> \u2013 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u043d\u0435\u0435.<br \/>  \u0414\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 ANTLR \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 AST.<br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AST, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 xml-\u0444\u0430\u0439\u043b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>ToXmlTree()<\/code> \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>BaseSymbol<\/code>. \u041c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0414\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>BaseSymbol<\/code> \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cs\">public virtual XElement ToXmlTree() {     XElement elements = new XElement(ToString());     Symbols.ForEach(symbol =&gt;     {         if (symbol != null)         {             XElement el = symbol.ToXmlTree();             elements.Add(el);         }     });      return elements;  } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0437\u0434\u0435\u0441\u044c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AST<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;Program&gt;   &lt;MainClass&gt;     &lt;ID Value=&quot;Factorial&quot; \/&gt;     &lt;PrintStatement&gt;       &lt;MethodCallExpression&gt;         &lt;NewStatement&gt;           &lt;ID Value=&quot;Fac&quot; \/&gt;         &lt;\/NewStatement&gt;         &lt;ID Value=&quot;ComputeFac&quot; \/&gt;         &lt;ArgumentListExpression&gt;           &lt;INTEGER Value=&quot;10&quot; \/&gt;         &lt;\/ArgumentListExpression&gt;       &lt;\/MethodCallExpression&gt;     &lt;\/PrintStatement&gt;   &lt;\/MainClass&gt;   &lt;Class&gt;     &lt;ID Value=&quot;Fac&quot; \/&gt;     &lt;Method&gt;       &lt;INT \/&gt;       &lt;ID Value=&quot;ComputeFac&quot; \/&gt;       &lt;FormalArgumentList&gt;         &lt;Variable&gt;           &lt;INT \/&gt;           &lt;ID Value=&quot;num&quot; \/&gt;         &lt;\/Variable&gt;       &lt;\/FormalArgumentList&gt;       &lt;StatementList&gt;         &lt;VarStatement&gt;           &lt;Variable&gt;             &lt;INT \/&gt;             &lt;ID Value=&quot;num_aux&quot; \/&gt;           &lt;\/Variable&gt;         &lt;\/VarStatement&gt;         &lt;IfElseStatement&gt;           &lt;LessExpression&gt;             &lt;ID Value=&quot;num&quot; \/&gt;             &lt;INTEGER Value=&quot;1&quot; \/&gt;           &lt;\/LessExpression&gt;           &lt;IdStatement&gt;             &lt;ID Value=&quot;num_aux&quot; \/&gt;             &lt;INTEGER Value=&quot;1&quot; \/&gt;           &lt;\/IdStatement&gt;           &lt;IdStatement&gt;             &lt;ID Value=&quot;num_aux&quot; \/&gt;             &lt;MultiplyExpression&gt;               &lt;ID Value=&quot;num&quot; \/&gt;               &lt;MethodThisCallExpression&gt;                 &lt;ID Value=&quot;ComputeFac&quot; \/&gt;                 &lt;ArgumentListExpression&gt;                   &lt;MinusExpression&gt;                     &lt;ID Value=&quot;num&quot; \/&gt;                     &lt;INTEGER Value=&quot;1&quot; \/&gt;                   &lt;\/MinusExpression&gt;                 &lt;\/ArgumentListExpression&gt;               &lt;\/MethodThisCallExpression&gt;             &lt;\/MultiplyExpression&gt;           &lt;\/IdStatement&gt;         &lt;\/IfElseStatement&gt;       &lt;\/StatementList&gt;       &lt;ID Value=&quot;num_aux&quot; \/&gt;     &lt;\/Method&gt;   &lt;\/Class&gt; &lt;\/Program&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u0435 <code>ParserException<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 <code>CodeGenerationException<\/code>, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0435 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 <code>CompilerException<\/code>.<br \/>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0430\u0437\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f IL-\u043a\u043e\u0434.<\/p>\n<h4>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f IL-\u043a\u043e\u0434\u0430<\/h4>\n<p>  \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u044f \u043e\u043f\u044f\u0442\u044c \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c RunSharp, \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u043c \u043d\u0430 Codeproject <a href=\"http:\/\/www.codeproject.com\/Articles\/20921\/RunSharp-Reflection-Emit-Has-Never-Been-Easier\">http:\/\/www.codeproject.com\/Articles\/20921\/RunSharp-Reflection-Emit-Has-Never-Been-Easier<\/a>. RunSharp \u2013 \u043f\u0440\u043e\u0435\u043a\u0442, \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0451\u043d System.Reflection.Emit, \u0443\u043f\u0440\u043e\u0449\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 IL-\u043a\u043e\u0434\u0430.<br \/>  \u0414\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u0442\u043e\u0434 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442), \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432), \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 <code>if<\/code>, <code>while<\/code> \u0438 \u0442\u0435\u043b\u0430 \u043c\u0435\u0442\u043e\u0434\u0430), \u0441\u0442\u0435\u043a\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u043d\u0430\u0440\u043d\u044b\u0445 \u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439), \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. <br \/>  \u0422\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0438\u043c\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438.<br \/>  \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f IL-\u043a\u043e\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 <code>Generate(BaseSymbol root)<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>SharpCodeGen<\/code>.   <\/p>\n<pre><code class=\"cs\">private void Generate(BaseSymbol root) {     if (root == null)     {         return;     }      if (root.GrammarMember == GrammarMemberType.NonTerm)     {         NonTerm nonTerm = root as NonTerm;         _compilerLogger.PrintGenerateNonTerm(nonTerm);          if (_emitTableDictionary.ContainsKey(nonTerm.TypeNonTerm))         {             _emitTableDictionary[nonTerm.TypeNonTerm](nonTerm);         }         else         {             root.Symbols.ForEach(Generate);         }     } } <\/code><\/pre>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 <code>root<\/code> \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c, \u0438 \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u043d\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u0430\u0447\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u043c\u0441\u044f \u0432 <code>root<\/code>.<br \/>  \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438:  <\/p>\n<ul>\n<li>EmitMainClass \u2013 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b;<\/li>\n<li>EmitClass \u2013 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u043a\u0440\u043e\u043c\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e);<\/li>\n<li>EmitClassVar \u2013 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u043b\u0430\u0441\u0441\u0430 (\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430);<\/li>\n<li>EmitMethod \u2013 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430;<\/li>\n<li>EmitVarStatement \u2013 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0432\u0430;<\/li>\n<li>EmitNewStatement \u2013 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e;<\/li>\n<li>EmitNewArrayStatement \u2013 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432;<\/li>\n<li>EmitIdStatement \u2013 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0432\u0430;<\/li>\n<li>EmitArrayIdStatement \u2013 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0432\u0430;<\/li>\n<li>EmitArrayIndiciesStatement \u2013 \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430;<\/li>\n<li>EmitMethodCallExpression \u2013 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430;<\/li>\n<li>EmitBinaryExpression \u2013 \u0431\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f;<\/li>\n<li>EmitUnaryExpression \u2013 \u0443\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f;<\/li>\n<li>EmitPrintStatement \u2013 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0435\u0447\u0430\u0442\u0438;<\/li>\n<li>EmitIfStatement \u2013 \u0443\u0441\u043b\u043e\u0432\u0438\u0435;<\/li>\n<li>EmitWhileStatement \u2013 \u0446\u0438\u043a\u043b while;<\/li>\n<li>EmitLengthFunctionExpression \u2013 \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<\/li>\n<\/ul>\n<p>  \u0412 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>Generate()<\/code>.<br \/>  \u0422\u0430\u043a, \u043c\u0435\u0442\u043e\u0434, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:  <\/p>\n<pre><code class=\"cs\">private void EmitMethod(NonTerm nonTerm) {     Token typeMethodDeclSimple;     Token methodName;     List&lt;BaseSymbol&gt; formalParametersList;     BaseSymbol methodStatementList;     BaseSymbol returnStatement;     NonTermFactory.GetMethodDecl(nonTerm, out typeMethodDeclSimple, out methodName,          out formalParametersList, out methodStatementList, out returnStatement);      _currentFormalArgumentList.Clear();     foreach (BaseSymbol symbol in formalParametersList)     {         Token type;         Token id;         NonTermFactory.GetFormalArgumentDeclaration(symbol, out type, out id);         _currentFormalArgumentList.Add(id.Value);     }      _compilerLogger.PrintRefreshFormalArgumentList(_currentFormalArgumentList);      _currentMethod = _methodsTables[_currentClass.Name][methodName.Value];     _g = _currentMethod;      GeneratePreInitLocalVariables(methodStatementList);     Generate(methodStatementList);     Type resultType = GetVariableType(typeMethodDeclSimple);     string nameResult = AddTempLocalVariable(resultType);     EmitExpression(returnStatement, resultType, nameResult);      try     {         _g.Return(_currentOperandTempResult);     }     catch (InvalidCastException ex)     {         throw new CodeGenerationException(MessagesHelper.TypeMismatchEx, returnStatement.ToStringInfo(), ex);     }     ClearCurrentBlockLocalVariables(); } <\/code><\/pre>\n<p>  \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0443 (\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f <code>typeMethodDeclSimple<\/code>, \u0438\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>methodName<\/code>, \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <code>formalParametersList<\/code>, \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code>methodStatementList<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>returnStatement<\/code>). \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>_currentMethod<\/code> \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 (\u0442\u0438\u043f\u0430 <code>MethodGen<\/code> \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 RunSharp), \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430. \u0417\u0430\u0442\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>GeneratePreInitLocalVariables()<\/code> \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430, \u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>return<\/code>, \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430. <br \/>  \u0410 \u043c\u0435\u0442\u043e\u0434, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"cs\">private void EmitIdStatement(NonTerm nonTerm) {     Token idToken;     BaseSymbol expression;     NonTermFactory.GetAssignIdStatement(nonTerm, out idToken, out expression);      Operand operand;     if (_currentFormalArgumentList.Contains(idToken.Value))     {         operand = _g.Arg(idToken.Value);     }     else if (_localVariablesTable.ContainsKey(idToken.Value))     {         operand = _localVariablesTable[idToken.Value];     }     else     {         operand = _g.This().Field(idToken.Value);     }     _currentOperandTempResult = EmitExpression(expression, operand.Type, idToken.Value);      try     {         _g.Assign(operand, _currentOperandTempResult);     }     catch (InvalidCastException ex)     {         throw new CodeGenerationException(MessagesHelper.AssignTypeMismatchEx, expression.ToStringInfo(), ex);     } } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 (<code>idToken<\/code>) \u0438 \u0441\u0430\u043c\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (<code>expression<\/code>). \u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f: \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (<code>_currentFormalArgumentList<\/code>), \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (<code>_localVariablesTable<\/code>) \u0438\u043b\u0438 \u044d\u0442\u043e \u2013 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430, \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 <code>EmitExpression()<\/code>, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0445 \u043a\u043e\u0434.<\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0436\u0443\u0440\u043d\u0430\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0416\u0443\u0440\u043d\u0430\u043b \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u041a\u043b\u0430\u0441\u0441 Fac  \u041c\u0435\u0442\u043e\u0434 ComputeFac System.Int32  \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f Program \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f MainClass \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f PrintStatement \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f MethodCallExpression \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f NewStatement \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f Class \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f Method \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 num \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u0430 num_aux \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f StatementList \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f VarStatement \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f IfElseStatement \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f LessExpression \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f IdStatement \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f IdStatement \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f MultiplyExpression \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f MethodThisCallExpression \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f MinusExpression \u0423\u0434\u0430\u043b\u0435\u043d\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435  num_aux <\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<br \/>  <code> -i &lt;\u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b&gt; [-o &lt;\u0432\u044b\u0445\u043e\u0434\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f&gt;] <\/code><br \/>  \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u0442\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0432 \u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0433\u0434\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 Samples.<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0412\u0446\u0435\u043b\u043e\u043c \u0431\u044b\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MiniJava \u043f\u043e\u0434 .NET Framework \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C#, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0417\u0434\u0435\u0441\u044c \u044f \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u0445, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<br \/>  \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438\u0437 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 MiniJava \u0442\u0430\u043a\u0438\u043c\u0438, \u043a\u0430\u043a: \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430, \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430, \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430.<br \/>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/Didgeridoo\/MiniJavaCompiler\">GitHub<\/a>.<\/p>\n<h4>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h4>\n<p>  <\/p>\n<h5>\u041e\u0431\u0449\u0435\u0435 (\u0442\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430)<\/h5>\n<p>  <\/p>\n<ul>\n<li>\u0410\u0445\u043e, \u0421\u0435\u0442\u0438, \u0423\u043b\u044c\u043c\u0430\u043d. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b. \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/li>\n<li>\u0411\u0435\u043b\u043e\u0443\u0441\u043e\u0432, \u0422\u043a\u0430\u0447\u0435\u0432. \u0414\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u044f\u0437\u044b\u043a\u0430 \u0434\u043b\u044f .NET Framework <a href=\"http:\/\/msdn.microsoft.com\/ru-ru\/magazine\/cc136756.aspx\">http:\/\/msdn.microsoft.com\/ru-ru\/magazine\/cc136756.aspx<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h5>ANTLR<\/h5>\n<p>  <\/p>\n<ul>\n<li>ANTLR Tutorial \u2014 Expression Language <a href=\"http:\/\/meri-stuff.blogspot.ru\/2011\/09\/antlr-tutorial-expression-language.html\">http:\/\/meri-stuff.blogspot.ru\/2011\/09\/antlr-tutorial-expression-language.html<\/a><\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ANTLR <a href=\"http:\/\/club.shelek.ru\/viewart.php?id=39\">http:\/\/club.shelek.ru\/viewart.php?id=39<\/a><\/li>\n<li>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u0432\u0432\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e ANTLR <a href=\"http:\/\/fmt.cs.utwente.nl\/courses\/vertalerbouw\/sheets\/vb-04-antlr-1-4up.pdf\">http:\/\/fmt.cs.utwente.nl\/courses\/vertalerbouw\/sheets\/vb-04-antlr-1-4up.pdf<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h5>MiniJava<\/h5>\n<p>  <\/p>\n<ul>\n<li>An Overview of MiniJava <a href=\"http:\/\/www-cs-faculty.stanford.edu\/~eroberts\/\/papers\/SIGCSE-2001\/MiniJava.pdf\">http:\/\/www-cs-faculty.stanford.edu\/~eroberts\/\/papers\/SIGCSE-2001\/MiniJava.pdf<\/a><\/li>\n<li>The MiniJava Type System <a href=\"http:\/\/www.cs.ucla.edu\/~palsberg\/course\/cs132\/miniJava-typesystem.pdf\">http:\/\/www.cs.ucla.edu\/~palsberg\/course\/cs132\/miniJava-typesystem.pdf<\/a><\/li>\n<li>MiniJava Syntax <a href=\"http:\/\/www.cs.purdue.edu\/homes\/hosking\/502\/project\/grammar.html\">http:\/\/www.cs.purdue.edu\/homes\/hosking\/502\/project\/grammar.html<\/a><\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/191766\/\"> http:\/\/habrahabr.ru\/post\/191766\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u041a\u0430\u043a \u0432 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0441\u0440\u043e\u043a\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MiniJava \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 .NET Framework.<\/p>\n<p>  \u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438. \u041d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f MiniJava. \u0412\u044b\u0445\u043e\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f PE-\u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043e\u0439 CLR.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/f2d\/586\/b08\/f2d586b08de0b7f9e8be9b5c26d3897c.png\"\/><\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-191766","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/191766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=191766"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/191766\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=191766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=191766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=191766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}