рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдордп рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдорд┐рдиреАрдЬрд╛рд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕рдВрдХрд▓рдХ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдореНрди рдЫрд╡рд┐ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред MiniJava рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд╛рд▓реА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЗрдирдкреБрдЯ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ CLR рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП PE рдлрд╝рд╛рдЗрд▓ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рд╡рд┐рд╡рд░рдг рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
MiniJava рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛
MiniJava рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИред рдЕрдзрд┐рднрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдХрдВрд╕реЛрд▓ рдкрд░ рдореБрджреНрд░рдг рдХреЗрд╡рд▓
System.out.println(...)
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
e.length
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
int[]
рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рд╣реА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред
рдмреЗрдХрд╕-рдиреМрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд╡рд┐рд╡рд░рдг (рднрд╛рд╖рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рд╛рдЗрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛
http://www.cambridge.org/us/features/052182060X/ ):
Goal ::= MainClass ( ClassDeclaration )* <EOF> MainClass ::= "class" Identifier "{" "public" "static" "void" "main" "(" "String" "[" "]" Identifier ")" "{" Statement "}" "}" ClassDeclaration ::= "class" Identifier ( "extends" Identifier )? "{" ( VarDeclaration )* ( MethodDeclaration )* "}" VarDeclaration ::= Type Identifier ";" MethodDeclaration ::= "public" Type Identifier "(" ( Type Identifier ( "," Type Identifier )* )? ")" "{" ( VarDeclaration )* ( Statement )* "return" Expression ";" "}" Type ::= "int" "[" "]" | "boolean" | "int" | Identifier Statement ::= "{" ( Statement )* "}" | "if" "(" Expression ")" Statement "else" Statement | "while" "(" Expression ")" Statement | "System.out.println" "(" Expression ")" ";" | Identifier "=" Expression ";" | Identifier "[" Expression "]" "=" Expression ";" Expression ::= Expression ( "&&" | "<" | "+" | "-" | "*" ) Expression | Expression "[" Expression "]" | Expression "." "length" | Expression "." Identifier "(" ( Expression ( "," Expression )* )? ")" | <INTEGER_LITERAL> | "true" | "false" | Identifier | "this" | "new" "int" "[" Expression "]" | "new" Identifier "(" ")" | "!" Expression | "(" Expression ")" Identifier ::= <IDENTIFIER>
рдпрд╣рд╛рдВ, рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЧреИрд░-рд╡рд░реНрдгреЛрдВ рдХреЛ рднрд╛рд╖рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдЕрдВрддрд┐рдо рдкреНрд░рддреАрдХ рд╣реИред рдПрдХ рдиреЙрдирдЯрд░реНрдорд┐рдирд▓ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдФрд░ / рдпрд╛ рдиреЙрдирдЯрд░реНрдорд▓ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдирд┐рдпрдо рд╣реИ, рдЕрд░реНрдерд╛рддреНред ╬▒ тЖТ ╬▓тИИ, рдЬрд╣рд╛рдВ ╬▒тИИV, тИк (N )V) *ред N рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреА рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╣реИ, V рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреА рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╣реИред
рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕рднреА рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЛ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо, рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдФрд░ рд╕рд╛рде рд╣реА рдХреЛрдг рдЙрджреНрдзрд░рдгреЛрдВ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реНрдпрд╛рдХрд░рдг
Goal
-
Goal
ред
рдПрдХ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдЖрдИрдПрд▓-рдХреЛрдб рдХреА рдкреАрдврд╝реА рддрдХ)
factorial.java рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдорд┐рдиреАрдЬрд╛рд╡ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд▓рд┐рдП рдЧрдП рднрд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:
class Factorial{ public static void main(String[] a){ System.out.println(new Fac().ComputeFac(10)); } } class Fac { public int ComputeFac(int num){ int num_aux ; if (num < 1) num_aux = 1 ; else num_aux = num * (this.ComputeFac(num-1)) ; return num_aux ; } }
рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ
рдореИрдВрдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЗрди рджреЛ рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдП рдЧрдП рдереЗред рдЕрдм рд╕рдВрдХрд▓рдХ рдЬрдирд░реЗрдЯрд░ рдХреА рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐
рдПрдПрдирдЯреАрдПрд▓рдЖрд░ ,
рдЬреАрдкреАрдкреАрдЬреА ,
рдХреЛрдХреЛ / рдЖрд░ ,
рдЧреЛрд▓реНрдб рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░
рдХрдИ рдЕрдиреНрдп ред
рдореИрдВрдиреЗ ANTLR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдХрд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рд╢реЗрд▓ рд╣реИ рдФрд░ рдЕрдореВрд░реНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ (ANTLRWorks 1.4.3 рдкрд░реНрдпрд╛рд╡рд░рдг) рдХреЗ рджреГрд╢реНрдп рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 2.0 рд╕рд╛рдЗрдЯ
http://tunnelvisionlabs.com/products/demo рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рдХрдЯ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ
/ рдПрдВрдЯрд░реНрд╡рд░реНрдХреНрд╕ )ред
рд╕рдВрдХрд▓рдХ рдЬрдирд░реЗрдЯрд░ рдЖрдкрдХреЛ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рдЯреЛрдХрди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдФрд░ рдПрдХ рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдмреЗрдХрд╕-рдиреМрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ, рдореИрдВрдиреЗ ANLLR рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рд┐рдд рдХреАред рд╡реНрдпрд╛рдХрд░рдг рдХреЛ LL рджреГрд╢реНрдп рдореЗрдВ рдХрдо рдХрд░рдиреЗ, рдмрд╛рдИрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рдЧреЛрдВ рдореЗрдВ C # рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЖрдЧреЗ рдХреА рдХреЛрдб рдЬрдирд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХреА (рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ MiniJava.g рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд▓рд┐рдВрдХ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рд╣реИ:
mainClassDecl returns [NonTerm value] : CLASS^ id=ID LCURLY! PUBLIC! STATIC! VOID! MAIN! LPAREN! STRING! LBRACK! RBRACK! ID RPAREN! LCURLY! statement=stmtList RCURLY! RCURLY! { $value = NonTerm.CreateMainClassDecl(new Token(TokenType.ID, id.Text, id), statement.valueList); if (flagDebug) Console.WriteLine("mainClassDecl"); } ;
рдпрд╣рд╛рдБ mainClassDecl рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рдирд┐рдпрдо рд╣реИ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
MainClass ::= "class" Identifier "{" "public" "static" "void" "main" "(" "String" "[" "]" Identifier ")" "{" Statement "}" "}"
"^" рд╕рд╛рдЗрди, рдирд┐рдпрдо рдХреЗ рд░реВрдЯ рдХреЛ
CLASS
рдЯреЛрдХрди рдмрдирд╛рддрд╛ рд╣реИ, "!" рд╕рд╛рдЗрди рдЕрдиреНрдп рдЯреЛрдХрди рдХреЗ рдмрд╛рдж, ANTLR рдХреЛ рдЙрдирдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреА рдЕрдирджреЗрдЦреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ (рдпрд╛рдиреА, рдПрдПрд╕рдЯреА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдЬрд┐рдирдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореБрдЦреНрдп рд╡рд░реНрдЧ
ID
рдХрд╛ рдирд╛рдо рдФрд░ рд╕реВрдЪреА
stmtList
) рдХреЛ рдЪрд░ (
id
рдФрд░
statement
, рдХреНрд░рдорд╢рдГ) рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреЛрдХрди рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдоред
$value
рд╡рд╣
$value
рд╣реИ рдЬреЛ рдореВрд▓ рдирд┐рдпрдо рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ред рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдХреНрд╡рд╛рдпрд░ рдмреНрд░реИрдХреЗрдЯреНрд╕ рдореЗрдВ
returns
рдХреАрд╡рд░реНрдб (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
NonTerm
) рдХреЗ рдмрд╛рдж рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ .NET (antlr-dotnet-tool-3.3.1.7705 рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдХреЗ рд▓рд┐рдП ANTLR рдХрдВрдкрд╛рдЗрд▓рд░ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Antlr3.exe -o "___" "_____\MiniJava.g"
рд╡реНрдпрд╛рдХрд░рдг (рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди:
- рдЬреЛрдбрд╝рд╛
double
рдкреНрд░рдХрд╛рд░; printf(тАж)
рдХрдВрд╕реЛрд▓ рдкрд░ рдХреЙрд▓рд┐рдВрдЧ System.out.println(тАж)
рд╕рдорд╛рди рд╣реИ;- рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд┐рдВрдЯ рдХреЗ рдмрд╛рдж,
Console.Readkey()
рд╡рд┐рдзрд┐ рдХреЛ (рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд
Lexer
рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public void SaveToFile(string fileName) { List<IToken> tokens = TokenStream.GetTokens(); XElement xElement = new XElement("Lexer", from token in tokens select new XElement("Token", new XAttribute("Text", token.Text.TokenToString()), new XAttribute("TokenIndex", token.TokenIndex), new XAttribute("Type", token.Type), new XAttribute("Line", token.Line), new XAttribute("CharPositionInLine", token.CharPositionInLine), new XAttribute("StartIndex", token.StartIndex), new XAttribute("StopIndex", token.StopIndex) ) ); xElement.Save(fileName); }
рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо 152 рдЯреЛрдХрди рд╣реИ (рдкрд╣рд▓реЗ 30 рдпрд╣рд╛рдБ рджрд┐рдП рдЧрдП рд╣реИрдВ):
рдЯреЛрдХрди рдлреНрд▓реЛ <?xml version="1.0" encoding="utf-8"?> <Lexer> <Token Text="class" TokenIndex="0" Type="8" Line="1" CharPositionInLine="0" StartIndex="0" StopIndex="4" /> <Token Text=" " TokenIndex="1" Type="74" Line="1" CharPositionInLine="5" StartIndex="5" StopIndex="5" /> <Token Text="Factorial" TokenIndex="2" Type="26" Line="1" CharPositionInLine="6" StartIndex="6" StopIndex="14" /> <Token Text="{" TokenIndex="3" Type="32" Line="1" CharPositionInLine="15" StartIndex="15" StopIndex="15" /> <Token Text="\n" TokenIndex="4" Type="74" Line="1" CharPositionInLine="16" StartIndex="16" StopIndex="16" /> <Token Text=" " TokenIndex="5" Type="74" Line="2" CharPositionInLine="0" StartIndex="17" StopIndex="17" /> <Token Text=" " TokenIndex="6" Type="74" Line="2" CharPositionInLine="1" StartIndex="18" StopIndex="18" /> <Token Text=" " TokenIndex="7" Type="74" Line="2" CharPositionInLine="2" StartIndex="19" StopIndex="19" /> <Token Text=" " TokenIndex="8" Type="74" Line="2" CharPositionInLine="3" StartIndex="20" StopIndex="20" /> <Token Text="public" TokenIndex="9" Type="56" Line="2" CharPositionInLine="4" StartIndex="21" StopIndex="26" /> <Token Text=" " TokenIndex="10" Type="74" Line="2" CharPositionInLine="10" StartIndex="27" StopIndex="27" /> <Token Text="static" TokenIndex="11" Type="64" Line="2" CharPositionInLine="11" StartIndex="28" StopIndex="33" /> <Token Text=" " TokenIndex="12" Type="74" Line="2" CharPositionInLine="17" StartIndex="34" StopIndex="34" /> <Token Text="void" TokenIndex="13" Type="72" Line="2" CharPositionInLine="18" StartIndex="35" StopIndex="38" /> <Token Text=" " TokenIndex="14" Type="74" Line="2" CharPositionInLine="22" StartIndex="39" StopIndex="39" /> <Token Text="main" TokenIndex="15" Type="41" Line="2" CharPositionInLine="23" StartIndex="40" StopIndex="43" /> <Token Text="(" TokenIndex="16" Type="40" Line="2" CharPositionInLine="27" StartIndex="44" StopIndex="44" /> <Token Text="String" TokenIndex="17" Type="66" Line="2" CharPositionInLine="28" StartIndex="45" StopIndex="50" /> <Token Text="[" TokenIndex="18" Type="31" Line="2" CharPositionInLine="34" StartIndex="51" StopIndex="51" /> <Token Text="]" TokenIndex="19" Type="57" Line="2" CharPositionInLine="35" StartIndex="52" StopIndex="52" /> <Token Text=" " TokenIndex="20" Type="74" Line="2" CharPositionInLine="36" StartIndex="53" StopIndex="53" /> <Token Text="a" TokenIndex="21" Type="26" Line="2" CharPositionInLine="37" StartIndex="54" StopIndex="54" /> <Token Text=")" TokenIndex="22" Type="60" Line="2" CharPositionInLine="38" StartIndex="55" StopIndex="55" /> <Token Text="{" TokenIndex="23" Type="32" Line="2" CharPositionInLine="39" StartIndex="56" StopIndex="56" /> <Token Text="\n" TokenIndex="24" Type="74" Line="2" CharPositionInLine="40" StartIndex="57" StopIndex="57" /> <Token Text="\t" TokenIndex="25" Type="74" Line="3" CharPositionInLine="0" StartIndex="58" StopIndex="58" /> <Token Text="System.out.println" TokenIndex="26" Type="54" Line="3" CharPositionInLine="1" StartIndex="59" StopIndex="76" /> <Token Text="(" TokenIndex="27" Type="40" Line="3" CharPositionInLine="19" StartIndex="77" StopIndex="77" /> <Token Text="new" TokenIndex="28" Type="50" Line="3" CharPositionInLine="20" StartIndex="78" StopIndex="80" /> <Token Text=" " TokenIndex="29" Type="74" Line="3" CharPositionInLine="23" StartIndex="81" StopIndex="81" /> ... </Lexer>
рдПрдПрд╕рдЯреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ред рдХрдХреНрд╖рд╛рдПрдВ рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдФрд░ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдореЗрдВ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдмреЗрд╕ рдХреНрд▓рд╛рд╕
BaseSymbol
рд╕рдВрдпреБрдХреНрдд рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╕реЗ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ,
Token
- рдПрдХ рдЯреЛрдХрди (рдЯрд░реНрдорд┐рдирд▓) рдФрд░
NonTerm
-
NonTerm
рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред Nonterminals рд╣реИрдВ: ProgramStatement - рд╡реНрдпрд╛рдХрд░рдг рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз,
MainClassDecl
- рдореБрдЦреНрдп рд╡рд░реНрдЧ,
ClassDecl
- рд╡рд░реНрдЧ,
MethodDecl
- рд╡рд┐рдзрд┐,
ExtendsClause
- рд╡рд░реНрдЧ рдХреА рд╡рд┐рд░рд╛рд╕рдд,
TypeDecl
- рдкреНрд░рдХрд╛рд░,
VarDecl
- рдЪрд░,
ExpressionDecl
- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐,
StatementDecl
,
StatementDecl
,
StatementDecl
,
StatementDecl
ред рдСрдкрд░реЗрдЯрд░ рдХрдХреНрд╖рд╛рдПрдВ:
IfStatement
рдПрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ,
while
WhileStatement
рдПрдХ
while
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ,
StatementList
рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ,
AssignVarStatement
рдПрдХ рдирдП рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИ,
AssignIdStatement
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИред
рдПрдПрд╕рдЯреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдПрдирдЯреАрдПрд▓рдЖрд░ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд╛рд░реНрд╕рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдПрдПрд╕рдЯреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ
ToXmlTree()
рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА
ToXmlTree()
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХреА рдЬрд╛рддреА рд╣реИред рдмреЗрд╕ рдХреНрд▓рд╛рд╕
BaseSymbol
рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
public virtual XElement ToXmlTree() { XElement elements = new XElement(ToString()); Symbols.ForEach(symbol => { if (symbol != null) { XElement el = symbol.ToXmlTree(); elements.Add(el); } }); return elements; }
рд╡реГрдХреНрд╖ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рд╣реИ:
рдПрдПрд╕рдЯреА <?xml version="1.0" encoding="utf-8"?> <Program> <MainClass> <ID Value="Factorial" /> <PrintStatement> <MethodCallExpression> <NewStatement> <ID Value="Fac" /> </NewStatement> <ID Value="ComputeFac" /> <ArgumentListExpression> <INTEGER Value="10" /> </ArgumentListExpression> </MethodCallExpression> </PrintStatement> </MainClass> <Class> <ID Value="Fac" /> <Method> <INT /> <ID Value="ComputeFac" /> <FormalArgumentList> <Variable> <INT /> <ID Value="num" /> </Variable> </FormalArgumentList> <StatementList> <VarStatement> <Variable> <INT /> <ID Value="num_aux" /> </Variable> </VarStatement> <IfElseStatement> <LessExpression> <ID Value="num" /> <INTEGER Value="1" /> </LessExpression> <IdStatement> <ID Value="num_aux" /> <INTEGER Value="1" /> </IdStatement> <IdStatement> <ID Value="num_aux" /> <MultiplyExpression> <ID Value="num" /> <MethodThisCallExpression> <ID Value="ComputeFac" /> <ArgumentListExpression> <MinusExpression> <ID Value="num" /> <INTEGER Value="1" /> </MinusExpression> </ArgumentListExpression> </MethodThisCallExpression> </MultiplyExpression> </IdStatement> </IfElseStatement> </StatementList> <ID Value="num_aux" /> </Method> </Class> </Program>
рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрд╡рд╛рдж рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦреАрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ
ParserException
рдХреЛ
ParserException
рдХрд░рдиреЗ рдХреЗ
ParserException
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде
CodeGenerationException
рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
CompilerException
рд╕рдВрдХрд▓рдХ рдЕрдкрд╡рд╛рдж рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЖрдИрдПрд▓ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
рдЖрдИрдПрд▓ рдХреЛрдб рдкреАрдврд╝реА
рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреЛрдбрдкреНрд░реЛрдЬреЗрдХреНрдЯ
http://www.codeproject.com/Articles/20921/RunSharp-Reflection-Emit-Has-Never-Been-Easier рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рдореМрдЬреВрджрд╛ RunSharp рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ред RunSharp рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ System.Reflection.Emit рдирд╛рдорд╕реНрдерд╛рди рд╕реЗ рдХреНрд▓рд╛рд╕ рдореЗрдердб рдХреЙрд▓ рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИ, IL рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ: рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд▓рд╛рд╕ рдЯреЗрдмрд▓ (рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреВрд╕рд░реЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ), рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА (рдХреЛрдб рдЬреЗрдирд░реЗрд╢рди рдСрдлрд╝ рдореЗрдердб), рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рд╕реВрдЪреА (рдЯреНрд░реИрдХрд┐рдВрдЧ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП) рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдЕрдВрджрд░
if
,
while
рдмреНрд▓реЙрдХ рдФрд░ рд╡рд┐рдзрд┐ рдХрд╛ рд╢рд░реАрд░), рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдвреЗрд░ (рдПрдХрддрд╛ рдФрд░ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП), рд╡рд░реНрддрдорд╛рди рд╡рд┐рдзрд┐ рдХреЗ рдФрдкрдЪрд╛рд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред
рдПрдХ рдХреЛрдб рдЬреЗрдирд░реЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓ рдЯреЗрдмрд▓ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдЪрд┐рдиреНрд╣ рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рдзрд┐ рдЬреЛ рдХреЛрдб рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдкрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
IL-code рдХрд╛ рдЬрдирд░реЗрд╢рди рдореБрдЦреНрдп
Generate(BaseSymbol root)
рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рдзрд┐
Generate(BaseSymbol root)
ред
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); } } }
рд╡рд┐рдзрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛
root
рдиреЙрдирдЯрд░реНрдорд┐рдирд▓ рд╣реИ, рдФрд░ рдпрджрд┐ рдХрдВрдЯреНрд░реЛрд▓рд░ рдЯреЗрдмрд▓ рдореЗрдВ рдиреЙрдирдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд╣рд┐рдд рд╣реИ, рддреЛ рдХрдВрдЯреНрд░реЛрд▓ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛,
root
рдореЗрдВ рдирд┐рд╣рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрд╛рдХрд░рдг рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рдкреАрдврд╝реА рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рдпрдВрддреНрд░рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╛рдХрд░рдг рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИрдВ:
- EmitMainClass - рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ;
- рдПрдорд┐рдЯрдХреНрд▓рд╛рд╕ - рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡рд░реНрдЧ (рдореБрдЦреНрдп рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░);
- EmitClassVar - рд╡рд░реНрдЧ рдЪрд░ (рдирд┐рдЬреА рд╡рд░реНрдЧ рдХреНрд╖реЗрддреНрд░);
- рдПрдорд┐рдЯрдордереЛрдб - рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐;
- EmitVarStatement - рджрд╛рдИрдВ рдУрд░ рдПрдХ рдирдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЪрд░ рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ;
- EmitNewStatement - рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди;
- EmitNewArrayStatement - рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХрд╛ рдЖрд╡рдВрдЯрди;
- EmitIdStatement - рджрд╛рдИрдВ рдУрд░ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ;
- EmitArrayIdStatement - рджрд╛рдИрдВ рдУрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕рд░рдгреА рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ;
- EmitArrayInduritiesStatement - рдРрд░реЗ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдВрдЪ;
- EmitMethodCallExpression - рд╡рд┐рдзрд┐ рдХреЙрд▓;
- EmitBinaryExpression - рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрд╢рди;
- EmitUnaryExpression - рдПрдХрддрд░рдлрд╛ рд╕рдВрдЪрд╛рд▓рди;
- EmitPrintStatement - рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ;
- рдПрдорд┐рдЯрд┐рдлрд╝рд╕реНрдЯреЗрдЯ - рд╕реНрдерд┐рддрд┐;
- EmitWhileStatement - рд▓реВрдк рдХрд░рддреЗ рд╕рдордп;
- EmitLengthFunctionExpression - рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИред
рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рднрд╛рдЧ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рдзрд┐
Generate()
рдХрд╣рддрд╛ рд╣реИред
рддреЛ, рд╡рд┐рдзрд┐ рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
private void EmitMethod(NonTerm nonTerm) { Token typeMethodDeclSimple; Token methodName; List<BaseSymbol> 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(); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░
typeMethodDeclSimple
, рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо
formalParametersList
, рдФрдкрдЪрд╛рд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА
formalParametersList
, рд╡рд┐рдзрд┐ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рд╕реВрдЪреА
methodStatementList
рдФрд░ рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд░рд┐рдЯрд░реНрди
returnStatement
)ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдФрдкрдЪрд╛рд░рд┐рдХ рдЪрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рднрд░ рджреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЪрд░
_currentMethod
рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЬреИрд╕реЗ рдХрд┐ RunSharp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ MethodGen) рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдлрд┐рд░,
GeneratePreInitLocalVariables()
рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рд╕реВрдЪреА рдЖрдмрд╛рдж рд╣реИ рдФрд░ рд╡рд┐рдзрд┐ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдСрдкрд░реЗрдЯрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдзрд┐ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдЬреЛ
return
рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рдж рдЖрддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рд╕реВрдЪреА рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдФрд░ рдЪрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
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); } }
рдпрд╣рд╛рдВ, рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рд╣реА (
idToken
) рдФрд░ рд╕реНрд╡рдпрдВ
expression
(
expression
) рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдпрд╛ рд╣реИ: рд╕реНрдерд╛рдиреАрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ (
_localVariablesTable
) рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдЪрд░ рд╣реИ, рдФрдкрдЪрд╛рд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ (
_currentFormalArgumentList
) рдХреА рд╕реВрдЪреА рд╕реЗред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо
EmitExpression()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рджрд╛рдИрдВ рдУрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕реА рддрд░рд╣, рдЕрдиреНрдп рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЙрдирдХрд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рднрд╛рдЬреНрдп рдЧрдгрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдПрдХ рд▓реЙрдЧ рд╣реИред
рдХреЛрдб рдЬрдирд░реЗрд╢рди рд▓реЙрдЧ рдХрдХреНрд╖рд╛ рдФрд░ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдирд╛
рдХреНрд▓рд╛рд╕ рдлреЗрд╕
ComputeFac System.Int32 рд╡рд┐рдзрд┐
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
рдореЗрдирдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╣реАрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ
PrintStatement рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
MethodCallExpression рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реГрдЬрди
NewStatement рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реГрдЬрди
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
рд╡рд░реНрддрдорд╛рди рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрджреНрдпрддрди рд╕реВрдЪреА
рд╕рдВрдЦреНрдпрд╛
рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗ рдЧрдП рдЪрд░
num_aux
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯрд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
VarStatement рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
IfElseStatement рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
LessExpression рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реГрдЬрди
рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╣реАрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ
IdStatement рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╣реАрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ
IdStatement рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛
MultiplyExpression рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реГрдЬрди
MethodThisCallExpression рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реГрдЬрди
MinusExpression рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реГрдЬрди
рдЪрд░ рд╣рдЯрд╛рдП рдЧрдП
num_aux
рдПрдХ рдХрдВрд╕реЛрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдирд┐рдореНрди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ:
-i < > [-o < >]
рдпрджрд┐ рдЖрдЙрдЯрдкреБрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЖрд╡реЗрджрди рд╣реА рдирдореВрдиреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореМрдЬреВрджрд╛ рд╡рд┐рдХрд╛рд╕ рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C # рдореЗрдВ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ MiniJava рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИред рдпрд╣рд╛рдВ, рдореИрдВрдиреЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ред
рд▓рд┐рдЦрд┐рдд рдХрдВрдкрд╛рдЗрд▓рд░ рдорд┐рдиреАрдЬрд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реЛрдо рдкреЗрдЬ рд╕реЗ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреИрд▓рдХреБрд▓реЗрд╢рди, рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ, рдмрдмрд▓ рд╕реЙрд░реНрдЯрд┐рдВрдЧ, рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓, рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ, рд▓реАрдирд┐рдпрд░ рд╕рд░реНрдЪ, рд▓рд┐рдВрдХ рд▓рд┐рд╕реНрдЯ рдмрдирд╛рдиреЗ, рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдмрдирд╛рдиреЗ рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
рд╕рд╛рдорд╛рдиреНрдп (рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░)
- рдЕрд╣реЛ, рдиреЗрдЯрд╡рд░реНрдХ, рдЙрд▓рдореИрдиред рд╕рдВрдХрд▓рдирдХрд░реНрддрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд, рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА, рдЙрдкрдХрд░рдгред
- рдмреЗрд▓реМрд╕реЛрд╡, рдЯрдХрд╛рдЪреЗрд╡ред рдЕрд╕рддрдд рдЧрдгрд┐рддред
- .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рд╕рдВрдХрд▓рдХ рдмрдирд╛рдирд╛ http://msdn.microsoft.com/en-us/magazine/cc136755.bx
ANTLR
MiniJava