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

progress on outputting expressions and if then else

This commit is contained in:
Kevin Glynn 2010-12-09 17:30:11 +01:00
parent 75ffb63350
commit 55363bc038
5 changed files with 153 additions and 99 deletions

View File

@ -7,37 +7,43 @@ namespace RusticiSoftware.Translator.CSharp
public class CS2JSettings public class CS2JSettings
{ {
public bool DisplayTokens { get; set; } public bool DisplayTokens { get; set; }
// dump parse trees to stdout // dump parse trees to stdout
public bool DumpCSharp { get; set; } public bool DumpCSharp { get; set; }
public bool DumpJavaSyntax { get; set; } public bool DumpJavaSyntax { get; set; }
public bool DumpJava { get; set; } public bool DumpJava { get; set; }
public bool DumpXmls { get; set; } public bool DumpXmls { get; set; }
public bool DumpEnums { get; set; } public bool DumpEnums { get; set; }
public string OutDir { get; set; } public string OutDir { get; set; }
public string CheatDir { get; set; } public string CheatDir { get; set; }
public IList<string> NetRoot { get; set; } public IList<string> NetRoot { get; set; }
public IList<string> ExNetRoot { get; set; } public IList<string> ExNetRoot { get; set; }
public IList<string> AppRoot { get; set; } public IList<string> AppRoot { get; set; }
public IList<string> ExAppRoot { get; set; } public IList<string> ExAppRoot { get; set; }
public IList<string> Exclude { get; set; } public IList<string> Exclude { get; set; }
public IList<string> MacroDefines { get; set; } public IList<string> MacroDefines { get; set; }
public string XmlDir { get; set; } public string XmlDir { get; set; }
public string EnumDir { get; set; } public string EnumDir { get; set; }
public int Verbosity { get; set; } public int Verbosity { get; set; }
public int DebugLevel { get; set; }
public bool Warnings { get; set; }
public int DebugLevel { get; set; } private bool translatorKeepParens = true;
public bool TranslatorKeepParens
{
get; set;
}
public bool Warnings { get; set; } public CS2JSettings ()
{
public CS2JSettings ()
{
DisplayTokens = false; DisplayTokens = false;
// dump parse trees to stdout // dump parse trees to stdout
DumpCSharp = false; DumpCSharp = false;
DumpJavaSyntax = false; DumpJavaSyntax = false;
DumpJava = false; DumpJava = false;
@ -53,11 +59,13 @@ namespace RusticiSoftware.Translator.CSharp
Exclude = new List<string>(); Exclude = new List<string>();
MacroDefines = new List<string>(); MacroDefines = new List<string>();
XmlDir = Path.Combine(Directory.GetCurrentDirectory(), "tmpXMLs"); XmlDir = Path.Combine(Directory.GetCurrentDirectory(), "tmpXMLs");
EnumDir = Path.Combine(Directory.GetCurrentDirectory(), "enums"); EnumDir = Path.Combine(Directory.GetCurrentDirectory(), "enums");
Verbosity = 0; Verbosity = 0;
DebugLevel = 0; DebugLevel = 0;
Warnings = false; Warnings = false;
}
TranslatorKeepParens = true;
}
} }
} }

View File

