diff --git a/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs b/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs index 4f871b9..09939e2 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs @@ -456,7 +456,7 @@ namespace RusticiSoftware.Translator.CSharp //System.Console.Out.WriteLine(writer.ToString()); System.Console.Out.WriteLine(""); System.Console.Out.WriteLine(""); - System.Console.Out.WriteLine("Pretty-printed {0} in: {1} seconds.", fullName, elapsedTime); + System.Console.Out.WriteLine("Processed {0} in: {1} seconds.", fullName, elapsedTime); } } } diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g index 0d67a58..ab3ddeb 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g @@ -86,19 +86,20 @@ using_namespace_directive: 'using' namespace_name ';' ; namespace_member_declarations: namespace_member_declaration+ ; -namespace_member_declaration: - namespace_declaration - | attributes? modifiers? type_declaration_pkg ; -// type_declaration is only called at the top level, so each of the types declared -// here will become a Java compilation unit (and go to its own file) -type_declaration_pkg -@init { string ns = $NSContext::currentNS; } +namespace_member_declaration +@init { string ns = $NSContext::currentNS; + bool isCompUnit = false;} @after { - CUMap.Add(ns+"."+$pkg.name, $type_declaration_pkg.tree); - CUKeys.Add(ns+"."+$pkg.name); + if (isCompUnit) { + CUMap.Add(ns+"."+$ty.name, $namespace_member_declaration.tree); + CUKeys.Add(ns+"."+$ty.name); + }; } : - pkg=type_declaration -> ^(PACKAGE PAYLOAD[ns] $pkg); + namespace_declaration + | attributes? modifiers? ty=type_declaration { isCompUnit = true; } -> ^(PACKAGE[$ty.start.Token] PAYLOAD[ns] modifiers? type_declaration); +// type_declaration is only called at the top level, so each of the types declared +// here will become a Java compilation unit (and go to its own file) type_declaration returns [string name] : ('partial') => p='partial'! { Warning($p.line, "[UNSUPPORTED] 'partial' definition"); } @@ -120,8 +121,8 @@ namespace_name modifiers: modifier+ ; modifier: - 'new' | 'public' | 'protected' | 'private' | 'internal' | 'unsafe' | 'abstract' | 'sealed' | 'static' - | 'readonly' | 'volatile' | 'extern' | 'virtual' | 'override'; + 'new' | 'public' | 'protected' | 'private' | 'internal' -> /* translate to package-private */| 'unsafe' -> | 'abstract' | 'sealed' -> FINAL["final"] | 'static' + | 'readonly' -> FINAL["final"] | 'volatile' | 'extern' | 'virtual' | 'override'; class_member_declaration: attributes? @@ -699,11 +700,30 @@ enum_declaration returns [string name]: enum_base: ':' integral_type ; enum_body: - '{' (enum_member_declarations ','?)? '}' ; -enum_member_declarations: - enum_member_declaration (',' enum_member_declaration)* ; -enum_member_declaration: - attributes? identifier ('=' expression)? ; + '{' (enum_member_declarations ','?)? '}' -> ^(ENUM_BODY enum_member_declarations) ; +enum_member_declarations +@init { + SortedList members = new SortedList(); + int next = 0; +} +@after{ + $enum_member_declarations.tree = (CommonTree)adaptor.Nil; + int dummyCounter = 0; + for (int i = 0; i < next; i++) { + if (members.ContainsKey(i)) { + adaptor.AddChild($enum_member_declarations.tree, members[i]); + } + else { + adaptor.AddChild($enum_member_declarations.tree, adaptor.Create(IDENTIFIER, $e.start.Token, "__dummyEnum__" + dummyCounter++)); + } + }; +} +: + e=enum_member_declaration[members,ref next] (',' enum_member_declaration[members, ref next])* + -> + ; +enum_member_declaration[ SortedList members, ref int next]: + attributes? identifier { $members[next] = $identifier.tree; $next++; } (('=' expression)?)! ; //enum_modifiers: // enum_modifier+ ; //enum_modifier: diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g index 4f18e04..0f12486 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g @@ -27,12 +27,14 @@ options { protected List collectComments(int endIdx) { List rets = new List(); List toks = ((CommonTokenStream)this.GetTreeNodeStream().TokenStream).GetTokens(emittedCommentTokenIdx,endIdx); - foreach (IToken tok in toks) { - if (tok.Channel == TokenChannels.Hidden) { - rets.Add(new Regex("(\\n|\\r)+").Replace(tok.Text, Environment.NewLine).Trim()); + if (toks != null) { + foreach (IToken tok in toks) { + if (tok.Channel == TokenChannels.Hidden) { + rets.Add(new Regex("(\\n|\\r)+").Replace(tok.Text, Environment.NewLine).Trim()); + } } + emittedCommentTokenIdx = endIdx+1; } - emittedCommentTokenIdx = endIdx+1; return rets; } protected List collectComments() { @@ -40,10 +42,14 @@ options { } } -compilation_unit: - ^(PACKAGE nm=PAYLOAD type_declaration) -> +compilation_unit +@init { + List preComments = null; +}: + ^(PACKAGE { preComments = collectComments($PACKAGE.TokenStartIndex); } nm=PAYLOAD modifiers? type_declaration) -> package(now = {DateTime.Now}, includeDate = {true}, packageName = {$nm.text}, - comments = {collectComments($type_declaration.start.TokenStartIndex)}, + comments = { preComments }, + modifiers = {$modifiers.st}, type = {$type_declaration.st}, endComments = {IsLast ? collectComments() : null}); @@ -51,7 +57,7 @@ type_declaration: class_declaration | struct_declaration | interface_declaration - | enum_declaration + | enum_declaration -> { $enum_declaration.st } | delegate_declaration ; // Identifiers qualified_identifier: @@ -60,10 +66,12 @@ namespace_name : namespace_or_type_name ; modifiers: - modifier+ ; -modifier: - 'new' | 'public' | 'protected' | 'private' | 'internal' | 'unsafe' | 'abstract' | 'sealed' | 'static' - | 'readonly' | 'volatile' | 'extern' | 'virtual' | 'override'; + ms+=modifier+ -> modifiers(mods={$ms}); +modifier +: + (m='new' | m='public' | m='protected' | m='private' | m='abstract' | m='sealed' | m='static' + | m='readonly' | m='volatile' | m='extern' | m='virtual' | m='override' | m=FINAL) + -> string(payload={$m.text}); class_member_declaration: attributes? @@ -621,15 +629,14 @@ remove_accessor_declaration: // enum declaration /////////////////////////////////////////////////////// enum_declaration: - 'enum' identifier enum_base? enum_body ';'? ; + 'enum' identifier enum_base? enum_body ';'? + -> enum(name={$identifier.text}, body={$enum_body.st}) ; enum_base: ':' integral_type ; enum_body: - '{' (enum_member_declarations ','?)? '}' ; -enum_member_declarations: - enum_member_declaration (',' enum_member_declaration)* ; + ^(ENUM_BODY es+=enum_member_declaration+) -> enum_body(values={$es}); enum_member_declaration: - attributes? identifier ('=' expression)? ; + attributes? identifier -> enum_member(comments = {collectComments($identifier.start.TokenStartIndex)}, value={ $identifier.st }); //enum_modifiers: // enum_modifier+ ; //enum_modifier: @@ -1015,7 +1022,7 @@ predefined_type: | 'short' | 'string' | 'uint' | 'ulong' | 'ushort' ; identifier: - IDENTIFIER | also_keyword; + IDENTIFIER -> template(v= { $IDENTIFIER.text }) "" | also_keyword -> template(v= { $also_keyword.text }) ""; keyword: 'abstract' | 'as' | 'base' | 'bool' | 'break' | 'byte' | 'case' | 'catch' | 'char' | 'checked' | 'class' | 'const' | 'continue' | 'decimal' | 'default' | 'delegate' | 'do' | 'double' | 'else' | 'enum' | 'event' | 'explicit' | 'extern' | 'false' | 'finally' | 'fixed' | 'float' | 'for' | 'foreach' | 'goto' | 'if' | 'implicit' | 'in' | 'int' | 'interface' | 'internal' | 'is' | 'lock' | 'long' | 'namespace' | 'new' | 'null' | 'object' | 'operator' | 'out' | 'override' | 'params' | 'private' | 'protected' | 'public' | 'readonly' | 'ref' | 'return' | 'sbyte' | 'sealed' | 'short' | 'sizeof' | 'stackalloc' | 'static' | 'string' | 'struct' | 'switch' | 'this' | 'throw' | 'true' | 'try' | 'typeof' | 'uint' | 'ulong' | 'unchecked' | 'unsafe' | 'ushort' | 'using' | 'virtual' | 'void' | 'volatile' ; diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g index 5f01647..39f5b38 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g @@ -15,7 +15,7 @@ options { } compilation_unit: - ^(PACKAGE PAYLOAD type_declaration); + ^(PACKAGE PAYLOAD modifiers? type_declaration); type_declaration: class_declaration @@ -32,8 +32,8 @@ namespace_name modifiers: modifier+ ; modifier: - 'new' | 'public' | 'protected' | 'private' | 'internal' | 'unsafe' | 'abstract' | 'sealed' | 'static' - | 'readonly' | 'volatile' | 'extern' | 'virtual' | 'override'; + 'new' | 'public' | 'protected' | 'private' | 'abstract' | 'sealed' | 'static' + | 'readonly' | 'volatile' | 'extern' | 'virtual' | 'override' | FINAL ; class_member_declaration: attributes? @@ -595,11 +595,11 @@ enum_declaration: enum_base: ':' integral_type ; enum_body: - '{' (enum_member_declarations ','?)? '}' ; + ^(ENUM_BODY enum_member_declarations) ; enum_member_declarations: - enum_member_declaration (',' enum_member_declaration)* ; + enum_member_declaration+ ; enum_member_declaration: - attributes? identifier ('=' expression)? ; + attributes? identifier ; //enum_modifiers: // enum_modifier+ ; //enum_modifier: diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g index 711b746..0f5a258 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g @@ -8,6 +8,10 @@ options { tokens { PACKAGE; + ENUM_BODY; + + FINAL; /* final modifier */ + PAYLOAD; // carries arbitrary text for the output file } diff --git a/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg b/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg index 6050735..bdc66c1 100644 --- a/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg +++ b/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg @@ -16,13 +16,34 @@ itsmine(now, includeDate) ::= << >> -package(now, includeDate, packageName, comments, type, endComments) ::= << +package(now, includeDate, packageName, comments, modifiers, type, endComments) ::= << package ; - + >> + + +enum(comments, attributes, name, body) ::= << + +enum +{ + +} +>> + +enum_body(values) ::= "" + +enum_member(comments, value) ::= << + + +>> + +modifiers(mods) ::= "" + +// utility +string(payload) ::= ""