| /* |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| |
| /* |
| * CmcRules.jbg holds the rewrite rules that effect code generation |
| * from a CodeModel syntax tree. |
| * @see CmcPatterns.jbg, which holds the corresponding patterns. |
| */ |
| |
| /* |
| * ****************** |
| * ** Declarations ** |
| * ****************** |
| */ |
| |
| // Prototype reduction logic for functions |
| // is in FunctionRules.jbg; include them with |
| // the patterns for each variation. |
| JBurg.include "FunctionRules.jbg" |
| JBurg.include "FunctionRules.jbg" typelessFunction="typelessGetter" typedFunction="typedGetter" |
| JBurg.include "FunctionRules.jbg" typelessFunction="typelessSetter" typedFunction="typedSetter" |
| |
| // anonymous function closure |
| expression = Pattern anonymousFunction: 1 |
| Prologue reducer.prologue_anonymousFunction(p) |
| JBurg.Reduction reducer.reduce_anonymousFunction(__p, function_body); |
| |
| // typeless named function closure. |
| expression = Pattern typelessFunctionObject: 1 |
| Prologue reducer.prologue_functionObject(p) |
| JBurg.Reduction reducer.reduce_functionObject(__p, function_name, plist, null, block); |
| |
| // named function closure with a return type. |
| expression = Pattern typedFunctionObject: 1 |
| Prologue reducer.prologue_functionObject(p) |
| JBurg.Reduction reducer.reduce_functionObject(__p, function_name, plist, return_type, block); |
| |
| // A typeless nested function. |
| statement = Pattern typelessFunction : 0 |
| Prologue reducer.prologue_typelessFunction_to_statement(p) |
| JBurg.Reduction reducer.reduce_typelessFunction(__p, plist, block); |
| |
| // A nested function with a return type. |
| statement = Pattern typedFunction : 0 |
| Prologue reducer.prologue_typedFunction_to_statement(p) |
| JBurg.Reduction reducer.reduce_typedFunction_to_statement(__p, plist, return_type, block); |
| |
| /* |
| * A parameterList with parameters. |
| */ |
| parameterList = Pattern plist : 0 |
| JBurg.Reduction reducer.reduce_plist(__p, pdecl); |
| |
| parameter = Pattern requiredParameter: 0 |
| JBurg.Reduction reducer.reduce_requiredParameter(__p, param_name, param_type); |
| |
| parameter = Pattern optionalParameter: 0 |
| JBurg.Reduction reducer.reduce_optionalParameter(__p, param_name, param_type, default_value); |
| |
| parameter = Pattern restParameter : 0 |
| JBurg.Reduction reducer.reduce_restParameter (__p, param_name, param_type); |
| |
| /* |
| * ****************** |
| * ** Statements ** |
| * ****************** |
| */ |
| |
| /* |
| * Control-flow statements. |
| */ |
| statement = Pattern whileStmt: 0 |
| Prologue reducer.prologue_whileStmt(p) |
| JBurg.Reduction reducer.reduce_whileStmt(__p, cond, body); |
| |
| statement = Pattern doStmt: 0 |
| Prologue reducer.prologue_doStmt(p) |
| JBurg.Reduction reducer.reduce_doStmt(__p, body, cond); |
| |
| statement = Pattern countedForStmt: 2 |
| Prologue reducer.prologue_countedForStmt(p) |
| JBurg.Reduction reducer.reduce_countedForStmt(__p, init, test_insns, incr, body); |
| |
| statement = Pattern forInStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueStmt(__p, it, base, body, OP_nextname); |
| |
| statement = Pattern forInArrayStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueArrayStmt(__p, stem, index, base, body, OP_nextname, false); |
| |
| statement = Pattern forInMemberStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueMemberStmt(__p, stem, member, base, body, OP_nextname, false); |
| |
| statement = Pattern forInDescendantStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueMemberStmt(__p, stem, descendants, base, body, OP_nextname, false); |
| |
| statement = Pattern forInSuperStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueMemberStmt(__p, null, member, base, body, OP_nextname, true); |
| |
| statement = Pattern forInSuperBracketStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueArrayStmt(__p, null, index, base, body, OP_nextname, true); |
| |
| statement = Pattern forVarDeclInStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forVarDeclInStmt(__p, single_decl, base, body, OP_nextname); |
| |
| statement = Pattern forEachVarDeclInStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forVarDeclInStmt(__p, single_decl, base, body, OP_nextvalue); |
| |
| statement = Pattern forEachStmt: 10 |
| Prologue reducer.prologue_forEachStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueStmt(__p, it, base, body, OP_nextvalue); |
| |
| statement = Pattern forEachArrayStmt: 10 |
| Prologue reducer.prologue_forEachStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueArrayStmt(__p, stem, index, base, body, OP_nextvalue, false); |
| |
| statement = Pattern forEachMemberStmt: 10 |
| Prologue reducer.prologue_forEachStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueMemberStmt(__p, stem, member, base, body, OP_nextvalue, false); |
| |
| statement = Pattern forEachInDescendantStmt: 10 |
| Prologue reducer.prologue_forInStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueMemberStmt(__p, stem, descendants, base, body, OP_nextvalue, false); |
| |
| statement = Pattern forEachSuperStmt: 10 |
| Prologue reducer.prologue_forEachStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueMemberStmt(__p, null, member, base, body, OP_nextvalue, true); |
| |
| statement = Pattern forEachSuperBracketStmt: 10 |
| Prologue reducer.prologue_forEachStmt(p) |
| JBurg.Reduction reducer.reduce_forKeyValueArrayStmt(__p, null, index, base, body, OP_nextvalue, true); |
| |
| statement = Pattern ifElseIf : 0 |
| JBurg.Reduction reducer.reduce_ifElseIf (__p, test, then, if_elseif); |
| |
| conditionalElements = Pattern lastElse: 0 |
| JBurg.Reduction reducer.reduce_lastElse(__p, else_clause); |
| |
| |
| /* |
| * General form of switch statement: expand into if/elseif. |
| */ |
| statement = Pattern switchStmt: 0 |
| Prologue reducer.prologue_switchStmt(p) |
| JBurg.Reduction reducer.reduce_switchStmt(__p, switch_expr, cases); |
| |
| conditionalElements = Pattern switchCase: 0 |
| JBurg.Reduction reducer.reduce_conditionalFragment(__p, case_expr, case_actions); |
| |
| conditionalElements = Pattern constantSwitchCase: 0 |
| JBurg.Reduction reducer.reduce_constantConditionalFragment(__p, case_const_value, case_actions); |
| |
| conditionalElements = Pattern switchDefault: 0 |
| JBurg.Reduction reducer.reduce_conditionalFragment(__p, null, case_actions); |
| |
| statement = Pattern returnVoidSideEffect: 1 |
| JBurg.Reduction reducer.reduce_returnVoidSideEffect(__p, expr); |
| |
| statement = Pattern returnValue: 2 |
| JBurg.Reduction reducer.reduce_returnValue(__p, value); |
| |
| // returnVoidValue's cost is inflated to cause |
| // the code generator to prefer returnValue |
| // whenever returnValue is feasible. |
| // Some reductions to void_expr are cheaper |
| // than the corresponding reduction to expr, |
| // so the CG thinks returning a void value |
| // is a good choice in isolation. |
| statement = Pattern returnVoidValue : 2000 |
| JBurg.Reduction reducer.reduce_returnVoidValue (__p, no_value); |
| |
| statement = Pattern returnVoid: 1 |
| JBurg.Reduction reducer.reduce_returnVoid(__p); |
| |
| statement = Pattern returnNil: 1 |
| JBurg.Reduction reducer.reduce_returnVoid(__p); |
| |
| statement = Pattern breakStmt: 1 |
| JBurg.Reduction reducer.reduce_breakStmt(__p); |
| |
| statement = Pattern labeledBreakStmt: 0 |
| JBurg.Reduction reducer.reduce_labeledBreakStmt(__p); |
| |
| statement = Pattern continueStmt: 1 |
| JBurg.Reduction reducer.reduce_continueStmt(__p); |
| |
| statement = Pattern labeledContinueStmt: 0 |
| JBurg.Reduction reducer.reduce_labeledContinueStmt(__p); |
| |
| statement = Pattern gotoStmt: 1 |
| JBurg.Reduction reducer.reduce_gotoStmt(__p); |
| |
| // CodeModel doesn't have an ExpressionStatement node, |
| // so accept a bare expression as a statement. |
| statement = void_expression; |
| |
| /* |
| * A block of statements. |
| */ |
| statement = Pattern blockStmt: 0 |
| Prologue reducer.prologue_blockStmt(p) |
| JBurg.Reduction reducer.reduce_blockStmt_to_statement(__p, stmts); |
| |
| statement = Pattern configBlockStmt: 0 |
| Prologue reducer.prologue_blockStmt(p) |
| JBurg.Reduction reducer.reduce_blockStmt_to_statement(__p, stmts); |
| |
| /* |
| * ******************** |
| * ** Declarations ** |
| * ******************** |
| */ |
| var_decl = Pattern typedVariableDecl : 0 |
| JBurg.Reduction reducer.reduce_typedVariableDecl(__p, var_name, var_type, chained_decls); |
| |
| var_decl = Pattern typedVariableDeclWithInitializer : 0 |
| JBurg.Reduction reducer.reduce_typedVariableDeclWithInitializer(__p, var_name, var_type, var_initializer, chained_decls); |
| |
| var_decl = Pattern typedVariableDeclWithConstantInitializer : 0 |
| JBurg.Reduction reducer.reduce_typedVariableDeclWithConstantInitializer(__p, var_name, var_type, constant_var_initializer, chained_decls); |
| |
| var_decl = Pattern typedBindableVariableDecl : 0 |
| JBurg.Reduction reducer.reduce_typedBindableVariableDecl(__p, var_name, var_type, chained_decls); |
| |
| var_decl = Pattern typedBindableVariableDeclWithInitializer : 0 |
| JBurg.Reduction reducer.reduce_typedBindableVariableDeclWithInitializer(__p, var_name, var_type, var_initializer, chained_decls); |
| |
| statement = var_decl; |
| |
| statement = Pattern namespaceDeclaration : 0 |
| JBurg.Reduction reducer.reduce_namespaceDeclaration (__p, ns_name); |
| |
| statement = Pattern namespaceDeclarationConstantInitializer : 0 |
| JBurg.Reduction reducer.reduce_namespaceDeclarationConstantInitializer (__p, ns_name, uri); |
| |
| statement = Pattern namespaceDeclarationInitializer : 0 |
| JBurg.Reduction reducer.reduce_namespaceDeclarationInitializer (__p, ns_name, second_ns); |
| |
| /* |
| * ****************** |
| * ** Exceptions ** |
| * ****************** |
| */ |
| |
| statement = Pattern throwStmt: 1 |
| JBurg.Reduction reducer.reduce_throwStmt(__p, tossable); |
| |
| statement = Pattern tryCatchStmt: 0 |
| Prologue reducer.prologue_tryCatchStmt(p) |
| JBurg.Reduction reducer.reduce_tryCatchStmt(__p, try_stmt, catch_blocks); |
| |
| statement = Pattern tryFinallyStmt: 0 |
| Prologue reducer.prologue_tryFinallyStmt(p) |
| JBurg.Reduction reducer.reduce_tryFinallyStmt(__p, try_stmt, finally_stmt); |
| |
| statement = Pattern tryCatchFinallyStmt: 0 |
| Prologue reducer.prologue_tryCatchFinallyStmt(p) |
| JBurg.Reduction reducer.reduce_tryCatchFinallyStmt(__p, try_stmt, finally_stmt, catch_blocks); |
| |
| catch_block = Pattern catchBlockTyped : 0 |
| Prologue reducer.prologue_catchBlock(p) |
| JBurg.Reduction reducer.reduce_catchBlockTyped (__p, var_name, exception, action); |
| |
| catch_block = Pattern catchBlockUntyped : 0 |
| Prologue reducer.prologue_catchBlock(p) |
| JBurg.Reduction reducer.reduce_catchBlockUntyped (__p, var_name, action); |
| |
| finally_clause = Pattern blockStmt: 0 |
| Prologue reducer.prologue_blockStmt_to_finally_clause(p) |
| JBurg.Reduction reducer.reduce_blockStmt_to_finally_clause(__p, stmts); |
| |
| statement = Pattern labeledStmt: 0 |
| Prologue reducer.prologue_labeledStmt(p) |
| JBurg.Reduction reducer.reduce_labeledStmt(__p, label, substatement); |
| |
| // with statement. |
| statement = Pattern withStmt: 0 |
| Prologue reducer.prologue_withStmt(p) |
| JBurg.Reduction reducer.reduce_withStmt(__p, new_scope, body); |
| |
| /* |
| * ******************* |
| * ** Expressions ** |
| * ******************* |
| */ |
| void_expression = expression: 1 |
| JBurg.Reduction reducer.transform_expression_to_void_expression(__p, expression); |
| |
| /* |
| * Assignment to a simple name. |
| */ |
| void_expression = Pattern assignToNameExpr: 1 |
| JBurg.Reduction reducer.reduce_assignToNameExpr_to_void_expression(__p, lval, r); |
| |
| expression = Pattern assignToNameExpr: 2 |
| JBurg.Reduction reducer.reduce_assignToNameExpr_to_expression(__p, lval,r); |
| |
| /* |
| * Assignment to a more general lvalue. |
| */ |
| void_expression = Pattern assignToMemberExpr : 10 |
| JBurg.Reduction reducer.reduce_assignToMemberExpr_to_void_expression(__p, stem, member, r); |
| |
| expression = Pattern assignToMemberExpr : 10 |
| JBurg.Reduction reducer.reduce_assignToMemberExpr_to_expression(__p, stem, member, r); |
| |
| /* |
| * Assignment to a[i] type lvalue. |
| */ |
| void_expression = Pattern assignToBracketExpr: 1 |
| JBurg.Reduction reducer.reduce_assignToBracketExpr_to_void_expression(__p, stem, index, r, false); |
| |
| expression = Pattern assignToBracketExpr: 1 |
| JBurg.Reduction reducer.reduce_assignToBracketExpr_to_expression(__p, stem, index, r, false); |
| |
| void_expression = Pattern assignToSuperBracketExpr: 1 |
| JBurg.Reduction reducer.reduce_assignToBracketExpr_to_void_expression(__p, null, index, r, true); |
| |
| expression = Pattern assignToSuperBracketExpr: 1 |
| JBurg.Reduction reducer.reduce_assignToBracketExpr_to_expression(__p, null, index, r, true); |
| |
| /* |
| * Assignment to qualified names and attributes. |
| */ |
| void_expression = Pattern assignToQualifiedMemberExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedMemberExpr(__p, stem, qualifier, member, r, DISCARD_VALUE); |
| |
| expression = Pattern assignToQualifiedMemberExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedMemberExpr(__p, stem, qualifier, member, r, NEED_VALUE); |
| |
| void_expression = Pattern assignToQualifiedRuntimeMemberExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedRuntimeMemberExpr(__p, stem, qualifier, member, r, DISCARD_VALUE); |
| |
| expression = Pattern assignToQualifiedRuntimeMemberExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedRuntimeMemberExpr(__p, stem, qualifier, member, r, NEED_VALUE); |
| |
| void_expression = Pattern assignToQualifiedAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedAttributeExpr(__p, stem, qualifier, attribute, r,DISCARD_VALUE); |
| |
| expression = Pattern assignToQualifiedAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedAttributeExpr(__p, stem, qualifier, attribute, r, NEED_VALUE); |
| |
| void_expression = Pattern assignToQualifiedRuntimeAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedRuntimeAttributeExpr(__p, stem, qualifier, attribute, r, DISCARD_VALUE); |
| |
| void_expression = Pattern assignToQualifiedRuntimeAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToQualifiedRuntimeAttributeExpr(__p, stem, qualifier, attribute, r, NEED_VALUE); |
| |
| void_expression = Pattern assignToUnqualifiedRuntimeAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToUnqualifiedRuntimeAttributeExpr(__p, stem, rt_attr_name, r, DISCARD_VALUE); |
| |
| expression = Pattern assignToUnqualifiedRuntimeAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToUnqualifiedRuntimeAttributeExpr(__p, stem, rt_attr_name, r, NEED_VALUE); |
| |
| // TODO: This is more than a smidge whacky but it's what ASC does. |
| // Research and pursue with PM. |
| void_expression = Pattern assignToUnqualifiedRuntimeDescendantsAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToUnqualifiedRuntimeAttributeExpr(__p, stem, rt_attr_name, r, DISCARD_VALUE); |
| |
| expression = Pattern assignToUnqualifiedRuntimeDescendantsAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToUnqualifiedRuntimeAttributeExpr(__p, stem, rt_attr_name, r, NEED_VALUE); |
| |
| /* |
| * Assignment to descendants. |
| */ |
| void_expression = Pattern assignToDescendantsExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToDescendantsExpr(__p, stem, member, r, DISCARD_VALUE); |
| |
| expression = Pattern assignToDescendantsExpr : 1 |
| JBurg.Reduction reducer.reduce_assignToDescendantsExpr(__p, stem, member, r, NEED_VALUE); |
| |
| /* |
| * Error trap for diagnosing parser/CG mismatches. |
| * The cost is unfeasibly high for a normal reduction, |
| * so this will only be chosen if no other reduction works. |
| */ |
| expression = Op_AssignId(expression non_lvalue, expression rvalue ) : ERROR_TRAP |
| JBurg.Reduction reducer.error_reduce_Op_AssignId(__p, non_lvalue, rvalue); |
| |
| /* |
| * Compound assignment. |
| */ |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_add" \ |
| compoundAssignToName="assignPlusToNameExpr" \ |
| compoundAssignToMember="assignPlusToMemberExpr" \ |
| compoundAssignToBracket="assignPlusToBracketExpr" \ |
| compoundAssignToDescendants="assignPlusToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignPlusToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_subtract" \ |
| compoundAssignToName="assignMinusToNameExpr" \ |
| compoundAssignToMember="assignMinusToMemberExpr" \ |
| compoundAssignToBracket="assignMinusToBracketExpr" \ |
| compoundAssignToDescendants="assignMinusToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignMinusToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_divide" \ |
| compoundAssignToName="assignDivideToNameExpr" \ |
| compoundAssignToMember="assignDivideToMemberExpr" \ |
| compoundAssignToBracket="assignDivideToBracketExpr" \ |
| compoundAssignToDescendants="assignDivideToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignDivideToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_multiply" \ |
| compoundAssignToName="assignMultiplyToNameExpr" \ |
| compoundAssignToMember="assignMultiplyToMemberExpr" \ |
| compoundAssignToBracket="assignMultiplyToBracketExpr" \ |
| compoundAssignToDescendants="assignMultiplyToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignMultiplyToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_modulo" \ |
| compoundAssignToName="assignModuloToNameExpr" \ |
| compoundAssignToMember="assignModuloToMemberExpr" \ |
| compoundAssignToBracket="assignModuloToBracketExpr" \ |
| compoundAssignToDescendants="assignModuloToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignModuloToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_bitor" \ |
| compoundAssignToName="assignBitwiseOrToNameExpr" \ |
| compoundAssignToMember="assignBitwiseOrToMemberExpr" \ |
| compoundAssignToBracket="assignBitwiseOrToBracketExpr" \ |
| compoundAssignToDescendants="assignBitwiseOrToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignBitwiseOrToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_bitand" \ |
| compoundAssignToName="assignBitwiseAndToNameExpr" \ |
| compoundAssignToMember="assignBitwiseAndToMemberExpr" \ |
| compoundAssignToBracket="assignBitwiseAndToBracketExpr" \ |
| compoundAssignToDescendants="assignBitwiseAndToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignBitwiseAndToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_bitxor" \ |
| compoundAssignToName="assignBitwiseXorToNameExpr" \ |
| compoundAssignToMember="assignBitwiseXorToMemberExpr" \ |
| compoundAssignToBracket="assignBitwiseXorToBracketExpr" \ |
| compoundAssignToDescendants="assignBitwiseXorToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignBitwiseXorToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_lshift" \ |
| compoundAssignToName="assignLeftShiftToNameExpr" \ |
| compoundAssignToMember="assignLeftShiftToMemberExpr" \ |
| compoundAssignToBracket="assignLeftShiftToBracketExpr" \ |
| compoundAssignToDescendants="assignLeftShiftToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignLeftShiftToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_rshift" \ |
| compoundAssignToName="assignRightShiftToNameExpr" \ |
| compoundAssignToMember="assignRightShiftToMemberExpr" \ |
| compoundAssignToBracket="assignRightShiftToBracketExpr" \ |
| compoundAssignToDescendants="assignRightShiftToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignRightShiftToRuntimeNameExpr" |
| |
| JBurg.include "CompoundAssignmentRules.jbg" \ |
| opcode="OP_urshift" \ |
| compoundAssignToName="assignUnsignedRightShiftToNameExpr" \ |
| compoundAssignToMember="assignUnsignedRightShiftToMemberExpr" \ |
| compoundAssignToBracket="assignUnsignedRightShiftToBracketExpr" \ |
| compoundAssignToDescendants="assignUnsignedRightShiftToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignUnsignedRightShiftToRuntimeNameExpr" |
| |
| JBurg.include "CompoundLogicalAssignmentRules.jbg" \ |
| IsAnd="true" \ |
| compoundAssignToName="assignLogicalAndToNameExpr" \ |
| compoundAssignToMember="assignLogicalAndToMemberExpr" \ |
| compoundAssignToBracket="assignLogicalAndToBracketExpr" \ |
| compoundAssignToDescendants="assignLogicalAndToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignLogicalAndToRuntimeNameExpr" |
| |
| JBurg.include "CompoundLogicalAssignmentRules.jbg" \ |
| IsAnd="false" \ |
| compoundAssignToName="assignLogicalOrToNameExpr" \ |
| compoundAssignToMember="assignLogicalOrToMemberExpr" \ |
| compoundAssignToBracket="assignLogicalOrToBracketExpr" \ |
| compoundAssignToDescendants="assignLogicalOrToDescendantsExpr" \ |
| compoundAssignToRuntimeName="assignLogicalOrToRuntimeNameExpr" |
| |
| |
| /* |
| * Miscellaneous void expressions. |
| */ |
| void_expression = Pattern variableExpression : 0 |
| JBurg.Reduction reducer.reduce_variableExpression (__p, decls); |
| |
| void_expression = Pattern nilExpr: 0 |
| JBurg.Reduction reducer.createInstructionList(__p); |
| |
| expression = Pattern nilExpr : 1 |
| JBurg.Reduction reducer.reduce_nilExpr_to_expression(__p); |
| |
| void_expression = Pattern groupedVoidExpression: 0 |
| JBurg.Reduction reducer.reduce_groupedVoidExpression(__p, contents); |
| |
| /* |
| * Special Instruction List node - allows arbitrary instructions to be inserted |
| * where an expression is expected. Used by some MXML processing that wants to |
| * generate code without having to create a synthetic AST to pass to the burm. |
| */ |
| expression = Pattern instructionListExpression : 1 |
| JBurg.Reduction reducer.reduce_instructionListExpression(__p); |
| |
| /* |
| * Binary logical operators. |
| */ |
| comparison_expression = Pattern equalExpr : 1 |
| JBurg.Reduction reducer.binaryOp (__p, l, r, OP_equals); |
| |
| comparison_expression = Pattern neqExpr : 1 |
| JBurg.Reduction reducer.reduce_neqExpr (__p, l, r); |
| |
| comparison_expression = Pattern stricteqExpr : 1 |
| JBurg.Reduction reducer.binaryOp (__p, l, r, OP_strictequals); |
| |
| comparison_expression = Pattern strictneqExpr : 1 |
| JBurg.Reduction reducer.reduce_strictneqExpr (__p, l, r); |
| |
| comparison_expression = Pattern greaterThanExpr: 1 |
| JBurg.Reduction reducer.binaryOp (__p, l, r, OP_greaterthan); |
| |
| comparison_expression = Pattern greaterThanEqExpr: 1 |
| JBurg.Reduction reducer.binaryOp (__p, l, r, OP_greaterequals); |
| |
| comparison_expression = Pattern lessExpr : 1 |
| JBurg.Reduction reducer.binaryOp (__p, l, r, OP_lessthan); |
| |
| comparison_expression = Pattern lessEqExpr : 1 |
| JBurg.Reduction reducer.binaryOp (__p, l, r, OP_lessequals); |
| |
| // Closure rule: any comparison_expression |
| // is also an expression without further conversion. |
| expression = comparison_expression; |
| |
| expression = Pattern logicalAndExpr : 5 |
| JBurg.Reduction reducer.reduce_logicalAndExpr (__p, l, r); |
| |
| expression = Pattern logicalOrExpr : 5 |
| JBurg.Reduction reducer.reduce_logicalOrExpr (__p, l, r); |
| |
| expression = Pattern logicalNotExpr : 1 |
| JBurg.Reduction reducer.reduce_logicalNotExpr (__p, expr); |
| |
| expression = Pattern ternaryExpr : 1 |
| JBurg.Reduction reducer.reduce_ternaryExpr (__p, test, when_true, when_false); |
| |
| /* |
| * Binary branching constructs; |
| * not really operators, but kept |
| * near their equivalent operators |
| * for maintenance's sake. |
| */ |
| conditionalJump = Pattern equalExpr : 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_ifeq); |
| |
| conditionalJump = Pattern neqExpr : 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_ifne); |
| |
| conditionalJump = Pattern stricteqExpr : 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_ifstricteq); |
| |
| conditionalJump = Pattern strictneqExpr : 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_ifstrictne); |
| |
| conditionalJump = Pattern greaterThanExpr: 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_ifgt); |
| |
| conditionalJump = Pattern greaterThanEqExpr: 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_ifge); |
| |
| conditionalJump = Pattern lessExpr : 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_iflt); |
| |
| conditionalJump = Pattern lessEqExpr : 1 |
| JBurg.Reduction reducer.conditionalJump(__p, l, r, OP_ifle); |
| |
| conditionalJump = Pattern nilExpr : 1 |
| JBurg.Reduction reducer.reduce_nilExpr_to_conditionalJump (__p); |
| |
| /* |
| * General form of conditional jump. |
| */ |
| conditionalJump = expression : 1 |
| JBurg.Reduction reducer.transform_expression_to_conditionalJump(__p, expression); |
| |
| /* |
| * Binary arithmetic operators. |
| */ |
| |
| expression = Pattern divideExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_divide); |
| |
| expression = Pattern multExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_multiply); |
| |
| expression = Pattern moduloExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_modulo); |
| |
| expression = Pattern addExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_add); |
| |
| expression = Pattern subtractExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_subtract); |
| |
| expression = Pattern bitwiseLeftShiftExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_lshift); |
| |
| expression = Pattern bitwiseRightShiftExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_rshift); |
| |
| expression = Pattern bitwiseUnsignedRightShiftExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_urshift); |
| |
| expression = Pattern bitwiseAndExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_bitand); |
| |
| expression = Pattern bitwiseOrExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_bitor); |
| |
| expression = Pattern bitwiseXorExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, l, r, OP_bitxor); |
| |
| /* |
| * pre/postfix unary operators. |
| */ |
| |
| expression = Pattern postIncNameExpr : 7 |
| JBurg.Reduction reducer.reduce_postIncNameExpr(__p, unary, true); |
| |
| void_expression = Pattern postIncNameExpr : 7 |
| JBurg.Reduction reducer.reduce_postIncNameExpr(__p, unary, false); |
| |
| expression = Pattern preIncNameExpr : 7 |
| JBurg.Reduction reducer.reduce_preIncNameExpr(__p, unary, true); |
| |
| void_expression = Pattern preIncNameExpr : 7 |
| JBurg.Reduction reducer.reduce_preIncNameExpr(__p, unary, false); |
| |
| expression = Pattern preIncMemberExpr : 8 |
| JBurg.Reduction reducer.reduce_preIncMemberExpr(__p, stem, field, true); |
| |
| void_expression = Pattern preIncMemberExpr : 8 |
| JBurg.Reduction reducer.reduce_preIncMemberExpr(__p, stem, field, false); |
| |
| expression = Pattern postIncMemberExpr: 8 |
| JBurg.Reduction reducer.reduce_postIncMemberExpr(__p, stem, field, true); |
| |
| void_expression = Pattern postIncMemberExpr: 8 |
| JBurg.Reduction reducer.reduce_postIncMemberExpr(__p, stem, field, false); |
| |
| expression = Pattern preIncBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_preIncBracketExpr(__p, stem, index, true); |
| |
| void_expression = Pattern preIncBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_preIncBracketExpr(__p, stem, index, false); |
| |
| expression = Pattern postIncBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_postIncBracketExpr(__p, stem, index, true); |
| |
| void_expression = Pattern postIncBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_postIncBracketExpr(__p, stem, index, false); |
| |
| expression = Pattern postDecNameExpr : 7 |
| JBurg.Reduction reducer.reduce_postDecNameExpr(__p, unary, true); |
| |
| void_expression = Pattern postDecNameExpr : 7 |
| JBurg.Reduction reducer.reduce_postDecNameExpr(__p, unary, false); |
| |
| expression = Pattern preDecNameExpr : 7 |
| JBurg.Reduction reducer.reduce_preDecNameExpr(__p, unary, true); |
| |
| void_expression = Pattern preDecNameExpr : 7 |
| JBurg.Reduction reducer.reduce_preDecNameExpr(__p, unary, false); |
| |
| expression = Pattern preDecMemberExpr : 8 |
| JBurg.Reduction reducer.reduce_preDecMemberExpr(__p, stem, field, true); |
| |
| void_expression = Pattern preDecMemberExpr : 8 |
| JBurg.Reduction reducer.reduce_preDecMemberExpr(__p, stem, field, false); |
| |
| expression = Pattern postDecMemberExpr: 8 |
| JBurg.Reduction reducer.reduce_postDecMemberExpr(__p, stem, field, true); |
| |
| void_expression = Pattern postDecMemberExpr: 8 |
| JBurg.Reduction reducer.reduce_postDecMemberExpr(__p, stem, field, false); |
| |
| expression = Pattern preDecBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_preDecBracketExpr(__p, stem, index, true); |
| |
| void_expression = Pattern preDecBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_preDecBracketExpr(__p, stem, index, false); |
| |
| expression = Pattern postDecBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_postDecBracketExpr(__p, stem, index, true); |
| |
| void_expression = Pattern postDecBracketExpr: 8 |
| JBurg.Reduction reducer.reduce_postDecBracketExpr(__p, stem, index, false); |
| |
| |
| |
| /* |
| * Unary expressions. |
| */ |
| expression = Pattern unaryMinusExpr: 1 |
| JBurg.Reduction reducer.unaryOp(__p, e, OP_negate); |
| |
| expression = Pattern unaryPlusExpr: 0 |
| { |
| return reducer.unaryOp(__p, e, reducer.op_unplus()); |
| } |
| |
| expression = Pattern typeofExpr: 10 |
| Prologue reducer.prologue_typeof(p) |
| JBurg.Reduction reducer.reduce_typeof_expr(__p, expr); |
| |
| expression = Pattern typeofName: 1 |
| Prologue reducer.prologue_typeof(p) |
| JBurg.Reduction reducer.reduce_typeof_name(__p, n); |
| |
| expression = Pattern bitNotExpr: 1 |
| JBurg.Reduction reducer.unaryOp(__p, unary, OP_bitnot); |
| |
| /* |
| * Miscellaneous binary expressions. |
| */ |
| expression = Pattern istypeExprLate : 1 |
| JBurg.Reduction reducer.binaryOp(__p, expr, typename, OP_istypelate); |
| |
| expression = Pattern astypeExprLate : 1 |
| JBurg.Reduction reducer.binaryOp(__p, expr, typename, OP_astypelate); |
| |
| expression = Pattern inExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, needle, haystack, OP_in); |
| |
| expression = Pattern instanceofExpr : 1 |
| JBurg.Reduction reducer.binaryOp(__p, expr, typename, OP_instanceof); |
| |
| /* |
| * Primary expressions. |
| */ |
| expression = Pattern memberAccessExpr : 10 |
| JBurg.Reduction reducer.reduce_memberAccessExpr (__p, stem, member, OP_getproperty); |
| |
| expression = Pattern qualifiedMemberAccessExpr : 10 |
| JBurg.Reduction reducer.reduce_qualifiedMemberAccessExpr(__p, stem, qualifier, member, OP_getproperty); |
| |
| expression = Pattern qualifiedDescendantsExpr : 10 |
| JBurg.Reduction reducer.reduce_qualifiedMemberAccessExpr(__p, stem, qualifier, member, OP_getdescendants); |
| |
| expression = Pattern qualifiedDescendantsRuntimeExpr : 1 |
| JBurg.Reduction reducer.reduce_qualifiedAttributeRuntimeMemberExpr(__p, stem, qualifier, runtime_member, OP_getdescendants); |
| |
| expression = Pattern qualifiedAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_qualifiedAttributeExpr(__p, stem, qualifier, member, OP_getproperty); |
| |
| expression = Pattern qualifiedDescendantsAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_qualifiedAttributeExpr(__p, stem, qualifier, member, OP_getdescendants); |
| |
| expression = Pattern qualifiedAttributeRuntimeMemberExpr : 1 |
| JBurg.Reduction reducer.reduce_qualifiedAttributeRuntimeMemberExpr(__p, stem, qualifier, runtime_member, OP_getproperty); |
| |
| expression = Pattern qualifiedDescendantsRuntimeMemberExpr : 1 |
| JBurg.Reduction reducer.reduce_qualifiedAttributeRuntimeMemberExpr(__p, stem, qualifier, runtime_member, OP_getdescendants); |
| |
| // Prefer the basic memberAccessExpr pattern where feasible. |
| expression = Pattern qualifiedMemberRuntimeNameExpr : 100 |
| JBurg.Reduction reducer.reduce_qualifiedMemberRuntimeNameExpr(__p, stem, qualifier, runtime_member); |
| |
| expression = Pattern unqualifiedAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_unqualifiedAttributeExpr(__p, stem, expr, OP_getproperty); |
| |
| expression = Pattern unqualifiedDescendantsAttributeExpr : 1 |
| JBurg.Reduction reducer.reduce_unqualifiedAttributeExpr(__p, stem, expr, OP_getdescendants); |
| |
| expression = Pattern runtimeAttributeExp : 1 |
| JBurg.Reduction reducer.reduce_runtimeAttributeExp(__p, expr); |
| |
| expression = Pattern arrayIndexExpr : 1 |
| JBurg.Reduction reducer.reduce_arrayIndexExpr (__p, stem, false, index); |
| |
| expression = Pattern superIndexExpr : 1 |
| JBurg.Reduction reducer.reduce_arrayIndexExpr (__p, null, true, index); |
| |
| expression = Pattern functionCallExpr : 3 // Cost artificially inflated |
| JBurg.Reduction reducer.reduce_functionCallExpr_to_expression (__p, method_name, args); |
| |
| // Use callpropvoid to dodge a pop insn where it fits. |
| void_expression = Pattern functionCallExpr : 2 |
| JBurg.Reduction reducer.reduce_functionCallExpr_to_void_expression (__p, method_name, args); |
| |
| void_expression = Pattern superCallExpr : 2 |
| JBurg.Reduction reducer.reduce_superCallExpr (__p, args); |
| |
| void_expression = Pattern functionCallOfSuperclassMethod : 1 |
| JBurg.Reduction reducer.reduce_functionCallOfSuperclassMethod_to_void_expression (__p, null, method_name, args); |
| |
| void_expression = Pattern functionCallOfExplicitObjectSuperclassMethod : 2 |
| JBurg.Reduction reducer.reduce_functionCallOfSuperclassMethod_to_void_expression (__p, stem, method_name, args); |
| |
| expression = Pattern newVectorLiteral: 0 |
| JBurg.Reduction reducer.reduce_newVectorLiteral(__p, literal); |
| |
| // 'new Array()' has cost 1. |
| expression = Pattern emptyConstructor : isEmptyArrayConstructor() |
| JBurg.Reduction reducer.reduce_newEmptyArray(__p); |
| |
| // 'new Object()' has cost 1. |
| expression = Pattern emptyConstructor : isEmptyObjectConstructor() |
| JBurg.Reduction reducer.reduce_newEmptyObject(__p); |
| |
| // 'new Whatever(...)' has cost 2, so it gets beaten by the two previous rules. |
| // Use this reduction if the type is known; |
| // it allows much better error checking of the constructor call. |
| expression = Pattern newExpr : 2 |
| JBurg.Reduction reducer.reduce_newExpr (__p, class_binding, args); |
| |
| expression = Pattern newMemberProperty: 10 |
| JBurg.Reduction reducer.reduce_newMemberProperty(__p, stem, member, args); |
| |
| expression = Pattern newAsRandomExpr : 30 |
| JBurg.Reduction reducer.reduce_newAsRandomExpr (__p, random_expr, args); |
| |
| expression = Pattern functionCallOfSuperclassMethod : 2 |
| JBurg.Reduction reducer.reduce_functionCallOfSuperclassMethod_to_expression (__p, null, method_name, args); |
| |
| expression = Pattern functionCallOfExplicitObjectSuperclassMethod : 2 |
| JBurg.Reduction reducer.reduce_functionCallOfSuperclassMethod_to_expression (__p, stem, method_name, args); |
| |
| expression = Pattern functionAsMemberExpr : 4 // Cost inflated to prefer functionCallOfSuperclassMethod |
| JBurg.Reduction reducer.reduce_functionAsMemberExpr (__p, stem, method_name, args); |
| |
| expression = Pattern functionAsBracketExpr : 4 |
| JBurg.Reduction reducer.reduce_functionAsBracketExpr (__p, stem, index, args); |
| |
| expression = Pattern functionAsRandomExpr : 30 |
| JBurg.Reduction reducer.reduce_functionAsRandomExpr (__p, random_expr, args); |
| |
| /* |
| * Delete expressions. |
| */ |
| expression = Pattern deleteNameExpr: 2 |
| JBurg.Reduction reducer.reduce_deleteNameExpr(__p, n); |
| |
| expression = Pattern deleteBracketExpr: 1 |
| JBurg.Reduction reducer.reduce_deleteBracketExpr(__p, stem, index); |
| |
| expression = Pattern deleteAtBracketExpr: 1 |
| JBurg.Reduction reducer.reduce_deleteAtBracketExpr(__p, stem, index); |
| |
| expression = Pattern deleteMemberExpr: 1 |
| JBurg.Reduction reducer.reduce_deleteMemberExpr(__p, stem, field); |
| |
| expression = Pattern deleteRuntimeNameExpr: 1 |
| JBurg.Reduction reducer.reduce_deleteRuntimeNameExpr(__p, stem, rt_name); |
| |
| expression = Pattern deleteDescendantsExpr: 1 |
| JBurg.Reduction reducer.reduce_deleteDescendantsExpr(__p, stem, field); |
| |
| expression = Pattern deleteAnyExprExprExpr: 2000 |
| JBurg.Reduction reducer.reduce_deleteExprExprExpr(__p, expr); |
| |
| /* |
| * Comma expression. |
| */ |
| expression = Pattern commaExpr: 0 |
| JBurg.Reduction reducer.reduce_commaExpr(__p, payload_expr, exprs); |
| |
| /* |
| * Names and reference expressions built from names. |
| */ |
| name = Pattern simpleName : 0 |
| JBurg.Reduction reducer.reduce_simpleName (__p); |
| |
| decl_name = Pattern simpleName : 0 |
| JBurg.Reduction reducer.reduce_declName(__p); |
| |
| qualifiedNamePart = Pattern simpleName: 0 |
| JBurg.Reduction reducer.getIdentifierContent(__p); |
| |
| name = Pattern typedVariableExpression : 0 |
| JBurg.Reduction reducer.reduce_typedVariableExpression (__p, var_name, var_type); |
| |
| dottedNamePart = Pattern dottedName : 0 |
| JBurg.Reduction reducer.reduce_by_concatenation (__p, first, second); |
| |
| dottedNamePart = qualifiedNamePart; |
| |
| name = Pattern dottedName : isDottedName() |
| JBurg.Reduction reducer.dottedName (__p, first, second); |
| |
| name = Pattern dottedName : isPackageName() |
| JBurg.Reduction reducer.errorPackageName(__p, first, second); |
| |
| // This reduction handles an entire dotted name subtree. |
| name = Pattern fullName : 0 |
| JBurg.Reduction reducer.dottedName(__p, first, second); |
| |
| // qualified namespace is the same as a full name, |
| // it's just what gets produced when we're in a use namespace directive |
| // use namespace a.b.Foo; |
| name = Pattern qualifiedNamespaceName : 0 |
| JBurg.Reduction reducer.dottedName(__p, first, second); |
| |
| // This reduction handles the bar.T part of foo.bar.T |
| dottedNamePart = Pattern fullName : 0 |
| JBurg.Reduction reducer.reduce_by_concatenation (__p, first, second); |
| |
| name = Pattern superAccess : 0 |
| JBurg.Reduction reducer.reduce_superAccess (__p, qualified_name); |
| |
| name = Pattern superThisAccess : isSuperThisForFieldAccess() |
| JBurg.Reduction reducer.reduce_superAccess (__p, qualified_name); |
| |
| // A bare parameterized type name can only be |
| // used as a type annotation. In code it's necessary |
| // to expand it into an expression that calls applytype. |
| type_name = Pattern parameterizedName :0 |
| JBurg.Reduction reducer.reduce_parameterizedName (__p, base, param); |
| |
| // A name can be a type_name, which in combination with |
| // the reduction above yields the set of possible type_names: |
| // identifiers and * |
| type_name = name : 1 |
| JBurg.Reduction reducer.reduce_nameToTypeName(name, true); |
| |
| // The 'new' expression takes a pseduo-type name: |
| // when it can be resolved, the semantic analysis |
| // code can check the constructor. When it can't |
| // be resolved, it fails at runtime. |
| new_type_name = name; |
| |
| // Inflate this cost so it's only selected |
| // if the type_name isn't a name. |
| new_type_name = type_name : 20 |
| JBurg.Reduction reducer.reduce_nameToTypeName(type_name, false); |
| |
| // Special rule to convert from name to type param expression |
| // we need this because '*' converts special in this context |
| type_param_expression = name : 1 |
| JBurg.Reduction reducer.reduce_typeNameParameter(__p, name); |
| |
| // any other expression can be used as a type param name in an expression context |
| type_param_expression = expression; |
| |
| expression = Pattern parameterizedTypeExpression : 1 |
| JBurg.Reduction reducer.reduce_parameterizedTypeExpression (__p, base, param); |
| |
| expression = name: 2000 |
| JBurg.Reduction reducer.transform_name_to_expression(__p, name); |
| |
| type_name = Pattern voidExpr : 0 |
| JBurg.Reduction reducer.reduce_voidExpr_to_type_name(__p); |
| |
| name = Pattern attributeName : 0 |
| JBurg.Reduction reducer.reduce_attributeName (__p, attr_name); |
| |
| // ns1::foo and rt_ns::foo look alike to |
| // the parser, so they must be disambiguated |
| // by checking their semantic annotations. |
| name = Pattern namespaceAccess : qualifierIsCompileTimeConstant() |
| JBurg.Reduction reducer.reduce_namespaceAccess (__p, qualifier, qualified_name); |
| |
| // Error trap for an unresolved namespace in a context |
| // where it must be declared. |
| name = Pattern namespaceAccess: ERROR_TRAP |
| JBurg.Reduction reducer.error_namespaceAccess(__p, qualifier, qualified_name); |
| |
| // A namespace-qualified name reference whose name |
| // is a runtime expression, e.g., ns1::[foo]. |
| // The parser doesn't know the difference between |
| // ns1::[foo] and rt_ns::[foo], so we need a cost |
| // function to disambiguate the tree. |
| runtime_name_expression = Pattern namespaceMultinameL: qualifierIsCompileTimeConstant() |
| JBurg.Reduction reducer.reduce_namespaceMultinameL(__p, qualifier, expr); |
| |
| runtime_name_expression = Pattern namespaceRTQName : 2000 |
| JBurg.Reduction reducer.reduce_namespaceRTQName (__p, qualifier, qualfied_name); |
| |
| expression = Pattern embedExpression : 2 |
| JBurg.Reduction reducer.reduce_embed(__p); |
| |
| /* |
| * E4X expressions (except literals) |
| */ |
| |
| expression = Pattern e4xFilter : 3 |
| JBurg.Reduction reducer.reduce_e4xFilter (__p, stem, filter); |
| |
| runtime_name_expression = Pattern namespaceRTQNameL : 2000 |
| JBurg.Reduction reducer.reduce_namespaceRTQNameL (__p, qualifier, expr); |
| |
| expression = runtime_name_expression : 1 |
| JBurg.Reduction reducer.transform_runtime_name_expression(__p, runtime_name_expression); |
| |
| expression = Pattern runtimeNameExpression: 1 |
| JBurg.Reduction reducer.reduce_runtimeNameExpression(__p, expr); |
| |
| name = Pattern namespaceAsName: 1 |
| JBurg.Reduction reducer.reduce_namespaceAsName_to_name(__p); |
| |
| expression = Pattern namespaceAsName: 1 |
| JBurg.Reduction reducer.reduce_namespaceAsName_to_expression(__p); |
| |
| void_expression = Pattern assignToRuntimeNameExpr: 1 |
| JBurg.Reduction reducer.reduce_assignToRuntimeNameExpr(__p, lval, r, DISCARD_VALUE); |
| |
| expression = Pattern assignToRuntimeNameExpr: 1 |
| JBurg.Reduction reducer.reduce_assignToRuntimeNameExpr(__p, lval, r, NEED_VALUE); |
| |
| expression = Pattern descendantsExpression : 1 |
| JBurg.Reduction reducer.reduce_memberAccessExpr(__p, stem, descendants, OP_getdescendants); |
| |
| /* |
| * E4X directives and statements |
| */ |
| statement = Pattern defaultXMLNamespace : 1 |
| JBurg.Reduction reducer.reduce_defaultXMLNamespace(__p, ns_expr); |
| |
| /* |
| * Literals. |
| */ |
| e4x_literal = Pattern XMLLiteral : 0 |
| JBurg.Reduction reducer.getStringLiteralContent (__p); |
| |
| string_constant = e4x_literal; |
| |
| expression = Pattern XMLContent: 1 |
| JBurg.Reduction reducer.reduce_XMLContent(__p, exprs); |
| |
| expression = Pattern XMLList: 2 |
| JBurg.Reduction reducer.reduce_XMLList(__p, exprs); |
| |
| expression = Pattern XMLListConst: 1 |
| JBurg.Reduction reducer.reduce_XMLListConst(__p, elements); |
| |
| expression = literal; |
| literal = object_literal; |
| literal = boolean_literal; |
| literal = array_literal; |
| |
| expression = string_constant : 1 |
| JBurg.Reduction reducer.transform_string_constant(__p, string_constant); |
| |
| integer_constant = Pattern integerLiteral: 0 |
| JBurg.Reduction reducer.getIntegerContent(__p); |
| |
| expression = integer_constant : 1 |
| JBurg.Reduction reducer.transform_integer_constant(__p, integer_constant); |
| |
| uint_constant = Pattern uintLiteral: 0 |
| JBurg.Reduction reducer.getUintContent(__p); |
| |
| expression = uint_constant : 1 |
| JBurg.Reduction reducer.transform_uint_constant(__p, uint_constant); |
| |
| expression = boolean_constant : 1 |
| JBurg.Reduction reducer.transform_boolean_constant(__p, boolean_constant); |
| |
| |
| /** |
| * Constant values |
| */ |
| |
| // Constant-folded arithmetic for all types. |
| JBurg.include "ConstantArithmetic.jbg" |
| |
| // Constant-folded logic for all types |
| JBurg.include "ConstantLogic.jbg" |
| |
| // Error trap for non-constant expressions |
| // used in a context where only a constant is valid, |
| // e.g., foo() in function needsConstantInit(x = foo()). |
| required_constant_value = expression : ERROR_TRAP |
| JBurg.Reduction reducer.transform_expression_to_constant_value(__p, expression); |
| |
| // A name can be used as a constant in some contexts, |
| // e.g., if it's a Namespace or otherwise known to be |
| // a compile-time constant. |
| constant_value = name : isCompileTimeConstant() |
| JBurg.Reduction reducer.transform_name_to_constant_value(__p); |
| |
| constant_value = Pattern constantDottedName: isCompileTimeConstant() |
| JBurg.Reduction reducer.transform_name_to_constant_value(__p); |
| |
| double_constant = Pattern doubleLiteral : 3 |
| JBurg.Reduction reducer.getDoubleContent(__p); |
| |
| integer_constant = LiteralIntegerZeroID(void) : 1 |
| JBurg.Reduction reducer.getIntegerZeroContent(__p); |
| |
| uint_constant = LiteralIntegerZeroID(void) : 1 |
| JBurg.Reduction reducer.getIntegerZeroContentAsLong(__p); |
| |
| constant_value = Pattern nullLiteral : 0 |
| JBurg.Reduction reducer.reduce_nullLiteral_to_constant_value (__p); |
| |
| constant_value = Pattern void0Literal: 0 |
| JBurg.Reduction reducer.reduce_void0Literal_to_constant_value(__p); |
| |
| constant_value = Pattern voidConstant: 0 |
| JBurg.Reduction reducer.reduce_voidOperator_to_constant_value(__p, value); |
| |
| boolean_constant = Pattern booleanLiteral: 0 |
| JBurg.Reduction reducer.reduce_booleanLiteral(__p); |
| |
| string_constant = Pattern stringLiteral : 0 |
| JBurg.Reduction reducer.getStringLiteralContent (__p); |
| |
| numeric_constant = integer_constant; |
| numeric_constant = uint_constant; |
| numeric_constant = double_constant; |
| |
| |
| constant_value = string_constant : 1 |
| JBurg.Reduction reducer.transform_string_constant_to_constant(__p, string_constant); |
| |
| constant_value = boolean_constant : 1 |
| JBurg.Reduction reducer.transform_boolean_constant_to_constant(__p, boolean_constant); |
| |
| constant_value = numeric_constant : 1 |
| JBurg.Reduction reducer.transform_numeric_constant_to_constant(__p, numeric_constant); |
| |
| required_constant_value = constant_value; |
| |
| // Fallback code-gen choice if conversion to |
| // double failed in LiteralNumberNode.getNodeID(). |
| // It's not likely to work better here, |
| // but the BURM will emit some diagnostics. |
| double_constant = Pattern numericLiteral : 3 |
| JBurg.Reduction reducer.getDoubleContent(__p); |
| |
| expression = double_constant : 5 |
| JBurg.Reduction reducer.transform_double_constant(__p, double_constant); |
| |
| expression = numeric_constant : 5 |
| JBurg.Reduction reducer.transform_numeric_constant(__p, numeric_constant); |
| |
| expression = constant_value : 0 |
| JBurg.Reduction reducer.transform_constant_value(__p, constant_value); |
| |
| object_literal = Pattern nullLiteral : 1 |
| JBurg.Reduction reducer.reduce_nullLiteral_to_object_literal (__p); |
| |
| object_literal = Pattern objectLiteral : 3 |
| JBurg.Reduction reducer.reduce_objectLiteral (__p, elements); |
| |
| object_literal_element = Pattern objectLiteralElement : 0 |
| JBurg.Reduction reducer.reduce_objectLiteralElement (__p, id, value); |
| |
| non_resolving_identifier = Pattern nonResolvingIdentifier : 0 |
| JBurg.Reduction reducer.getIdentifierContent(__p); |
| |
| expression = non_resolving_identifier : 1 |
| JBurg.Reduction reducer.transform_non_resolving_identifier(__p, non_resolving_identifier); |
| |
| object_literal = Pattern regexLiteral: 5 |
| JBurg.Reduction reducer.reduce_regexLiteral(__p); |
| |
| object_literal = Pattern void0Literal: 1 |
| JBurg.Reduction reducer.reduce_void0Literal_to_object_literal(__p); |
| |
| object_literal = Pattern void0Operator: 1 |
| JBurg.Reduction reducer.reduce_void0Operator(__p); |
| |
| expression = Pattern voidOperator : 1 |
| JBurg.Reduction reducer.reduce_voidOperator_to_expression (__p, expr); |
| |
| expression = Pattern voidExpr : 1 |
| JBurg.Reduction reducer.reduce_voidExpr_to_expression(__p); |
| |
| boolean_literal = boolean_constant: 1 |
| JBurg.Reduction reducer.transform_boolean_constant(__p, boolean_constant); |
| |
| array_literal = Pattern arrayLiteral : 1 |
| JBurg.Reduction reducer.reduce_arrayLiteral (__p, elements); |
| |
| vector_literal = Pattern vectorLiteral: 1 |
| JBurg.Reduction reducer.reduce_vectorLiteral(__p, type_param, elements); |
| |
| /* |
| * Directives. |
| */ |
| statement = Pattern useNamespaceDirective: 0 |
| JBurg.Reduction reducer.reduce_useNamespaceDirective(__p, ns_name); |
| |
| import_name = Pattern simpleName : 0 |
| JBurg.Reduction reducer.createInstructionList(__p); |
| |
| import_name = Pattern fullName : 0 |
| JBurg.Reduction reducer.createInstructionList(__p); |
| |
| statement = Pattern importDirective: 0 |
| JBurg.Reduction reducer.reduce_importDirective(__p); |
| |
| /* |
| * MXML constructs |
| */ |
| |
| function = Pattern mxmlEventSpecifier : 0 |
| Prologue reducer.prologue_mxmlEventSpecifier(p) |
| JBurg.Reduction reducer.reduce_mxmlEventSpecifier (__p, stmts); |
| |
| |
| // MXML data binding setter expression's |
| // |
| // mxml_data_binding_setter_expression is in effect |
| // an alternate start symbol that is never reachable from a |
| // rule that is reachable from any other start symbol. |
| // The mxml_data_binding_setter_expression is used |
| // as the goal state when this BURM is invoked from |
| // AbcGenerator.generateMXMLDataBindingSetterFunction. |
| mxml_data_binding_setter_expression = Pattern memberAccessExpr : 1 |
| JBurg.Reduction reducer.reduce_memberAccessExpr_to_mxmlDataBindingSetter(__p, stem, member); |
| |
| mxml_data_binding_setter_expression = Pattern qualifiedMemberAccessExpr : 10 |
| JBurg.Reduction reducer.reduce_qualifiedMemberAccessExpr_to_mxmlDataBindingSetter(__p, stem, qualifier, member); |
| |
| mxml_data_binding_setter_expression = Pattern qualifiedMemberRuntimeNameExpr : 100 |
| JBurg.Reduction reducer.reduce_qualifiedMemberRuntimeNameExpr_to_mxmlDataBindingSetter(__p, stem, qualifier, runtime_member); |
| |
| mxml_data_binding_setter_expression = Pattern arrayIndexExpr : 1 |
| JBurg.Reduction reducer.reduce_arrayIndexExpr_to_mxmlDataBindingSetter(__p, stem, index, false); |
| |
| mxml_data_binding_setter_expression = name : 1 |
| JBurg.Reduction reducer.reduceName_to_mxmlDataBindingSetter(__p, name); |
| |
| mxml_data_binding_setter_expression = runtime_name_expression : 1 |
| JBurg.Reduction reducer.reduceRuntimeName_to_mxmlDataBindingSetter(__p, runtime_name_expression); |