@ -38,7 +38,7 @@ namespace RusticiSoftware.Translator.CSharp
Console.Out.WriteLine(" [-v] (be [somewhat more] verbose, repeat for more verbosity)"); Console.Out.WriteLine(" [-v] (be [somewhat more] verbose, repeat for more verbosity)");
Console.Out.WriteLine(" [-D <macroVariable>] (define <macroVariable>, option can be repeated)"); Console.Out.WriteLine(" [-D <macroVariable>] (define <macroVariable>, option can be repeated)");
Console.Out.WriteLine(" [-showtokens] (the lexer prints the tokenized input to the console)"); Console.Out.WriteLine(" [-showtokens] (the lexer prints the tokenized input to the console)");
Console.Out.WriteLine(" [-dumpcsharp] [-dumpjavasyntax] [-dumpjava] (show parse tree at various stages of the translation)"); Console.Out.WriteLine(" [-dumpcsharp] [-dumpjavasyntax] [-dumpjava] (show parse tree at various stages of the translation)");
Console.Out.WriteLine(" [-dumpxml] [-xmldir <directory to dump xml database>] (dump the translation repository as xml files)"); Console.Out.WriteLine(" [-dumpxml] [-xmldir <directory to dump xml database>] (dump the translation repository as xml files)");
Console.Out.WriteLine(" [-dumpenums <enum xml file>] (create an xml file documenting enums)"); Console.Out.WriteLine(" [-dumpenums <enum xml file>] (create an xml file documenting enums)");
Console.Out.WriteLine(" [-odir <root of translated classes>]"); Console.Out.WriteLine(" [-odir <root of translated classes>]");
@ -48,6 +48,7 @@ namespace RusticiSoftware.Translator.CSharp
Console.Out.WriteLine(" [-appdir <root of C# application>]"); Console.Out.WriteLine(" [-appdir <root of C# application>]");
Console.Out.WriteLine(" [-exappdir <directories/files to be excluded from translation repository>+] (can be multiple directories/files, separated by semi-colons)"); Console.Out.WriteLine(" [-exappdir <directories/files to be excluded from translation repository>+] (can be multiple directories/files, separated by semi-colons)");
Console.Out.WriteLine(" [-exclude <directories/files to be excluded from translation>+] (can be multiple directories/files, separated by semi-colons)"); Console.Out.WriteLine(" [-exclude <directories/files to be excluded from translation>+] (can be multiple directories/files, separated by semi-colons)");
Console.Out.WriteLine(" [-translator-keep-parens <true/false>] (keep parens from source, default true)");
Console.Out.WriteLine(" <directory or file name to be translated>"); Console.Out.WriteLine(" <directory or file name to be translated>");
Environment.Exit(0); Environment.Exit(0);
} }
@ -96,6 +97,7 @@ namespace RusticiSoftware.Translator.CSharp
.Add ("appdir=", dirs => addDirectories(cfg.AppRoot, dirs)) .Add ("appdir=", dirs => addDirectories(cfg.AppRoot, dirs))
.Add ("exappdir=", dirs => addDirectories(cfg.ExAppRoot, dirs)) .Add ("exappdir=", dirs => addDirectories(cfg.ExAppRoot, dirs))
.Add ("exclude=", dirs => addDirectories(cfg.Exclude, dirs)) .Add ("exclude=", dirs => addDirectories(cfg.Exclude, dirs))
.Add ("translator-keep-parens=", v => cfg.TranslatorKeepParens = Boolean.Parse(v))
; ;
//TODO: fix enum dump //TODO: fix enum dump

View File

@ -511,10 +511,10 @@ unary_expression:
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression //('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
(cast_expression) => cast_expression (cast_expression) => cast_expression
| primary_or_array_creation_expression -> primary_or_array_creation_expression | primary_or_array_creation_expression -> primary_or_array_creation_expression
| p='+' unary_expression -> ^(MONOPLUS[$p.token,"MONOPLUS"] unary_expression) | p='+' unary_expression -> ^(MONOPLUS[$p.token,"+"] unary_expression)
| m='-' unary_expression -> ^(MONOMINUS[$m.token, "MONOMINUS"] unary_expression) | m='-' unary_expression -> ^(MONOMINUS[$m.token, "-"] unary_expression)
| n='!' unary_expression -> ^(MONONOT[$n.token, "MONONOT"] unary_expression) | n='!' unary_expression -> ^(MONONOT[$n.token, "!"] unary_expression)
| t='~' unary_expression -> ^(MONOTWIDDLE[$t.token, "TWIDDLE"] unary_expression) | t='~' unary_expression -> ^(MONOTWIDDLE[$t.token, "~"] unary_expression)
| pre_increment_expression -> pre_increment_expression | pre_increment_expression -> pre_increment_expression
| pre_decrement_expression -> pre_decrement_expression | pre_decrement_expression -> pre_decrement_expression
| pointer_indirection_expression -> pointer_indirection_expression | pointer_indirection_expression -> pointer_indirection_expression

