1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

lots of treeifying and removed ambiguities

This commit is contained in:
Kevin Glynn 2010-12-01 17:02:06 +01:00
parent b48d69e443
commit d0a695315a
7 changed files with 341 additions and 215 deletions

View File

@ -14,6 +14,6 @@ java -Xmx512m -jar ../../../jar/antlr-3.3.jar -Xconversiontimeout 5000 -make -ve
# echo JavaPrettyPrint.g
java -Xmx512m -jar ../../../jar/antlr-3.3.jar -Xconversiontimeout 10000 -make -verbose JavaPrettyPrint.g
cd ../../../
#xbuild
xbuild
echo 'All Done'

View File

@ -50,9 +50,14 @@ namespace RusticiSoftware.Translator.AntlrUtils
}
public static void DumpNodesFlat(CommonTreeNodeStream nodes)
{
DumpNodesFlat(nodes, "Nodes");
}
public static void DumpNodesFlat(CommonTreeNodeStream nodes, string title)
{
Console.ForegroundColor = ConsoleColor.Magenta;
Console.WriteLine("Nodes");
Console.WriteLine(title);
//object o_prev = string.Empty;
object o = nodes.NextElement();
while (!nodes.IsEndOfFile(o))
@ -89,7 +94,7 @@ namespace RusticiSoftware.Translator.AntlrUtils
}
// if (o_prev.ToString() != "UP" && o_prev.ToString() != "DOWN")
// Console.Write(" {0}", o_prev.ToString());
// Console.WriteLine();
Console.WriteLine();
Console.ResetColor();
}

View File

