Jr to JJ(Java) Translation DefinitionThis file contains the line-by-line Jr to JJ(Java) translation definition.
This definition is driven by the list of Jr Commands and the
translations can be done command-by-command. In other words,
any Jr command can be translated to the equivalent Java statement
without requiring a complex translator and symbol table.
This approach is possible because the Jr to Java translation does
not require state information (with the one exception of keeping
track of the number of slots in a function, routine, or constructor
definition...but these commands are consecutive).
|
---------------------------------------------------------- -- -- Box and Boxes Commands -- ---------------------------------------------------------- ClassBoxCommands := Jr: (1) 'Box' <boxname> 'ofType' PrimitiveTypeCategory ['is' Visibility] JJ: [Visibility] JavaPrimitiveTypeCategory <boxname> ';' Jr: (2) 'Box' <boxname> 'ofClass' ClassTypeCategory ['is' Visibility] JJ: [Visibility] JavaClassTypeCategory <boxname> ';' ClassBoxesCommands := Jr: (1) 'Boxes' <boxname> (',' <boxname>)+ 'ofType' PrimitiveTypeCategory ['are' Visibility] JJ: [Visibility] JavaPrimitiveTypeCategory <boxname> (',' <boxname>)+ ';' Jr: (2) 'Boxes' <boxname> (',' <boxname>)+ 'ofClass' ClassTypeCategory ['are' Visibility] JJ: [Visibility] JavaClassTypeCategory <boxname> (',' <boxname>)+ ';' LocalBoxCommands := Jr: (1) 'Box' <boxname> 'ofType' PrimitiveTypeCategory JJ: JavaPrimitiveTypeCategory <boxname> ';' Jr: (2) 'Box' <boxname> 'ofClass' ClassTypeCategory JJ: JavaClassTypeCategory <boxname> ';' LocalBoxesCommands := Jr: (1) 'Boxes' <boxname> (',' <boxname>)+ 'ofType' PrimitiveTypeCategory JJ: JavaPrimitiveTypeCategory <boxname> (',' <boxname>)+ ';' Jr: (2) 'Boxes' <boxname> (',' <boxname>)+ 'ofClass' ClassTypeCategory JJ: JavaClassTypeCategory <boxname> (',' <boxname>)+ ';' ---------------------------------------------------------- -- -- Import Command -- ---------------------------------------------------------- ImportCommand Jr: 'Import' ImportLib JJ: // 'Import' ImportLib or import ImportLib ';' ---------------------------------------------------------- -- -- Class and EndClass Commands -- ---------------------------------------------------------- ClassCommand := Jr: 'Class' <classname> JJ: 'class' <classname> '{' EndClassCommand := Jr: 'EndClass' <classname> JJ: '}' ---------------------------------------------------------- -- -- Constant Command -- ---------------------------------------------------------- ConstantCommand := Jr: 'Constant' <constantname> '=' Value 'ofType' ScalarPrimitiveType ['is' Visibility] JJ: [Visibility] final JavaScalarPrimitiveType <constantname> '=' Value ';' ---------------------------------------------------------- -- -- Invariant and EndInvariant Commands -- ---------------------------------------------------------- InvariantCommand := Jr: 'Invariant' JJ: 'private' 'void' 'JJinvariant' '()' '{' EndInvariantCommand := Jr: 'EndInvariant' JJ: '}' ---------------------------------------------------------- -- -- Check, PreCheck, PostCheck Commands -- ---------------------------------------------------------- CheckCommand := Jr: 'Check' ScalarBoolExpr 'bounce' StringLiteral JJ: 'JJS.check' '(' JavaScalarBoolExpr ',' StringLiteral ')' ';' PreCheckCommand := Jr: 'Check' ScalarBoolExpr 'bounce' StringLiteral JJ: 'JJS.preCheck' '(' JavaScalarBoolExpr ',' StringLiteral ')' ';' PostCheckCommand := Jr: 'Check' ScalarBoolExpr 'bounce' StringLiteral JJ: 'JJS.postCheck' '(' JavaScalarBoolExpr ',' StringLiteral ')' ';' ---------------------------------------------------------- -- -- Constructor and EndConstructor Commands -- ---------------------------------------------------------- ConstructorCommand := Jr: 'Constructor' <classname> '(' SlotDeclList ')' 'is' 'public' JJ: 'public' <classname> '(' SlotDeclList (* See translation of Slot commands *) ')' '{' (* Put at the end of the translation of Slot commands *) EndConstructorCommand := Jr: 'EndConstructor' <classname> JJ: '}' ---------------------------------------------------------- -- -- Routine and EndRoutine Commands -- ---------------------------------------------------------- RoutineCommand := Jr: 'Routine' <routinename> '(' SlotDeclList ')' ['is' Visibility] JJ: [Visibility] <routinename> '(' SlotDeclList (* See translation of Slot commands *) ')' '{' (* Put at the end of the translation of Slot commands *) EndRoutineCommand := Jr: 'EndRoutine' <routinename> JJ: '}' ---------------------------------------------------------- -- -- Function and EndFunction Commands -- ---------------------------------------------------------- FunctionCommand := Jr: (1) 'Function' <functionname> 'ofType' PrimitiveTypeCategory '(' SlotDeclList ')' ['is' Visibility] JJ: [Visibility] JavaPrimitiveTypeCategory <functionname> '(' SlotDeclList (* See translation of Slot commands *) ')' '{' (* Put at the end of the translation of Slot commands *) Jr: (2) 'Function' <functionname> 'ofClass' ClassTypeCategory '(' SlotDeclList ')' ['is' Visibility] JJ: [Visibility] JavaClassTypeCategory <functionname> '(' SlotDeclList (* See translation of Slot commands *) ')' '{' (* Put at the end of the translation of Slot commands *) EndFunctionCommand := Jr: 'EndFunction' <functionname> JJ: '}' ---------------------------------------------------------- -- -- Slot Command -- ---------------------------------------------------------- SlotCommand := Jr: (1) 'Slot' <slotname> 'ofType' PrimitiveTypeCategory JJ: JavaPrimitiveTypeCategory <boxname> ',' (* Comma if not last slot *) ')' '{' (* Close parenthesis, open curly bracket if last slot *) Jr: (2) 'Slot' <slotname> 'ofClass' ClassTypeCategory JJ: JavaClassTypeCategory <boxname> ',' (* Comma if not last slot *) ')' '{' (* Close parenthesis, open curly bracket if last slot *) ---------------------------------------------------------- -- -- Start Command -- ---------------------------------------------------------- StartCommand := Jr: 'Start' JJ: 'JJS.start' '(' ')' ';' ---------------------------------------------------------- -- -- If, ElseIf, Else and EndIf Commands -- ---------------------------------------------------------- IfCommand := Jr: 'If' ScalarBoolExpr 'then' JJ: 'if' '(' JavaScalarBoolExpr ')' '{' ElseIfCommand := Jr: 'ElseIf' ScalarBoolExpr 'then' JJ: '}' 'else' 'if' '(' JavaScalarBoolExpr ')' '{' ElseCommand := Jr: 'Else' JJ: '}' 'else' '{' EndIfCommand := Jr: 'EndIf' JJ: '}' ---------------------------------------------------------- -- -- Repeat, ExitOn and EndRepeat Commands -- ---------------------------------------------------------- RepeatCommand := Jr: 'Repeat' JJ: 'while (true) {' ExitOnCommand := Jr: 'ExitOn' ScalarBoolExpr JJ: 'if' '(' JavaScalarBoolExpr ')' 'break' ';' EndRepeatCommand := Jr: 'EndRepeat' JJ: '}' LoopCommand := Jr: 'Loop' <name> 'from' ScalarIntExpr 'while' ScalarBoolExpr 'by' ScalarIntExpr JJ: 'for' '(' <name> '=' ScalarIntExpr ';' '(' ScalarBoolExpr ')' ';' <name> '+=' ScalarIntExpr ) '{' EndLoopCommand := Jr: 'EndLoop' JJ: '}' ---------------------------------------------------------- -- -- Set Command -- ---------------------------------------------------------- SetCommand := Jr: 'Set' LhsExpr '=' Expr JJ: JavaLhsExpr '=' JavaExpr ';' ---------------------------------------------------------- -- -- Call Command -- ---------------------------------------------------------- CallCommand := Jr: (1) 'Call' <routinename> ['with' '(' Expr (',' Expr)* ')'] JJ: <routinename> '(' [JavaExpr (',' JavaExpr)*] ')' ';' Jr: (2) 'Call' <classboxname>.<routinename> ['with' '(' Expr (',' Expr)* ')'] JJ: <classboxname>.<routinename> '(' [JavaExpr (',' JavaExpr)*] ')' ';' ---------------------------------------------------------- -- -- NewArray Command -- ---------------------------------------------------------- NewArrayCommand := Jr: (1) 'NewArray' <arrayname> 'ofType' ScalarPrimitiveType '[' ScalarIntExpr ']' JJ: <arrayname> '=' 'new' JavaScalarPrimitiveType '[' JavaScalarIntExpr ']' ';' Jr: (2) 'NewArray' <arrayname> 'ofClass' ScalarClassType '[' ScalarIntExpr ']' JJ: <arrayname> '=' 'new' JavaScalarClassType '[' JavaScalarIntExpr ']' ';' ---------------------------------------------------------- -- -- New Command -- ---------------------------------------------------------- NewCommand := Jr: 'New' LhsExpr 'ofClass' ScalarClassType ['with' '(' Expr (',' Expr)* ')'] JJ: JavaLhsExpr '=' new JavaScalarClassType '(' [JavaExpr (',' JavaExpr)*] ')' ';' ---------------------------------------------------------- -- -- Input, Output and Outputln Commands -- ---------------------------------------------------------- InputCommand := Jr: 'Input' <varname> JJ: <varname> '=' 'JJS.inputInt' '(' ')' ';' JJ: <varname> '=' 'JJS.inputDouble' '(' ')' ';' JJ: <varname> '=' 'JJS.inputBoolean' '(' ')' ';' JJ: <varname> '=' 'JJS.inputString' '(' ')' ';' OutputCommand := Jr: 'Output' Expr JJ: 'JJS.outputInt' '(' JavaExpr ')' ';' JJ: 'JJS.outputDouble' '(' JavaExpr ')' ';' JJ: 'JJS.outputBoolean' '(' JavaExpr ')' ';' JJ: 'JJS.outputString' '(' JavaExpr ')' ';' OutputlnCommand := Jr: 'Outputln' Expr JJ: 'JJS.outputlnInt' '(' JavaExpr ')' ';' JJ: 'JJS.outputlnDouble' '(' JavaExpr ')' ';' JJ: 'JJS.outputlnBoolean' '(' JavaExpr ')' ';' JJ: 'JJS.outputlnString' '(' JavaExpr ')' ';' ---------------------------------------------------------- -- -- Debug and Debugln Commands -- ---------------------------------------------------------- DebugCommand := Jr: 'Debug' Expr JJ: 'System.out.print' '(' JavaExpr ')' ';' JJ: 'JJS.debugInt' '(' JavaExpr ')' ';' JJ: 'JJS.debugDouble' '(' JavaExpr ')' ';' JJ: 'JJS.debugBoolean' '(' JavaExpr ')' ';' JJ: 'JJS.debugString' '(' JavaExpr ')' ';' DebuglnCommand := Jr: 'Debugln' Expr JJ: 'System.out.println' '(' JavaExpr ')' ';' JJ: 'JJS.debuglnInt' '(' JavaExpr ')' ';' JJ: 'JJS.debuglnDouble' '(' JavaExpr ')' ';' JJ: 'JJS.debuglnBoolean' '(' JavaExpr ')' ';' JJ: 'JJS.debuglnString' '(' JavaExpr ')' ';' ---------------------------------------------------------- -- -- TryCall Command -- ---------------------------------------------------------- TryCallCommand := Jr: 'TryCall' FileIORoutineReference 'OnFail' RoutineReferenceOrAssignment JJ: 'if' JavaFileIORoutineReference '{}' 'else' '{' JavaRoutineReferenceOrAssignment '}' ---------------------------------------------------------- -- -- TrySet Command -- ---------------------------------------------------------- TrySetCommand := Jr: 'TrySet' StringConversionAssignment 'OnFail' RoutineReferenceOrAssignment JJ: 'if' JavaStringConversionAssignment '{}' 'else' '{' JavaRoutineReferenceOrAssignment '}' ========================================================== == == Productions that are not Commands that need translation == from JJ to Java. == ========================================================== ---------------------------------------------------------- -- -- PrimitiveTypeCategory -- ---------------------------------------------------------- PrimitiveTypeCategory := Jr: 'int' JJ: 'int' Jr: 'real' JJ: 'double' Jr: 'bool' JJ: 'boolean' Jr: 'int[]' JJ: 'int[]' Jr: 'real[]' JJ: 'double[]' Jr: 'bool[]' JJ: 'boolean[]' ---------------------------------------------------------- -- -- ClassTypeCategory -- ---------------------------------------------------------- ClassTypeCategory := Jr: 'Str' JJ: 'String' Jr: <classname> JJ: <classname> Jr: 'Str[]' JJ: 'String[]' Jr: <classname>'[]' JJ: <classname>'[]' ---------------------------------------------------------- -- -- JavaScalarBoolExpr -- ---------------------------------------------------------- JavaScalarBoolExpr := (* See Expr translation rules *) ---------------------------------------------------------- -- -- LhsExpr -- ---------------------------------------------------------- LhsExpr := (* See Expr translation rules *) ---------------------------------------------------------- -- -- Expr -- ---------------------------------------------------------- Expr := Jr: <boxname> JJ: <boxname> Jr: <classboxname>.<boxname> JJ: <classboxname>.<boxname> Jr: 'and' JJ: '&&' Jr: 'or' JJ: '||' Jr: '+' JJ: '+' Jr: '-' JJ: '-' Jr: '*' JJ: '*' Jr: '/' JJ: '/' Jr: '%' JJ: '%' Jr: '<' JJ: '<' Jr: '<=' JJ: '<=' Jr: '>' JJ: '>' Jr: '>=' JJ: '>=' Jr: '==' JJ: '==' Jr: '!=' JJ: '!=' Jr: 'not' JJ: '!' Jr: '(' JJ: '(' Jr: ')' JJ: ')' Jr: '[' JJ: '[' Jr: ']' JJ: ']' ---------------------------------------------------------- -- -- FileIORoutineReference -- ---------------------------------------------------------- FileIORoutineReference := Jr: <classboxname>.<routinename> ['with' '(' Expr (',' Expr)* ')'] JJ: <classboxname>.<routinename> '(' [JavaExpr (',' JavaExpr)*] ')' ---------------------------------------------------------- -- -- RoutineReferenceOrAssignment -- ---------------------------------------------------------- RoutineReferenceOrAssignment := Jr: (1) <routinename> ['with' '(' Expr (',' Expr)* ')'] JJ: <routinename> '(' [JavaExpr (',' JavaExpr)*] ')' Jr: (2) <classboxname>.<routinename> ['with' '(' Expr (',' Expr)* ')'] JJ: <classboxname>.<routinename> '(' [JavaExpr (',' JavaExpr)*] ')' Jr: (3) LhsExpr '=' Expr JJ: JavaLhsExpr '=' JavaExpr ---------------------------------------------------------- -- -- StringConversionAssignment -- ---------------------------------------------------------- StringConversionAssignment := Jr: (1) <boxname> '=' 'StringToInt' '(' ScalarStrExpr ')' JJ: <boxname> '=' SomeJavaCode '(' JavaScalarStrExpr ')' Jr: (2) <boxname> '=' 'StringToReal' '(' ScalarStrExpr ')' JJ: <boxname> '=' SomeJavaCode '(' JavaScalarStrExpr ')'