View File

@ -208,6 +208,12 @@ options {
public int comparePrecedence(IToken op1, IToken op2) { public int comparePrecedence(IToken op1, IToken op2) {
return Math.Sign(precedence[op2.Type]-precedence[op1.Type]); return Math.Sign(precedence[op2.Type]-precedence[op1.Type]);
} }
public int comparePrecedence(IToken op1, int childPrec) {
return Math.Sign(childPrec-precedence[op1.Type]);
}
public int comparePrecedence(int parentPrec, int childPrec) {
return Math.Sign(childPrec-parentPrec);
}
} }
compilation_unit compilation_unit
@ -296,7 +302,7 @@ class_member_declaration returns [List<String> preComments]:
// //
primary_expression: primary_expression:
^(INDEX expression expression_list?) ^(INDEX expression expression_list?)
| ^(APPLY expression argument_list?) | ^(APPLY expression argument_list?) -> application(func= { $expression.st }, funcparens = { comparePrecedence(APPLY, $expression.precedence) <= 0 }, args = { $argument_list.st } )
| ^(POSTINC expression) | ^(POSTINC expression)
| ^(POSTDEC expression) | ^(POSTDEC expression)
| primary_expression_start -> { $primary_expression_start.st } | primary_expression_start -> { $primary_expression_start.st }
@ -359,7 +365,7 @@ primary_expression_part:
access_identifier: access_identifier:
access_operator type_or_generic ; access_operator type_or_generic ;
access_operator: access_operator:
'.' | '->' ; (op='.' | op='->') -> string(payload = { $op.token.Text }) ;
brackets_or_arguments: brackets_or_arguments:
brackets | arguments ; brackets | arguments ;
brackets: brackets:
@ -558,7 +564,7 @@ type
List<string> stars = new List<string>(); List<string> stars = new List<string>();
string opt = null; string opt = null;
}: }:
^(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 }) ^(TYPE (tp=predefined_type {nm=$tp.st;} | tn=type_name {nm=$tn.st;} | tv='void' { nm=%void();}) rank_specifiers? ('*' { stars.Add("*");})* ('?' { opt = "?";} )?) -> type(name={ nm }, stars={ stars }, rs={ $rank_specifiers.st }, opt={ opt })
; ;
non_nullable_type: non_nullable_type:
type -> { $type.st } ; type -> { $type.st } ;
@ -591,33 +597,45 @@ statement_list:
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
// Expression Section // Expression Section
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
expression: expression returns [int precedence]:
(unary_expression assignment_operator) => assignment (unary_expression assignment_operator) => assignment { $precedence = $assignment.precedence; } -> { $assignment.st }
| non_assignment_expression -> { $non_assignment_expression.st } | non_assignment_expression { $precedence = $non_assignment_expression.precedence; } -> { $non_assignment_expression.st }
; ;
expression_list: expression_list:
expression (',' expression)* ; expression (',' expression)* ;
assignment: assignment returns [int precedence]:
unary_expression assignment_operator expression ; unary_expression assignment_operator expression { $precedence = $assignment_operator.precedence; }
unary_expression: -> assign(lhs={ $unary_expression.st }, assign = { $assignment_operator.st }, rhs = { $expression.st },
lhsparen={ comparePrecedence($assignment_operator.precedence, $unary_expression.precedence) <= 0 },
rhsparen={ comparePrecedence($assignment_operator.precedence, $expression.precedence) < 0});
unary_expression returns [int precedence]
@init {
// By default parens not needed
$precedence = int.MaxValue;
}:
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression //('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
// ^(CAST_EXPR type expression) // ^(CAST_EXPR type expression)
^(CAST_EXPR type u0=unary_expression) -> cast_expr(type= { $type.st}, exp = { $u0.st}) ^(CAST_EXPR type u0=unary_expression) { $precedence = precedence[CAST_EXPR]; } -> cast_expr(type= { $type.st}, exp = { $u0.st})
| primary_or_array_creation_expression -> { $primary_or_array_creation_expression.st } | primary_or_array_creation_expression -> { $primary_or_array_creation_expression.st }
| ^(MONOPLUS u1=unary_expression) -> op(op={"+"}, post={$u1.st}) | ^((op=MONOPLUS | op=MONOMINUS | op=MONONOT | op=MONOTWIDDLE | op=PREINC | op=PREDEC) u1=unary_expression) { $precedence = precedence[$op.token.Type]; }
| ^(MONOMINUS u2=unary_expression) -> op(op={"-"}, post={$u2.st}) -> op(postparen={ comparePrecedence($op.token, $u1.precedence) > 0 }, op={ $op.token.Text }, post={$u1.st})
| ^(MONONOT u3=unary_expression) -> op(op={"!"}, post={$u3.st}) | ^((op=MONOSTAR|op=ADDRESSOF) u1=unary_expression)
| ^(MONOTWIDDLE u4=unary_expression) -> op(op={"~"}, post={$u4.st}) {
| ^(PREINC u5=unary_expression) -> op(op={"++"}, post={$u5.st}) StringTemplate opText = %op();
| ^(PREDEC u6=unary_expression) -> op(op={"--"}, post={$u6.st}) %{opText}.post = $u1.st;
| ^(MONOSTAR unary_expression) %{opText}.op = $op.token.Text;
| ^(ADDRESSOF unary_expression) $st = %unsupported();
// PARENS is not stictly necessary because we insert parens where necessary. However %{$st}.reason = "the " + ($op.token.Type == MONOSTAR ? "pointer indirection" : "address of") + " operator is not supported";
// we maintin parens inserted by original programmer since tey presumably thought %{$st}.text = opText;
// it would improve understandability }
| ^(PARENS expression) -> parens(e={$expression.st}) // PARENS is not strictly necessary because we insert parens where necessary. However
// we maintain parens inserted by original programmer since, presumably, they
// improve understandability
| ^(PARENS expression) { $precedence = Cfg.TranslatorKeepParens ? int.MaxValue : $expression.precedence; }
-> { Cfg.TranslatorKeepParens}? parens(e={$expression.st})
-> {$expression.st}
; ;
// (cast_expression) => cast_expression // (cast_expression) => cast_expression
// | primary_or_array_creation_expression -> { $primary_or_array_creation_expression.st } // | primary_or_array_creation_expression -> { $primary_or_array_creation_expression.st }
// | '+' u1=unary_expression -> template(e={$u1.st}) "+<e>" // | '+' u1=unary_expression -> template(e={$u1.st}) "+<e>"
@ -631,8 +649,9 @@ unary_expression:
// ; // ;
// cast_expression: // cast_expression:
// ^(CAST_EXPR type unary_expression ) -> cast_expr(type= { $type.st}, exp = { $unary_expression.st}); // ^(CAST_EXPR type unary_expression ) -> cast_expr(type= { $type.st}, exp = { $unary_expression.st});
assignment_operator: assignment_operator returns [int precedence]:
'=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>' '>=' ; (op='=' | op='+=' | op='-=' | op='*=' | op='/=' | op='%=' | op='&=' | op='|=' | op='^=' | op='<<=' | op=RIGHT_SHIFT_ASSIGN) { $precedence = precedence[$op.token.Type]; }
-> string(payload = { $op.token.Text });
// pre_increment_expression: // pre_increment_expression:
// '++' unary_expression ; // '++' unary_expression ;
// pre_decrement_expression: // pre_decrement_expression:
@ -642,32 +661,24 @@ unary_expression:
// addressof_expression: // addressof_expression:
// '&' unary_expression ; // '&' unary_expression ;
non_assignment_expression: non_assignment_expression returns [int precedence]
@init {
// By default parens not needed
$precedence = int.MaxValue;
}:
//'non ASSIGNment' //'non ASSIGNment'
(anonymous_function_signature '=>') => lambda_expression (anonymous_function_signature '=>') => lambda_expression
| (query_expression) => query_expression | (query_expression) => query_expression
| ^(COND_EXPR non_assignment_expression non_assignment_expression non_assignment_expression) | ^(COND_EXPR non_assignment_expression non_assignment_expression non_assignment_expression)
| ^('??' non_assignment_expression non_assignment_expression) | ^('??' non_assignment_expression non_assignment_expression)
| ^('||' non_assignment_expression non_assignment_expression) // All these operators have left to right associativity
| ^('&&' non_assignment_expression non_assignment_expression) | ^((op='=='|op='!='|op='||'|op='&&'|op='|'|op='^'|op='&'|op='>'|op='<'|op='>='|op='<='|op='<<'|op='>>'|op='+'|op='-'|op='*'|op='/'|op='%')
| ^('|' non_assignment_expression non_assignment_expression) e1=non_assignment_expression e2=non_assignment_expression)
| ^('^' non_assignment_expression non_assignment_expression) -> op(pre={ $e1.st }, op = { $op.token.Text }, post = { $e2.st }, space = { " " },
| ^('&' non_assignment_expression non_assignment_expression) preparen={ comparePrecedence($op.token, $e1.precedence) < 0 },
| ^('==' non_assignment_expression non_assignment_expression) postparen={ comparePrecedence($op.token, $e2.precedence) <= 0})
| ^('!=' non_assignment_expression non_assignment_expression)
| ^('>' non_assignment_expression non_assignment_expression)
| ^('<' non_assignment_expression non_assignment_expression)
| ^('>=' non_assignment_expression non_assignment_expression)
| ^('<=' non_assignment_expression non_assignment_expression)
| ^(INSTANCEOF non_assignment_expression non_nullable_type) | ^(INSTANCEOF non_assignment_expression non_nullable_type)
| ^('<<' non_assignment_expression non_assignment_expression) | unary_expression { $precedence = $unary_expression.precedence; }-> { $unary_expression.st }
| ^('>>' non_assignment_expression non_assignment_expression)
| ^('+' non_assignment_expression non_assignment_expression)
| ^('-' non_assignment_expression non_assignment_expression)
| ^('*' non_assignment_expression non_assignment_expression)
| ^('/' non_assignment_expression non_assignment_expression)
| ^('%' non_assignment_expression non_assignment_expression)
| unary_expression -> { $unary_expression.st }
; ;
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
@ -732,7 +743,7 @@ group_clause:
where_clause: where_clause:
'where' boolean_expression ; 'where' boolean_expression ;
boolean_expression: boolean_expression:
expression; expression -> { $expression.st };
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
// B.2.13 Attributes // B.2.13 Attributes
@ -1127,9 +1138,13 @@ statement_plus:
(identifier ':') => labeled_statement -> statement(statement = { $labeled_statement.st }) (identifier ':') => labeled_statement -> statement(statement = { $labeled_statement.st })
| embedded_statement -> statement(statement = { $embedded_statement.st }) | embedded_statement -> statement(statement = { $embedded_statement.st })
; ;
embedded_statement: embedded_statement returns [bool isSemi, bool isBraces, bool isIf]
block -> { $block.st } @init {
| selection_statement -> { $selection_statement.st } // if, switch $isBraces = false;
$isIf = false;
}:
block { $isSemi = $block.isSemi; $isBraces = !$block.isSemi;} -> { $block.st }
| selection_statement { $isIf = $selection_statement.isIf; }-> { $selection_statement.st } // if, switch
| iteration_statement -> { $iteration_statement.st } // while, do, for, foreach | iteration_statement -> { $iteration_statement.st } // while, do, for, foreach
| jump_statement -> { $jump_statement.st } // break, continue, goto, return, throw | jump_statement -> { $jump_statement.st } // break, continue, goto, return, throw
| try_statement -> { $try_statement.st } | try_statement -> { $try_statement.st }
@ -1140,7 +1155,7 @@ embedded_statement:
| yield_statement | yield_statement
| unsafe_statement | unsafe_statement
| fixed_statement | fixed_statement
| expression_statement -> { $expression_statement.st } // expression! | expression_statement -> op( pre={ $expression_statement.st }, op={ ";" }) // make an expression a statement, need to terminate with semi
; ;
fixed_statement: fixed_statement:
'fixed' '(' pointer_type fixed_pointer_declarators ')' embedded_statement ; 'fixed' '(' pointer_type fixed_pointer_declarators ')' embedded_statement ;
@ -1161,8 +1176,8 @@ declaration_statement:
local_variable_declaration: local_variable_declaration:
local_variable_type local_variable_declarators -> local_variable_declaration(type={ $local_variable_type.st }, decs = { $local_variable_declarators.st } ); local_variable_type local_variable_declarators -> local_variable_declaration(type={ $local_variable_type.st }, decs = { $local_variable_declarators.st } );
local_variable_type: local_variable_type:
('var') => 'var' -> string(payload = {"/* [UNSUPPORTED] 'var' as type is unsupported */"} ) ('var') => 'var' -> unsupported(reason = {"'var' as type is unsupported"}, text = { "var" } )
| ('dynamic') => 'dynamic' -> string(payload = {"/* [UNSUPPORTED] 'dynamic' as type is unsupported */"} ) | ('dynamic') => 'dynamic' -> unsupported(reason = {"'dynamic' as type is unsupported"}, text = { "dynamic" } )
| type -> { $type.st } ; | type -> { $type.st } ;
local_variable_declarators: local_variable_declarators:
vs+=local_variable_declarator (',' vs+=local_variable_declarator)* -> list(items={$vs}, sep={", "}); vs+=local_variable_declarator (',' vs+=local_variable_declarator)* -> list(items={$vs}, sep={", "});
@ -1185,15 +1200,18 @@ expression_statement:
statement_expression: statement_expression:
expression expression
; ;
selection_statement: selection_statement returns [bool isIf]:
if_statement -> { $if_statement.st } if_statement { $isIf = true; }-> { $if_statement.st }
| switch_statement -> { $switch_statement.st }; | switch_statement { $isIf = false; }-> { $switch_statement.st };
if_statement: if_statement:
// else goes with closest if // else goes with closest if
^(IF boolean_expression SEP embedded_statement else_statement?) -> if(cond= { $boolean_expression.st }, then = { $embedded_statement.st }, else = { $else_statement.st }) ^(IF boolean_expression SEP t=embedded_statement e=else_statement?)
-> if(cond= { $boolean_expression.st },
then = { $t.st }, thensemi = { $t.isSemi }, thenbraces = { $t.isBraces },
else = { $else_statement.st }, elsesemi = { $e.isSemi }, elsebraces = { $e.isBraces }, elseisif = { $e.isIf })
; ;
else_statement: else_statement returns [bool isSemi, bool isBraces, bool isIf]:
'else' embedded_statement -> { $embedded_statement.st } ; 'else' s=embedded_statement { $isSemi = $s.isSemi; $isBraces = $s.isBraces; $isIf = $s.isIf; } -> { $embedded_statement.st } ;
switch_statement: switch_statement:
'switch' '(' expression ')' switch_block ; 'switch' '(' expression ')' switch_block ;
switch_block: switch_block:
@ -1247,7 +1265,7 @@ goto_statement:
return_statement: return_statement:
'return' expression? ';' -> return(exp = { $expression.st }); 'return' expression? ';' -> return(exp = { $expression.st });
throw_statement: throw_statement:
'throw' expression? ';' ; 'throw' expression? ';' -> throw(exp = { $expression.st });
try_statement: try_statement:
'try' block ( catch_clauses finally_clause? 'try' block ( catch_clauses finally_clause?
| finally_clause); | finally_clause);

View File

@ -79,16 +79,17 @@ statement_list(statements) ::= <<
>> >>
statement(statement) ::= << statement(statement) ::= <<
<statement>; <statement>
>> >>
//***** local var declarations: //***** local var declarations:
local_variable_declaration(type,decs) ::= "<type> <decs>" local_variable_declaration(type,decs) ::= "<type> <decs>;"
local_variable_declarator(name, init) ::= "<name><if(init)> = <init><endif>" local_variable_declarator(name, init) ::= "<name><if(init)> = <init><endif>"
return(exp) ::= "return <exp>" return(exp) ::= "return <exp>;"
throw(exp) ::= "throw <exp>;"
// ******* ENUMS *********** // ******* ENUMS ***********
@ -120,24 +121,49 @@ extends(types) ::= "<if(types)>extends <types; separator=\",\"><endif>"
imps(types) ::= "<if(types)>implements <types; separator=\",\"><endif>" imps(types) ::= "<if(types)>implements <types; separator=\",\"><endif>"
// ******* STATEMENTS ******* // ******* STATEMENTS *******
if(cond,then,else) ::= << if(cond,then,thensemi, thenbraces,else, elseisif, elsesemi,elsebraces) ::= <<
if (<cond>) if (<cond>)
<then> <block(statements = then, issemi = thensemi, isbraces = thenbraces)>
<if(else)>
else<if(elseisif)> <block(statements = else, issemi = elsesemi, isbraces = elsebraces)><else>
<block(statements = else, issemi = elsesemi, isbraces = elsebraces)>
<endif>
<endif>
>>
block(statements,issemi,isbraces) ::= <<
<if(issemi)>
;
<else> <else>
<if(isbraces)>
{
<endif>
<statements>
<if(isbraces)>
}
<endif>
<endif>
>> >>
// ******* EXPRESSIONS ******* // ******* EXPRESSIONS *******
cast_expr(type, exp) ::= "(<type>)<exp>" cast_expr(type, exp) ::= "(<type>)<exp>"
construct(type, args, inits) ::= "new <type>(<args>)<if(inits)> /* [UNIMPLEMENTED] <inits> */<endif>" construct(type, args, inits) ::= "new <type>(<args>)<if(inits)> /* [UNIMPLEMENTED] <inits> */<endif>"
application(func, funcparens, args) ::= "<optparens(parens=funcparens,e=func)>(<args>)"
stackalloc(type, exp) ::= "stackalloc <type>[<exp>]" stackalloc(type, exp) ::= "stackalloc <type>[<exp>]"
// ******* TYPES ***********
void() ::= "void"
// ******* MISC *********** // ******* MISC ***********
optparens(parens, e) ::= "<if(parens)>(<endif><e><if(parens)>)<endif>"
parens(e) ::= "(<e>)" parens(e) ::= "(<e>)"
rank_specifiers(rs) ::= "<rs>" rank_specifiers(rs) ::= "<rs>"
op(pre,op,post) ::= "<pre><op><post>" op(pre,op,post,mkparen,space) ::= "<if(mkparen)>(<endif><pre><space><op><space><post><if(mkparen)>)<endif>"
assign(lhs,lhsparen,assign,rhs,rhsparen) ::= "<if(lhsparen)>(<endif><lhs><if(lhsparen)>)<endif> <assign> <if(rhsparen)>(<endif><rhs><if(rhsparen)>)<endif>"
generic_args(args) ::= "\<<args>\>" generic_args(args) ::= "\<<args>\>"
parameter(annotation,param) ::= "/* <annotation> */ <param>" parameter(annotation,param) ::= "/* <annotation> */ <param>"
inline_comment(payload, explanation) ::= "/* <explanation> <payload> */" inline_comment(payload, explanation) ::= "/* <explanation> <payload> */"