| 815 | } |
| 816 | |
| 817 | BfBlock* BfParser::ParseInlineBlock(int spaceIdx, int endIdx) |
| 818 | { |
| 819 | BfBlock* block = NULL; |
| 820 | SizedArray<BfAstNode*, 8> childArr; |
| 821 | |
| 822 | mSrcIdx = spaceIdx; |
| 823 | BfAstNode* startNode = NULL; |
| 824 | int usedEndIdx = spaceIdx; |
| 825 | int usedLineNum = mLineNum; |
| 826 | int usedLineStart = mLineStart; |
| 827 | |
| 828 | while (true) |
| 829 | { |
| 830 | NextToken(endIdx + 1, false, true); |
| 831 | if (mSyntaxToken == BfSyntaxToken_HIT_END_IDX) |
| 832 | { |
| 833 | mSrcIdx = usedEndIdx; |
| 834 | mLineNum = usedLineNum; |
| 835 | mLineStart = usedLineStart; |
| 836 | |
| 837 | auto lastNode = mSidechannelRootNode->GetLast(); |
| 838 | if (lastNode != NULL) |
| 839 | mSrcIdx = std::max(mSrcIdx, lastNode->GetSrcEnd()); |
| 840 | break; |
| 841 | } |
| 842 | |
| 843 | usedEndIdx = mSrcIdx; |
| 844 | usedLineStart = mLineStart; |
| 845 | usedLineNum = mLineNum; |
| 846 | |
| 847 | auto childNode = CreateNode(); |
| 848 | if (childNode == NULL) |
| 849 | break; |
| 850 | if ((childNode->IsA<BfCommentNode>())) |
| 851 | { |
| 852 | mSidechannelRootNode->Add(childNode); |
| 853 | mPendingSideNodes.push_back(childNode); |
| 854 | continue; |
| 855 | } |
| 856 | if (startNode == NULL) |
| 857 | startNode = childNode; |
| 858 | if (block == NULL) |
| 859 | { |
| 860 | block = mAlloc->Alloc<BfBlock>(); |
| 861 | block->mParserBlockId = ++mCurBlockId; |
| 862 | } |
| 863 | block->Add(childNode); |
| 864 | childArr.push_back(childNode); |
| 865 | //block->mChildArr.Add(childNode, &mAlloc); |
| 866 | } |
| 867 | |
| 868 | if (block != NULL) |
| 869 | block->Init(childArr, mAlloc); |
| 870 | |
| 871 | return block; |
| 872 | } |
| 873 | |
| 874 | BfExpression* BfParser::CreateInlineExpressionFromNode(BfBlock* block) |