Разработка компиляторов - ответы
Количество вопросов - 537
int Factor (){ char ch = getChar(); if (isDigit (ch)) return getValue(ch); if (ch == '(') { int result = Formula (); if (getChar() == ')') return result; error ("Неожиданный символ"); return 0; } return error ("Неожиданный символ"); }вычисляет значение:
private int m_stateOfVeryCriticalResource;public int stateOfVeryCriticalResource { get { if (IsAllowedUser()) return m_stateOfVeryCriticalResource; } set { if (IsAdmin()) m_stateOfVeryCriticalResource = value; }}...stateOfVeryCriticalResource = vcrCompletelyScrewedUp;позволяет проверить достаточность полномочий запрашивающего приложения:
using System.Runtime.InteropServices;public class AppMain { [DllImport("user32.dll")] public static extern int MessageBoxA(int handle, string message, string caption,int flags); public static void Main(){ MessageBoxA(0,"Hello World","Native Message Box",0); } [conditional("DEBUG")] public static void SayHello() { Console.WriteLine("Hello, World!"); return; }}обеспечивается взаимодействие с функцией MessageBoxA из Win32 API:
S -> B AA -> +B A A -> eB -> D CC -> * D C C -> eD -> (S) D -> aмножества FIRST определяются следующим образом:
E -> T | TE'E' -> +T | +TE'T -> F | FT'T'-> *F | *FT'F -> (E) | numобладает свойством:
goto (I, X) { J={}; for (каждой ситуации [A->w.Xv] из I) { J+=[A->wX.v]; } return closure (J);}происходит:
0: {[S'-gt;.S, $], [S-gt;.AA, $], [A-gt;.aA, a], [A-gt;.aA, b], [A-gt;.b, a], [A-gt;.b, b]}1: {[S'-gt;S., $]}2: {[S'-gt;A.A, $], A-gt;.aA, $], [A-gt;.b, $]}3: {[A-gt;a.A, a], [A-gt;a.A, b], [A-gt;.a.A, a], [A-gt;.a.A, b], [A-gt;.b, a], [A-gt;.b, b]}4: {[A-gt;b., a], [A-gt;b., b]}5: {[S-gt;AA. $]}6: {[A-gt;a.A, $], [A-gt;.aA, $], [A-gt;.b, $]}7: {[A-gt;b., $]}8: {[A-gt;aA.,a], [A-gt;aA.,b]}9: {[A-gt;aA.,$]}:
int yylex (void){int ch;while ((ch = getchar ()) == ' ');if (isdigit (ch)){ungetc (ch, stdin); scanf (%i, &yylval);return NUMBER_LC;}return ch;}вычисляет следующую пару значений:
int F (int a, int b){ int g = a, m = b; if (a < b) {g = b; m = a;} while (m) { int s = g; g = m; m = s % m; } return g;}выступает следующее множество:
jne .L1 movl buffer, %eax jmp .L3.L1: jmp .L2 jne .L2 movl buffer, %eax jmp .L3происходит:
class LowLevelSample { public static void Run() { int i; i = 0; try { Start: if (i == 10) throw new Exception(); Console.WriteLine (i); i = i + 1; goto Start; } catch (Exception) { Console.WriteLine ("Finished"); } }}может использоваться в качестве примера:
q = q0;c = GetChar();while (c != eof) { q = move (q, c); c = GetChar();}if (q is in F) return "yes";else return "no";демонстрирует (предполагается, что входная лента заканчивается символом end_of_file):
public static void Main() { Int32 v = 5; Object o = v; v = 123; Console.WriteLine (v + ", " + (Int32) o);}операция упаковки производится:
void DumpHrefs(String inputString) { Regex r; Match m; r = new Regex("href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))", RegexOptions.IgnoreCase|RegexOptions.Compiled); for (m = r.Match(inputString); m.Success; m = m.NextMatch()) { Console.WriteLine("Found href " + m.Groups[1] + " at " + m.Groups[1].Index); } }класс Regex:
public class Matrix { public const int n = 10; public int[,] elements = new int[n,n]; public int this[int i, int j] { get { return elements[i,j]; } set { elements[i,j] = value; } }}допустимо следующее использование:
struct S {int a; int b};int F (int n, struct S * v){int i, s = 0;for (i=0; i<n; i++){ int q = (v+i)->a - (v+i)->b; --- 1 if (q < 0) s += (v+i)->a + (v+i)->>b; --- 2else (v+i)->b = q;(v+i)->a = (v+i)->b; --- 3}return s;}эквивалентны следующие вхождения выражения (v+i)->b:
using System; public delegate void EventHandler (string strText);class EventSource { public event EventHandler TextOut; public void TriggerEvent() { if (TextOut != null) TextOut("Event triggered..."); }}class TestApp { public static void Main() { EventSource evsrc = new EventSource(); evsrc.TextOut += new EventHandler(CatchEvent); evsrc.TriggerEvent(); evsrc.TextOut -= new EventHandler(CatchEvent); evsrc.TriggerEvent(); TestApp theApp = new TestApp(); evsrc.TextOut += new EventHandler(theApp.InstanceCatch); evsrc.TriggerEvent(); }public static void CatchEvent(string strText) { WriteLine(strText); }public void InstanceCatch(string strText) { WriteLine("Instance "+strText); }происходят:
REF to MODE NEST assignation: REF to MODE NEST destination, becomes token, MODE NEST source.определяет:
y = f(x);a = y*2;if (y == f(x)) z = y*2+a;else z = f(x)*2+a;t = f(x)*2+a+z;возможной остаточной программой будет:
using System;class Fib{ public static void Main (String[] args) { int a = 1, b = 1; for (int i = 1; i != 10; ++i) { Console.WriteLine (a); int c = a + b; a = b; b = c; } }}вычисляет:
jmp .L1.L1: movl buffer, %eax addl %edx, %eax movl buffer, %eax addl %edx, %eaxпроисходит:
G=(A, N, Expr, R)A={‘+’, ‘-’, const, var}N={Expr, Opnd}R={Opnd: const, Opnd: var, Expr: Opnd Expr: ‘+’ (Expr, Expr), Expr: ‘-’ (Expr) }порождает деревья выражений из:
var in : integer;function Digits (integer n) : integer;var m : integer;begin if n < 10 then return n else begin m := n div 10; return n - m*10 + Digits (m); end;end; begin read (in); writeln(Digits(in));end.используется:
S =>* wAv => wuv =>* wxS =>* wAv => wu1v =>* wyдля которых FIRSTk (x) = FIRSTk (y)вытекает, что:
ArrayList a = new ArrayList();for (int i=0; i < 10; i++) { Point p; p.x = p.y = i; a.Add(p);}мы добавляем тип-значение:
R = empty set;for (each state I in T){ for (each item [A->w.] in I) { R+={(I, A->w)}; }}вычисляется: