示例#1
0
void DerivationWriter :: copyVariable(SNode node)
{
   SNode local = node.firstChild();

   _writer.newNode(lxVariable);

   if (_hints != lxNone) {
      copyHints(_hints);
      _hints = lxNone;
   }

   unpackNode(local, 0);
   _writer.closeNode();

   SNode current = node.findChild((LexicalType)nsAssigning);
   if (current != lxNone) {
      _writer.newNode(lxExpression);
      _writer.appendNode(lxAssign);
      unpackNode(local, 1);

      unpackChildren(current);

      _writer.closeNode();
   }
}
示例#2
0
void DerivationWriter :: copySwitching(SNode node)
{
   SNode current = node.firstChild();
   while (current != lxNone) {
      Symbol symbol = (Symbol)current.type;
      switch (symbol) {
         case nsSwitchOption:
         case nsBiggerSwitchOption:
         case nsLessSwitchOption:
            _writer.newBookmark();
            unpackChildren(current);
            if (symbol == nsBiggerSwitchOption) {
               _writer.insert(lxOption, GREATER_MESSAGE_ID);
            }
            else if (symbol == nsLessSwitchOption) {
               _writer.insert(lxOption, LESS_MESSAGE_ID);
            }
            else _writer.insert(lxOption, EQUAL_MESSAGE_ID);
            _writer.closeNode();
            _writer.removeBookmark();
            break;
         case nsLastSwitchOption:
            _writer.newBookmark();
            unpackChildren(current);
            _writer.insert(lxElse);
            _writer.closeNode();
            _writer.removeBookmark();
            break;
         default:
            break;
      }
      current = current.nextNode();
   }
}
示例#3
0
void DerivationWriter :: unpackChildren(SNode node, int mode)
{
   SNode current = node.firstChild();
   while (current != lxNone) {
      unpackNode(current, mode);

      current = current.nextNode();
   }
}
示例#4
0
void CompilerLogic :: injectVariableAssigning(SNode node, _CompilerScope& scope, _Compiler& compiler, ref_t targetRef, ref_t& type, bool paramMode)
{
   ClassInfo info;
   defineClassInfo(scope, info, targetRef);

   node.setArgument(defineStructSize(info, false));
   //HOTFIX : allowing to assign a reference variable
   if (!node.argument && paramMode) {
      // replace the parameter with the field expression
      compiler.injectFieldExpression(node.firstChild(lxObjectMask));

      type = info.fieldTypes.get(0).value2;
   }
}
示例#5
0
void DerivationWriter :: copyObject(SNode node, int mode)
{
   int exprCounter = 0;
   SNode current = node.firstChild();
   while (current != lxNone) {
      if (current == nsExpression)
         exprCounter++;

      unpackNode(current, mode);

      current = current.nextNode();
   }

   if (mode == 1 && exprCounter > 1) {
      _writer.insert(lxExpression);
      _writer.closeNode();
   }
}
示例#6
0
void DerivationWriter :: copyMessage(SNode node, bool operationMode)
{
   SNode current = node.firstChild();
   while (current != lxNone) {
      Symbol symbol = (Symbol)current.type;
      switch (symbol) {
         case nsSubjectArg:
            _writer.newNode(lxMessage);
            unpackChildren(current);
            _writer.closeNode();
            break;
         case nsMessageParameter:
         case nsObject:
         case nsExpression:
            _writer.newBookmark();
            unpackChildren(current, 1);
            _writer.removeBookmark();
            break;
         case nsElseOperation:
            _writer.newNode(lxExpression);
            unpackChildren(current);
            _writer.closeNode();
            break;
         case nsSubCode:
            unpackNode(current, 1);
            break;
         case nsL0Operation:
         case nsL3Operation:
         case nsL4Operation:
         case nsL5Operation:
         case nsL6Operation:
         case nsL7Operation:
         case nsNewOperator:
         case nsMessageOperation:
            copyMessage(current, (symbol != nsMessageOperation));
            _writer.insert(lxExpression);
            _writer.closeNode();
            break;
         case tsIdentifier:
         case tsPrivate:
         case tsReference:
            if (!operationMode) {
               _writer.newNode(lxMessage);
               unpackNode(current, 0);
               _writer.closeNode();
               break;
            }
         default:
            if (operationMode && current.existChild(lxTerminal)) {
               if ((Symbol)node.type == nsNewOperator) {
                  //HOTFIX : mark new operator
                  _writer.appendNode(lxOperator, -1);
                  if (symbol == tsInteger || symbol == tsIdentifier) {
                     unpackNode(current, 0);
                  }
               }
               else {
                  _writer.newNode(lxOperator);
                  copyChildren(current);
                  _writer.closeNode();
               }

               _writer.newBookmark();               
            }
            break;
      }
      current = current.nextNode();
   }

   if (operationMode) {
      _writer.removeBookmark();
   }
}
示例#7
0
void DerivationWriter :: unpackNode(SNode& node, int mode)
{
   Symbol symbol = (Symbol)node.type;
   switch (symbol) {
      case nsClass:
      case nsSymbol:
      case nsStatic:
      case nsMethod:
      case nsConstructor:
      case nsImplicitConstructor:
      case nsTemplate:
      case nsField:
      case nsSubject:
      case nsDefaultGeneric:
      case nsDispatchExpression:
      case nsExtension:
      case nsLoop:
      case nsLock:
      case nsExtern:
         _writer.newNode((LexicalType)(symbol & ~mskAnySymbolMask));
         if (_hints != lxNone) {
            copyHints(_hints);
            _hints = lxNone;
         }            
         unpackChildren(node);
         _writer.closeNode();
         break;
      case nsSubCode:
         _writer.newNode(lxCode);
         unpackChildren(node);
         _writer.closeNode();
         if (mode == 1) {
            _writer.insert(lxExpression);
            _writer.closeNode();
         }
         break;
      case nsInlineExpression:
      case nsInlineClosure:
         unpackChildren(node);
         _writer.insert(lxInlineExpression);         
         _writer.closeNode();
         if (mode == 1) {
            _writer.insert(lxExpression);
            _writer.closeNode();
         }
         break;
      case nsNestedClass:
         unpackChildren(node);
         _writer.insert(lxNestedClass);
         _writer.closeNode();
         if (mode == 1) {
            _writer.insert(lxExpression);
            _writer.closeNode();
         }
         break;
      case nsMessageReference:
         _writer.newNode(lxExpression);
         _writer.newNode(lxMessageReference);
         unpackChildren(node);
         _writer.closeNode();
         _writer.closeNode();
         break;
      case nsHintValue:
         _writer.newNode((LexicalType)(symbol & ~mskAnySymbolMask));
         unpackChildren(node);
         _writer.closeNode();
         break;
      case nsImport:
         _writer.newNode(lxImport);
         unpackChildren(node);
         _writer.closeNode();
         break;
      case nsForward:
         _writer.newNode(lxForward);
         unpackChildren(node);
         _writer.closeNode();
         break;
      case nsBaseClass:
         _writer.newNode(lxBaseParent);
         unpackChildren(node);
         _writer.closeNode();
         break;
      case nsMethodParameter:
         _writer.newNode(lxMethodParameter);
         unpackChildren(node);
         _writer.closeNode();
         break;
      case nsSubjectArg:
         _writer.newNode(lxMessage);
         unpackChildren(node);
         _writer.closeNode();
         break;
      case tsIdentifier:
      case tsCharacter:
      case tsHexInteger:
      case tsLiteral:
      case tsPrivate:
      case tsReference:
      case tsInteger:
      case tsReal:
      case tsLong:
      case tsWide:
         _writer.newNode((LexicalType)(symbol & ~mskAnySymbolMask | lxTerminalMask | lxObjectMask));
         copyChildren(node);
         _writer.closeNode();
         break;
      case nsRootExpression:
         node = lxExpression;
      case nsExpression:
      case nsDispatchHandler:
      case nsRetStatement:
         copyExpression(node);
         break;
      case nsResendExpression:
         _writer.newBookmark();
         unpackChildren(node);

         node = node.nextNode();
         unpackNode(node, 0);

         _writer.insert(lxResendExpression);
         _writer.closeNode();

         _writer.removeBookmark();
         break;
      case nsVariable:
         copyVariable(node);
         break;
      case nsAssigning:
         copyAssigning(node);
         break;
      case nsCatchMessageOperation:
      case nsAltMessageOperation:
         _writer.newBookmark();
      case nsMessageOperation:
         copyMessage(node);
         _writer.insert(lxExpression);
         _writer.closeNode();
         if (symbol == nsCatchMessageOperation) {
            _writer.removeBookmark();            
            _writer.insert(lxTrying);
            _writer.closeNode();
         }
         else if (symbol == nsAltMessageOperation) {
            _writer.removeBookmark();
            _writer.insert(lxAlt);
            _writer.closeNode();
         }
         break;
      case nsSwitching:
         copySwitching(node);
         _writer.insert(lxSwitching);
         _writer.closeNode();
         break;
      case nsL0Operation:
      case nsL3Operation:
      case nsL4Operation:
      case nsL5Operation:
      case nsL6Operation:
      case nsL7Operation:
      case nsNewOperator:
         copyMessage(node, true);
         _writer.insert(lxExpression);
         _writer.closeNode();
         break;
      case nsObject:
         copyObject(node, mode);
         break;
      case nsThrow:
         _writer.newNode(lxThrowing);
         unpackChildren(node);
         _writer.closeNode();
         break;
      case nsCodeEnd:
         _writer.newNode(lxEOF);
         copyChildren(node.firstChild());
         _writer.closeNode();
         break;
      case nsHint:
         if (_hints == lxNone) {
            _hints = node;
         }
         break;
      default:
         break;
   }
}