@ -272,8 +272,12 @@ namespace RusticiSoftware.Translator.CSharp
long startTime = DateTime.Now.Ticks;
if (cfg.DebugLevel > 3) Console.Out.WriteLine("Translating file {0}", fullName);
if (cfg.DebugLevel > 5) Console.Out.WriteLine("Parsing file {0}", fullName);
ITreeNodeStream csTree = parseFile(fullName);
if (cfg.DumpCSharp && csTree != null) AntlrUtils.AntlrUtils.DumpNodes((CommonTreeNodeStream)csTree);
CommonTreeNodeStream csTree = parseFile(fullName);
if (cfg.DumpCSharp && csTree != null)
{
AntlrUtils.AntlrUtils.DumpNodesFlat(csTree, "C Sharp Parse Tree");
csTree.Reset();
}
if (csTree != null)
{
@ -327,7 +331,11 @@ namespace RusticiSoftware.Translator.CSharp
// Translate calls to .Net to calls to Java libraries
CommonTreeNodeStream javaSyntaxNodes = new CommonTreeNodeStream(typeAST);
if (cfg.DumpJavaSyntax && javaSyntaxNodes != null) AntlrUtils.AntlrUtils.DumpNodesFlat(javaSyntaxNodes);
if (cfg.DumpJavaSyntax && javaSyntaxNodes != null)
{
AntlrUtils.AntlrUtils.DumpNodesFlat(javaSyntaxNodes, "Java Syntax Parse Tree for " + claName);
javaSyntaxNodes.Reset();
}
javaSyntaxNodes.TokenStream = csTree.TokenStream;
NetMaker netMaker = new NetMaker(javaSyntaxNodes);
@ -342,6 +350,11 @@ namespace RusticiSoftware.Translator.CSharp
CommonTreeNodeStream javaCompilationUnitNodes = new CommonTreeNodeStream(javaCompilationUnit.Tree);
javaCompilationUnitNodes.TokenStream = csTree.TokenStream;
if (cfg.DumpJava && javaCompilationUnitNodes != null)
{
AntlrUtils.AntlrUtils.DumpNodesFlat(javaCompilationUnitNodes, "Final Java Parse Tree for " + claName);
javaCompilationUnitNodes.Reset();
}
// Pretty print java parse tree as text
JavaPrettyPrint outputMaker = new JavaPrettyPrint(javaCompilationUnitNodes);
outputMaker.Filename = fullName;

View File

@ -164,41 +164,42 @@ modifier:
| 'readonly' -> FINAL["final"] | 'volatile' | 'extern' | 'virtual' | 'override';
class_member_declaration:
attributes?
a=attributes?
m=modifiers?
( 'const' type constant_declarators ';'
| event_declaration // 'event'
| p='partial' { Warning($p.line, "[UNSUPPORTED] 'partial' definition"); } (method_declaration
| interface_declaration
| class_declaration
| struct_declaration)
| interface_declaration // 'interface'
| 'void' method_declaration
| type ( (member_name '(') => method_declaration
| (member_name '{') => property_declaration
| (member_name '.' 'this') => type_name '.' indexer_declaration
| indexer_declaration //this
| field_declaration // qid
| operator_declaration
( c='const' ct=type constant_declarators ';' -> ^(CONST[$c.token, "CONST"] $a? $m? $ct constant_declarators)
| ed=event_declaration -> ^(EVENT[$ed.start.Token, "EVENT"] $a? $m? $ed)
| p='partial' { Warning($p.line, "[UNSUPPORTED] 'partial' definition"); } (v1='void' m3=method_declaration -> ^(METHOD[$v1.token, "METHOD"] $a? $m? ^(TYPE $v1) $m3)
| i1=interface_declaration -> ^(INTERFACE[$i1.start.Token, "INTERFACE"] $a? $m? $i1)
| c1=class_declaration -> ^(CLASS[$c1.start.Token, "CLASS"] $a? $m? $c1)
| s1=struct_declaration) -> ^(CLASS[$s1.start.Token, "CLASS"] $a? $m? $s1)
| i2=interface_declaration -> ^(INTERFACE[$i2.start.Token, "INTERFACE"] $a? $m? $i2) // 'interface'
| v='void' m1=method_declaration -> ^(METHOD[$v.token, "METHOD"] $a? $m? ^(TYPE[$v.token, "TYPE"] $v) $m1)
| t=type ( (member_name '(') => m2=method_declaration -> ^(METHOD[$t.start.Token, "METHOD"] $a? $m? $t $m2)
| (member_name '{') => property_declaration -> ^(PROPERTY[$t.start.Token, "PROPERTY"] $a? $m? $t property_declaration)
| (member_name '.' 'this') => type_name '.' ix1=indexer_declaration -> ^(INDEXER[$t.start.Token, "INDEXER"] $a? $m? $t type_name $ix1)
| ix2=indexer_declaration -> ^(INDEXER[$t.start.Token,"INDEXER"] $a? $m? $t $ix2) //this
| field_declaration -> ^(FIELD[$t.start.Token, "FIELD"] $a? $m? $t field_declaration) // qid
| operator_declaration -> ^(OPERATOR[$t.start.Token, "OPERATOR"] $a? $m? $t operator_declaration)
)
// common_modifiers// (method_modifiers | field_modifiers)
| class_declaration // 'class'
| struct_declaration // 'struct'
| enum_declaration // 'enum'
| delegate_declaration // 'delegate'
| conversion_operator_declaration
| constructor_declaration // | static_constructor_declaration
| destructor_declaration
| c3=class_declaration -> ^(CLASS[$c3.start.Token, "CLASS"] $a? $m? $c3) // 'class'
| s3=struct_declaration -> ^(CLASS[$s3.start.Token, "CLASS"] $a? $m? $s3)
| e3=enum_declaration -> ^(ENUM[$e3.start.Token, "ENUM"] $a? $m? $e3)
| d3=delegate_declaration -> ^(DELEGATE[$d3.start.Token, "DELEGATE"] $a? $m? $d3)
| co3=conversion_operator_declaration -> ^(CONVERSION_OPERATOR[$co3.start.Token, "CONVERSION"] $a? $m? $co3)
| con3=constructor_declaration -> ^(CONSTRUCTOR[$con3.start.Token, "CONSTRUCTOR"] $a? $m? $con3)
| de3=destructor_declaration -> ^(DESTRUCTOR[$de3.start.Token, "DESTRUCTOR"] $a? $m? $de3)
)
;
primary_expression:
('this' brackets) => 'this' brackets primary_expression_part*
| ('base' brackets) => 'this' brackets primary_expression_part*
| primary_expression_start primary_expression_part*
('this' brackets[null]) => (t='this' -> $t) (b1=brackets[$primary_expression.tree] -> $b1) (pp1=primary_expression_part[$primary_expression.tree] -> $pp1) *
| ('base' brackets[null]) => (b='this' -> $b) (b2=brackets[$primary_expression.tree] -> $b2) (pp2=primary_expression_part[$primary_expression.tree] -> $pp2) *
| (primary_expression_start -> primary_expression_start) (pp3=primary_expression_part[$primary_expression.tree] -> $pp3 )*
// keving:TODO fixup
| 'new' ( (object_creation_expression ('.'|'->'|'[')) =>
object_creation_expression primary_expression_part+ // new Foo(arg, arg).Member
object_creation_expression primary_expression_part[null]+ // new Foo(arg, arg).Member
// try the simple one first, this has no argS and no expressions
// symantically could be object creation
| (delegate_creation_expression) => delegate_creation_expression// new FooDelegate (MyFunction)
@ -222,23 +223,25 @@ primary_expression_start:
| literal
;
primary_expression_part:
access_identifier
| brackets_or_arguments
| '++'
| '--' ;
access_identifier:
access_operator type_or_generic ;
primary_expression_part [CommonTree lhs]:
access_identifier[$lhs]
| brackets_or_arguments[$lhs]
| p='++' -> ^(POSTINC[$p.token, "POST++"] { (CommonTree)adaptor.DupTree($lhs) } )
| m='--' -> ^(POSTDEC[$m.token, "POST--"] { (CommonTree)adaptor.DupTree($lhs) } )
;
access_identifier [CommonTree lhs]:
access_operator type_or_generic -> ^(access_operator { (CommonTree)adaptor.DupTree($lhs) } type_or_generic);
access_operator:
'.' | '->' ;
brackets_or_arguments:
brackets | arguments ;
brackets:
'[' expression_list? ']' ;
brackets_or_arguments [CommonTree lhs]:
brackets[$lhs] | arguments[$lhs] ;
brackets [CommonTree lhs]:
'[' expression_list? ']' -> ^(INDEX { (CommonTree)adaptor.DupTree($lhs) } expression_list?);
// keving: TODO: drop this.
paren_expression:
'(' expression ')' ;
arguments:
'(' argument_list? ')' ;
'(' expression ')' -> ^(TEMPPARENS expression);
arguments [CommonTree lhs]:
'(' argument_list? ')' -> ^(APPLY { (CommonTree)adaptor.DupTree($lhs) } argument_list?);
argument_list:
argument (',' argument)*;
// 4.0
@ -291,12 +294,12 @@ primary_or_array_creation_expression:
;
// new Type[2] { }
array_creation_expression:
'new'
'new'^
(type ('[' expression_list ']'
( rank_specifiers? array_initializer? // new int[4]
// | invocation_part*
| ( ((arguments ('['|'.'|'->')) => arguments invocation_part)// new object[2].GetEnumerator()
| invocation_part)* arguments
| ( ((arguments[null] ('['|'.'|'->')) => arguments[ (CommonTree)adaptor.Create(KGHOLE, "KGHOLE") ] invocation_part)// new object[2].GetEnumerator()
| invocation_part)* arguments[ (CommonTree)adaptor.Create(KGHOLE, "KGHOLE") ]
) // new int[4]()
| array_initializer
)
@ -311,15 +314,15 @@ variable_initializer_list:
variable_initializer:
expression | array_initializer ;
sizeof_expression:
'sizeof' '(' unmanaged_type ')';
'sizeof'^ '('! unmanaged_type ')'!;
checked_expression:
'checked' '(' expression ')' ;
'checked'^ '('! expression ')'! ;
unchecked_expression:
'unchecked' '(' expression ')' ;
'unchecked'^ '('! expression ')'! ;
default_value_expression:
'default' '(' type ')' ;
'default'^ '('! type ')'! ;
anonymous_method_expression:
'delegate' explicit_anonymous_function_signature? block;
'delegate'^ explicit_anonymous_function_signature? block;
explicit_anonymous_function_signature:
'(' explicit_anonymous_function_parameter_list? ')' ;
explicit_anonymous_function_parameter_list:
@ -366,9 +369,9 @@ initializer_value:
///////////////////////////////////////////////////////
typeof_expression:
'typeof' '(' ((unbound_type_name) => unbound_type_name
'typeof'^ '('! ((unbound_type_name) => unbound_type_name
| type
| 'void') ')' ;
| 'void') ')'! ;
// unbound type examples
//foo<bar<X<>>>
//bar::foo<>
@ -423,7 +426,7 @@ qid_start returns [string name, List<String> tyargs]:
qid_part:
access_identifier ;
access_identifier[ (CommonTree)adaptor.Create(KGHOLE, "KGHOLE") ] ;
generic_argument_list returns [List<string> tyargs]
@after {
@ -442,12 +445,12 @@ type returns [string thetext]:
((predefined_type | type_name) rank_specifiers) => (p1=predefined_type { $thetext = $p1.thetext; } | tn1=type_name { $thetext = $tn1.thetext; }) rs=rank_specifiers { $thetext += $rs.text; } (s1+='*' { $thetext += "*"; })* -> ^(TYPE $p1? $tn1? $rs $s1*)
| ((predefined_type | type_name) ('*'+ | '?')) => (p2=predefined_type { $thetext = $p2.thetext; } | tn2=type_name { $thetext = $tn2.thetext; }) ((s2+='*' { $thetext += "*"; })+ | o2='?' { $thetext += "?"; }) -> ^(TYPE $p2? $tn2? $s2* $o2?)
| (p3=predefined_type { $thetext = $p3.thetext; } | tn3=type_name { $thetext = $tn3.thetext; }) -> ^(TYPE $p3? $tn3?)
| v='void' { $thetext = "System.Void"; } (s+='*' { $thetext += "*"; })+ -> ^(TYPE $v $s+)
| v='void' { $thetext = "System.Void"; } (s+='*' { $thetext += "*"; })+ -> ^(TYPE[$v.token, "TYPE"] $v $s+)
;
non_nullable_type:
type
(p=predefined_type | t=type_name) rs=rank_specifiers? (s+='*')* -> ^(TYPE["TYPE"] $p? $t? $rs? $s*)
| v='void' (s+='*')+ -> ^(TYPE[$v.token,"TYPE"] $v $s+)
;
non_array_type:
type;
array_type:
@ -482,30 +485,30 @@ assignment:
unary_expression assignment_operator expression ;
unary_expression:
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
(cast_expression) => cast_expression
| primary_or_array_creation_expression
| '+' unary_expression
| '-' unary_expression
| '!' unary_expression
| '~' unary_expression
| pre_increment_expression
| pre_decrement_expression
| pointer_indirection_expression
| addressof_expression
(cast_expression) => cast_expression
| primary_or_array_creation_expression -> primary_or_array_creation_expression
| p='+' unary_expression -> ^(MONOPLUS[$p.token,"MONOPLUS"] unary_expression)
| m='-' unary_expression -> ^(MONOMINUS[$m.token, "MONOMINUS"] unary_expression)
| n='!' unary_expression -> ^(MONONOT[$n.token, "MONONOT"] unary_expression)
| t='~' unary_expression -> ^(MONOTWIDDLE[$t.token, "TWIDDLE"] unary_expression)
| pre_increment_expression -> pre_increment_expression
| pre_decrement_expression -> pre_decrement_expression
| pointer_indirection_expression -> pointer_indirection_expression
| addressof_expression -> addressof_expression
;
cast_expression:
//'(' type ')' unary_expression ;
'(' type ')' unary_expression -> ^(CAST_EXPR type unary_expression);
// //'(' type ')' unary_expression ;
l='(' type ')' unary_expression -> ^(CAST_EXPR[$l.token, "CAST"] type unary_expression);
assignment_operator:
'=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>' '>=' ;
pre_increment_expression:
'++' unary_expression ;
s='++' unary_expression -> ^(PREINC[$s.token, "PRE++"] unary_expression) ;
pre_decrement_expression:
'--' unary_expression ;
s='--' unary_expression -> ^(PREDEC[$s.token, "PRE--"] unary_expression);
pointer_indirection_expression:
'*' unary_expression ;
s='*' unary_expression -> ^(MONOSTAR[$s.token, "STAR"] unary_expression);
addressof_expression:
'&' unary_expression ;
a='&' unary_expression -> ^(ADDRESSOF[$a.token, "ADDRESSOF"] unary_expression);
non_assignment_expression:
//'non ASSIGNment'
@ -553,8 +556,9 @@ conditional_or_expression:
null_coalescing_expression:
conditional_or_expression ('??'^ conditional_or_expression)* ;
conditional_expression:
(null_coalescing_expression '?' expression ':') => e1=null_coalescing_expression q='?' e2=expression ':' e3=expression -> ^(COND_EXPR[$q.Token, "?:"] $e1 $e2 $e3)
| null_coalescing_expression ;
(ne=null_coalescing_expression -> $ne) (q='?' te=expression ':' ee=expression -> ^(COND_EXPR[$q.token, "?:"] $conditional_expression $te $ee))? ;
// (null_coalescing_expression '?' expression ':') => e1=null_coalescing_expression q='?' e2=expression ':' e3=expression -> ^(COND_EXPR[$q.token, "?:"] $e1 $e2 $e3)
// | null_coalescing_expression ;
///////////////////////////////////////////////////////
// lambda Section
@ -854,7 +858,7 @@ constructor_constraint:
'new' '(' ')' ;
return_type:
type
| v='void' -> ^(TYPE $v);
| v='void' -> ^(TYPE[$v.token, "TYPE"] $v);
formal_parameter_list:
formal_parameter (',' formal_parameter)* ;
formal_parameter:
@ -1021,8 +1025,8 @@ destructor_body:
///////////////////////////////////////////////////////
invocation_expression:
invocation_start (((arguments ('['|'.'|'->')) => arguments invocation_part)
| invocation_part)* arguments ;
invocation_start (((arguments[null] ('['|'.'|'->')) => arguments[ (CommonTree)adaptor.Create(KGHOLE, "KGHOLE") ] invocation_part)
| invocation_part)* arguments[ (CommonTree)adaptor.Create(KGHOLE, "KGHOLE") ] ;
invocation_start:
predefined_type
| (identifier generic_argument_list) => identifier generic_argument_list
@ -1032,8 +1036,8 @@ invocation_start:
| typeof_expression // typeof(Foo).Name
;
invocation_part:
access_identifier
| brackets ;
access_identifier[ (CommonTree)adaptor.Create(KGHOLE, "KGHOLE") ]
| brackets[ (CommonTree)adaptor.Create(KGHOLE, "KGHOLE") ] ;
///////////////////////////////////////////////////////

View File

@ -91,39 +91,61 @@ modifier
-> string(payload={$m.text});
class_member_declaration:
attributes?
m=modifiers?
( 'const' t1=type constant_declarators ';'
| event_declaration // 'event'
| 'partial' (method_declaration
| interface_declaration[$m.st]
| class_declaration[$m.st]
| struct_declaration)
| interface_declaration[$m.st] // 'interface'
| 'void' method_declaration
| t2=type ( (member_name '(') => method_declaration
| (member_name '{') => property_declaration
| (member_name '.' 'this') => type_name '.' indexer_declaration
| indexer_declaration //this
| field_declaration -> field(modifiers={$m.st}, type={$t2.st}, field={$field_declaration.st}) // qid
| operator_declaration
)
// common_modifiers// (method_modifiers | field_modifiers)
| c2=class_declaration[$m.st] -> { $c2.st } // 'class'
| s2=struct_declaration -> { $s2.st }// 'struct'
| e2=enum_declaration[$m.st] -> { $e2.st } // 'enum'
| delegate_declaration // 'delegate'
| conversion_operator_declaration
| constructor_declaration // | static_constructor_declaration
| destructor_declaration
)
;
^(CONST attributes? modifiers? type constant_declarators)
| ^(EVENT attributes? modifiers? event_declaration)
| ^(METHOD attributes? modifiers? type method_declaration)
| ^(INTERFACE attributes? modifiers? interface_declaration[$modifiers.st])
| ^(CLASS attributes? modifiers? class_declaration[$modifiers.st])
| ^(PROPERTY attributes? modifiers? type property_declaration)
| ^(INDEXER attributes? modifiers? type type_name? indexer_declaration)
| ^(FIELD attributes? modifiers? type field_declaration) -> field(modifiers={$modifiers.st}, type={$type.st}, field={$field_declaration.st})
| ^(OPERATOR attributes? modifiers? type operator_declaration)
| ^(ENUM attributes? modifiers? enum_declaration[$modifiers.st])
| ^(DELEGATE attributes? modifiers? delegate_declaration)
| ^(CONSTRUCTOR attributes? modifiers? constructor_declaration)
| ^(DESTRUCTOR attributes? modifiers? destructor_declaration)
;
// class_member_declaration:
// attributes?
// m=modifiers?
// ( 'const' t1=type constant_declarators ';'
// | event_declaration // 'event'
// | 'partial' (method_declaration
// | interface_declaration[$m.st]
// | class_declaration[$m.st]
// | struct_declaration)
// | interface_declaration[$m.st] // 'interface'
// // | 'void' method_declaration
// | t2=type ( (member_name '(') => method_declaration
// | (member_name '{') => property_declaration
// | (member_name '.' 'this') => type_name '.' indexer_declaration
// | indexer_declaration //this
// | field_declaration -> field(modifiers={$m.st}, type={$t2.st}, field={$field_declaration.st}) // qid
// | operator_declaration
// )
// // common_modifiers// (method_modifiers | field_modifiers)
//
// | c2=class_declaration[$m.st] -> { $c2.st } // 'class'
// | s2=struct_declaration -> { $s2.st }// 'struct'
// | e2=enum_declaration[$m.st] -> { $e2.st } // 'enum'
// | delegate_declaration // 'delegate'
// | conversion_operator_declaration
// | constructor_declaration // | static_constructor_declaration
// | destructor_declaration
// )
// ;
//
primary_expression:
('this' brackets) => 'this' brackets primary_expression_part*
| ('base' brackets) => 'this' brackets primary_expression_part*
| primary_expression_start pp+=primary_expression_part* -> primary_expression_start_parts(start={ $primary_expression_start.st }, follows={ $pp })
^(INDEX expression expression_list?)
| ^(APPLY expression argument_list?)
| ^(POSTINC expression)
| ^(POSTDEC expression)
| primary_expression_start -> { $primary_expression_start.st }
| ^(access_operator expression type_or_generic)
// ('this' brackets) => 'this' brackets primary_expression_part*
// | ('base' brackets) => 'this' brackets primary_expression_part*
// | primary_expression_start primary_expression_part*
| 'new' ( (object_creation_expression ('.'|'->'|'[')) =>
object_creation_expression primary_expression_part+ // new Foo(arg, arg).Member
// try the simple one first, this has no argS and no expressions
@ -137,6 +159,23 @@ primary_expression:
| default_value_expression // default
| anonymous_method_expression // delegate (int foo) {}
;
// primary_expression:
// ('this' brackets) => 'this' brackets primary_expression_part*
// | ('base' brackets) => 'this' brackets primary_expression_part*
// | primary_expression_start pp+=primary_expression_part* -> primary_expression_start_parts(start={ $primary_expression_start.st }, follows={ $pp })
// | 'new' ( (object_creation_expression ('.'|'->'|'[')) =>
// object_creation_expression primary_expression_part+ // new Foo(arg, arg).Member
// // try the simple one first, this has no argS and no expressions
// // symantically could be object creation
// | (delegate_creation_expression) => delegate_creation_expression// new FooDelegate (MyFunction)
// | object_creation_expression
// | anonymous_object_creation_expression) // new {int X, string Y}
// | sizeof_expression // sizeof (struct)
// | checked_expression // checked (...
// | unchecked_expression // unchecked {...}
// | default_value_expression // default
// | anonymous_method_expression // delegate (int foo) {}
// ;
primary_expression_start:
predefined_type
@ -144,7 +183,7 @@ primary_expression_start:
| identifier ('::' identifier)?
| 'this'
| 'base'
| paren_expression
| ^(TEMPPARENS expression) -> template(e={$expression.st}) "(<e>)"
| typeof_expression // typeof(Foo).Name
| literal -> { $literal.st }
;
@ -212,7 +251,7 @@ primary_or_array_creation_expression:
;
// new Type[2] { }
array_creation_expression:
'new'
^('new'
(type ('[' expression_list ']'
( rank_specifiers? array_initializer? // new int[4]
// | invocation_part*
@ -224,7 +263,7 @@ array_creation_expression:
| rank_specifier // [,]
(array_initializer // var a = new[] { 1, 10, 100, 1000 }; // int[]
)
) ;
)) ;
array_initializer:
'{' variable_initializer_list? ','? '}' ;
variable_initializer_list:
@ -232,15 +271,15 @@ variable_initializer_list:
variable_initializer:
expression -> { $expression.st } | array_initializer -> { $array_initializer.st };
sizeof_expression:
'sizeof' '(' unmanaged_type ')';
^('sizeof' unmanaged_type );
checked_expression:
'checked' '(' expression ')' ;
^('checked' expression ) ;
unchecked_expression:
'unchecked' '(' expression ')' ;
^('unchecked' expression ) ;
default_value_expression:
'default' '(' type ')' ;
^('default' type ) ;
anonymous_method_expression:
'delegate' explicit_anonymous_function_signature? block;
^('delegate' explicit_anonymous_function_signature? block);
explicit_anonymous_function_signature:
'(' explicit_anonymous_function_parameter_list? ')' ;
explicit_anonymous_function_parameter_list:
@ -287,9 +326,7 @@ initializer_value:
///////////////////////////////////////////////////////
typeof_expression:
'typeof' '(' ((unbound_type_name) => unbound_type_name
| type
| 'void') ')' ;
^('typeof' (unbound_type_name | type | 'void') ) ;
// unbound type examples
//foo<bar<X<>>>
//bar::foo<>
@ -351,7 +388,7 @@ type
List<string> stars = new List<string>();
string opt = null;
}:
^(TYPE (tp=predefined_type {nm=$tp.st;} | tn=type_name {nm=$tn.st;}) rank_specifiers? ('*' { stars.Add("*");})* ('?' { opt = "?";} )?) -> type(name={ nm }, stars={ stars }, rs={ $rank_specifiers.st }, opt={ opt })
^(TYPE (tp=predefined_type {nm=$tp.st;} | tn=type_name {nm=$tn.st;} | tv='void' {nm=new StringTemplate("void");}) rank_specifiers? ('*' { stars.Add("*");})* ('?' { opt = "?";} )?) -> type(name={ nm }, stars={ stars }, rs={ $rank_specifiers.st }, opt={ opt })
;
non_nullable_type:
type -> { $type.st } ;
@ -391,29 +428,41 @@ assignment:
unary_expression:
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
// ^(CAST_EXPR type expression)
(cast_expression) => cast_expression
^(CAST_EXPR type u0=unary_expression) -> cast_expr(type= { $type.st}, exp = { $u0.st})
| primary_or_array_creation_expression -> { $primary_or_array_creation_expression.st }
| '+' u1=unary_expression -> template(e={$u1.st}) "+<e>"
| '-' u2=unary_expression -> template(e={$u2.st}) "-<e>"
| '!' u3=unary_expression -> template(e={$u3.st}) "!<e>"
| '~' u4=unary_expression -> template(e={$u4.st}) "~<e>"
| pre_increment_expression
| pre_decrement_expression
| pointer_indirection_expression
| addressof_expression
;
cast_expression:
^(CAST_EXPR type unary_expression ) -> cast_expr(type= { $type.st}, exp = { $unary_expression.st});
assignment_operator:
| ^(MONOPLUS u1=unary_expression) -> template(e={$u1.st}) "+<e>"
| ^(MONOMINUS u2=unary_expression) -> template(e={$u2.st}) "-<e>"
| ^(MONONOT u3=unary_expression) -> template(e={$u3.st}) "!<e>"
| ^(MONOTWIDDLE u4=unary_expression) -> template(e={$u4.st}) "~<e>"
| ^(PREINC u5=unary_expression) -> template(e={$u5.st}) "++<e>"
| ^(PREDEC u6=unary_expression) -> template(e={$u6.st}) "--<e>"
| ^(MONOSTAR unary_expression)
| ^(ADDRESSOF unary_expression)
;
// (cast_expression) => cast_expression
// | primary_or_array_creation_expression -> { $primary_or_array_creation_expression.st }
// | '+' u1=unary_expression -> template(e={$u1.st}) "+<e>"
// | '-' u2=unary_expression -> template(e={$u2.st}) "-<e>"
// | '!' u3=unary_expression -> template(e={$u3.st}) "!<e>"
// | '~' u4=unary_expression -> template(e={$u4.st}) "~<e>"
// | pre_increment_expression
// | pre_decrement_expression
// | pointer_indirection_expression
// | addressof_expression
// ;
// cast_expression:
// ^(CAST_EXPR type unary_expression ) -> cast_expr(type= { $type.st}, exp = { $unary_expression.st});
assignment_operator:
'=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>' '>=' ;
pre_increment_expression:
'++' unary_expression ;
pre_decrement_expression:
'--' unary_expression ;
pointer_indirection_expression:
'*' unary_expression ;
addressof_expression:
'&' unary_expression ;
// pre_increment_expression:
// '++' unary_expression ;
// pre_decrement_expression:
// '--' unary_expression ;
// pointer_indirection_expression:
// '*' unary_expression ;
// addressof_expression:
// '&' unary_expression ;
non_assignment_expression:
//'non ASSIGNment'
@ -887,9 +936,14 @@ invocation_part:
///////////////////////////////////////////////////////
// keving: split statement into two parts, there seems to be a problem with the state
// machine if we combine statement and statement_plus.
statement:
(declaration_statement) => declaration_statement
| (identifier ':') => labeled_statement
| statement_plus
;
statement_plus:
(identifier ':') => labeled_statement
| embedded_statement
;
embedded_statement:

View File

@ -36,39 +36,60 @@ modifier:
| 'readonly' | 'volatile' | 'extern' | 'virtual' | 'override' | FINAL ;
class_member_declaration:
attributes?
m=modifiers?
( 'const' type constant_declarators ';'
| event_declaration // 'event'
| 'partial' (method_declaration
| interface_declaration
| class_declaration
| struct_declaration)
| interface_declaration // 'interface'
| 'void' method_declaration
| type ( (member_name '(') => method_declaration
| (member_name '{') => property_declaration
| (member_name '.' 'this') => type_name '.' indexer_declaration
| indexer_declaration //this
| field_declaration // qid
| operator_declaration
)
// common_modifiers// (method_modifiers | field_modifiers)
| class_declaration // 'class'
| struct_declaration // 'struct'
| enum_declaration // 'enum'
| delegate_declaration // 'delegate'
| conversion_operator_declaration
| constructor_declaration // | static_constructor_declaration
| destructor_declaration
)
;
^(CONST attributes? modifiers? type constant_declarators)
| ^(EVENT attributes? modifiers? event_declaration)
| ^(METHOD attributes? modifiers? type method_declaration)
| ^(INTERFACE attributes? modifiers? interface_declaration)
| ^(CLASS attributes? modifiers? class_declaration)
| ^(PROPERTY attributes? modifiers? type property_declaration)
| ^(INDEXER attributes? modifiers? type type_name? indexer_declaration)
| ^(FIELD attributes? modifiers? type field_declaration)
| ^(OPERATOR attributes? modifiers? type operator_declaration)
| ^(ENUM attributes? modifiers? enum_declaration)
| ^(DELEGATE attributes? modifiers? delegate_declaration)
| ^(CONSTRUCTOR attributes? modifiers? constructor_declaration)
| ^(DESTRUCTOR attributes? modifiers? destructor_declaration)
;
// class_member_declaration:
// attributes?
// m=modifiers?
// ( 'const' type constant_declarators ';'
// | event_declaration // 'event'
// | 'partial' (method_declaration
// | interface_declaration
// | class_declaration
// | struct_declaration)
// | interface_declaration // 'interface'
// // | 'void' method_declaration
// | type ( (member_name '(') => method_declaration
// | (member_name '{') => property_declaration
// | (member_name '.' 'this') => type_name '.' indexer_declaration
// | indexer_declaration //this
// | field_declaration // qid
// | operator_declaration
// )
// // common_modifiers// (method_modifiers | field_modifiers)
//
// | class_declaration // 'class'
// | struct_declaration // 'struct'
// | enum_declaration // 'enum'
// | delegate_declaration // 'delegate'
// | conversion_operator_declaration
// | constructor_declaration // | static_constructor_declaration
// | destructor_declaration
// )
// ;
//
primary_expression:
('this' brackets) => 'this' brackets primary_expression_part*
| ('base' brackets) => 'this' brackets primary_expression_part*
| primary_expression_start primary_expression_part*
^(INDEX expression expression_list?)
| ^(APPLY expression argument_list?)
| ^(POSTINC expression)
| ^(POSTDEC expression)
| primary_expression_start
| ^(access_operator expression type_or_generic)
// ('this' brackets) => 'this' brackets primary_expression_part*
// | ('base' brackets) => 'this' brackets primary_expression_part*
// | primary_expression_start primary_expression_part*
| 'new' ( (object_creation_expression ('.'|'->'|'[')) =>
object_creation_expression primary_expression_part+ // new Foo(arg, arg).Member
// try the simple one first, this has no argS and no expressions
@ -89,7 +110,7 @@ primary_expression_start:
| identifier ('::' identifier)?
| 'this'
| 'base'
| paren_expression
| ^(TEMPPARENS expression)
| typeof_expression // typeof(Foo).Name
| literal
;
@ -157,7 +178,7 @@ primary_or_array_creation_expression:
;
// new Type[2] { }
array_creation_expression:
'new'
^('new'
(type ('[' expression_list ']'
( rank_specifiers? array_initializer? // new int[4]
// | invocation_part*
@ -169,7 +190,7 @@ array_creation_expression:
| rank_specifier // [,]
(array_initializer // var a = new[] { 1, 10, 100, 1000 }; // int[]
)
) ;
)) ;
array_initializer:
'{' variable_initializer_list? ','? '}' ;
variable_initializer_list:
@ -177,15 +198,15 @@ variable_initializer_list:
variable_initializer:
expression | array_initializer ;
sizeof_expression:
'sizeof' '(' unmanaged_type ')';
^('sizeof' unmanaged_type );
checked_expression:
'checked' '(' expression ')' ;
^('checked' expression ) ;
unchecked_expression:
'unchecked' '(' expression ')' ;
^('unchecked' expression ) ;
default_value_expression:
'default' '(' type ')' ;
^('default' type ) ;
anonymous_method_expression:
'delegate' explicit_anonymous_function_signature? block;
^('delegate' explicit_anonymous_function_signature? block);
explicit_anonymous_function_signature:
'(' explicit_anonymous_function_parameter_list? ')' ;
explicit_anonymous_function_parameter_list:
@ -232,9 +253,7 @@ initializer_value:
///////////////////////////////////////////////////////
typeof_expression:
'typeof' '(' ((unbound_type_name) => unbound_type_name
| type
| 'void') ')' ;
^('typeof' (unbound_type_name | type | 'void') ) ;
// unbound type examples
//foo<bar<X<>>>
//bar::foo<>
@ -290,7 +309,7 @@ type_arguments:
type (',' type)* ;
type:
^(TYPE (predefined_type | type_name) rank_specifiers? '*'* '?'?);
^(TYPE (predefined_type | type_name | 'void') rank_specifiers? '*'* '?'?);
non_nullable_type:
type;
non_array_type:
@ -331,27 +350,27 @@ unary_expression:
//(cast_expression) => cast_expression
^(CAST_EXPR type unary_expression)
| primary_or_array_creation_expression
| '+' unary_expression
| '-' unary_expression
| '!' unary_expression
| '~' unary_expression
| pre_increment_expression
| pre_decrement_expression
| pointer_indirection_expression
| addressof_expression
| ^(MONOPLUS unary_expression)
| ^(MONOMINUS unary_expression)
| ^(MONONOT unary_expression)
| ^(MONOTWIDDLE unary_expression)
| ^(PREINC unary_expression)
| ^(PREDEC unary_expression)
| ^(MONOSTAR unary_expression)
| ^(ADDRESSOF unary_expression)
;
cast_expression:
'(' type ')' non_assignment_expression ;
//cast_expression:
// '(' type ')' non_assignment_expression ;
assignment_operator:
'=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>' '>=' ;
pre_increment_expression:
'++' unary_expression ;
pre_decrement_expression:
'--' unary_expression ;
pointer_indirection_expression:
'*' unary_expression ;
addressof_expression:
'&' unary_expression ;
//pre_increment_expression:
// '++' unary_expression ;
//pre_decrement_expression:
// '--' unary_expression ;
//pointer_indirection_expression:
// '*' unary_expression ;
//addressof_expression:
// '&' unary_expression ;
non_assignment_expression:
//'non ASSIGNment'
@ -834,13 +853,17 @@ invocation_part:
///////////////////////////////////////////////////////
// keving: split statement into two parts, there seems to be a problem with the state
// machine if we combine statement and statement_plus. (It fails to recognise dataHelper.Add();)
statement:
(declaration_statement) => declaration_statement
| (identifier ':') => labeled_statement
| embedded_statement
(declaration_statement) => declaration_statement
| statement_plus;
statement_plus:
(identifier ':') => labeled_statement
| embedded_statement
;
embedded_statement:
block
block
| selection_statement // if, switch
| iteration_statement // while, do, for, foreach
| jump_statement // break, continue, goto, return, throw

View File

@ -15,6 +15,32 @@ tokens {
FINAL; /* final modifier */
IN;
OUT;
CONST;
EVENT;
METHOD;
PROPERTY;
INDEXER;
FIELD;
OPERATOR;
ENUM;
DELEGATE;
CONVERSION_OPERATOR;
CONSTRUCTOR;
DESTRUCTOR;
MONOPLUS;
MONOMINUS;
MONONOT;
MONOTWIDDLE;
MONOSTAR;
ADDRESSOF;
PREINC;
PREDEC;
POSTINC;
POSTDEC;
TEMPPARENS;
INDEX;
APPLY;
OPEN_BRACKET='[';
CLOSE_BRACKET=']';
@ -35,6 +61,7 @@ tokens {
PAYLOAD; // carries arbitrary text for the output file
PAYLOAD_LIST;
SEP;
KGHOLE;
}
@namespace { RusticiSoftware.Translator.CSharp }
@ -115,7 +142,7 @@ class_member_declaration:
m=modifiers?
( 'const' type constant_declarators ';'
| event_declaration // 'event'
| 'partial' (method_declaration
| 'partial' ('void' method_declaration
| interface_declaration
| class_declaration
| struct_declaration)