C 언어 해석기 - 18 문법 분석(3)
6149 단어 C#C 언어해석기형식 언어 및 로봇
private bool AddOperatorNode(ref Expression.ExpressionNode expTree, Expression.Operator.Operator op)
{
Expression.ExpressionNode node = new Expression.ExpressionNode()
{
Token = op
};
if (expTree != null && expTree.Token is Expression.Operand.Operand)
{
node.LeftNode = expTree;
expTree = node;
}
else
{
if (expTree == null)
{
expTree = node;
}
else
{
if (node.Token <= expTree.Token)
{
node.LeftNode = expTree;
expTree = node;
}
else
{
Expression.ExpressionNode parent = null;
Expression.ExpressionNode root = expTree;
do
{
// Operand ?
if (root.Token is Expression.Operand.Operand)
{
if (parent != null)
{
parent.RightNode = node;
node.LeftNode = root;
break;
}
else
{
node.LeftNode = root;
root = node;
break;
}
}
// Less priority, new node will be add to right child node
if (root.Token <= node.Token)
{
if (root.RightNode == null)
{
root.RightNode = node;
break;
}
parent = root;
root = root.RightNode;
}
else
{
// Higher priority
if (parent == null)
{
node.LeftNode = root;
expTree = node;
}
else
{
parent.RightNode = node;
node.LeftNode = root;
}
break;
}
} while (true);
}
}
}
m_lastExpNode = node;
return true;
} // func
다음은 작업 수를 추가하는 작업이며 유형 일치 확인이 필요합니다.
private bool AddOperandNode(Context ctx, SourceCode src, ref Expression.ExpressionNode expTree, Expression.Operand.Operand op)
{
Expression.ExpressionNode node = new Expression.ExpressionNode()
{
Token = op
};
if (expTree == null)
{
expTree = node;
m_lastExpNode = node;
return true;
}
// Root should be operator.
if (expTree.Token is Expression.Operand.Operand)
if (!NotifyError(ctx, src.Location, ParsingErrorType.SyntaxError, "Syntax error."))
return false;
Expression.ExpressionNode root = expTree;
// Add to end of right side
while (root.RightNode != null)
root = root.RightNode;
// Check type
if (root.LeftNode != null)
{
DataTypeInfo leftDti = root.LeftNode.ResultType(ctx);
DataTypeInfo rightDti = op.GetTypeInfo(ctx);
if (leftDti != rightDti)
{
// void type has no meaning
if (leftDti.BaseType == PrimitiveDataType.VoidType && !leftDti.IsPointer)
if (!NotifyError(ctx, src.Location, ParsingErrorType.TypeError, "Incomplete type void"))
return false;
if ((leftDti.IsPointer && (!rightDti.IsPointer && rightDti.BaseType == PrimitiveDataType.VoidType || rightDti.BaseType == PrimitiveDataType.FloatType)) ||
((!leftDti.IsPointer && leftDti.BaseType == PrimitiveDataType.VoidType || leftDti.BaseType == PrimitiveDataType.FloatType) && rightDti.IsPointer))
{
// A warning should be cast.
NotifyWarning(ctx, src.Location, rightDti.ToString() + " will be cast to " + leftDti.ToString());
}
}
}
root.RightNode = node;
m_lastExpNode = node;
return true;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.