C語言解譯器-18 文法分析(3)

來源:互聯網
上載者:User

運算式解析中比較重要的是運算式樹狀架構中操作符的插入,需要比較優先順序:

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;        }

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.