SyntaxAnalyse/SyntaxTreeAnalyse.cs

(开头部分) 11KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

//xxxxxxxxxxx
using System;
using System.Collections.Generic;
using System.Text;

//xxxxxxxxx
//Email: alexleo321@hotmail.com
//Blog: xxxxxxxxxxx
namespace ConExpress.Calculator
{
    /// <summary>
    /// 语法树分析
    /// </summary>
    /// <remarks>xxxxxxxxx</remarks>
    internal class SyntaxTreeAnalyse
    {
        /// <summary>
        /// 记号段提取,提取顶级操作记号的Hash
        /// </summary>
        /// <param name="IndexStart">起始序号</param>
        /// <param name="IndexEnd">结束序号</param>
        /// <returns>传入记号段的顶级操作记号记录对象的Hash</returns>
        /// <remarks>xxxxxxxxx</remarks>
        internal static TokenRecord SyntaxTreeGetTopTokenAnalyse(List<TokenRecord> TokenList, int IndexStart, int IndexEnd)
        {
            int intIndexCurrent = IndexStart;//当前处理序号
            int intIndexSubStart = IndexStart;//子记号段的起始序号
            TokenRecord Token;//获取当前Token
            Stack<TokenRecord> StackCompart = new Stack<TokenRecord>();//括号堆栈
            Stack<TokenRecord> StackOperate = new Stack<TokenRecord>();//操作记号堆栈

            for (int intIndex = IndexStart; intIndex <= IndexEnd; intIndex++)
            {
                Token = TokenList[intIndex];
                intIndexCurrent = intIndex;
                if (Token is TokenLeftBracket)
                {
                    StackCompart.Push(TokenList[intIndexCurrent]);//把左括号压栈
                    //获取该括号对中包含的记号段
                    intIndexSubStart = intIndexCurrent + 1;//设置子记号段的起始序号
                    //提取记号段
                    //如果语法错误,比如在记号段的末尾没有配对的右括号记号,则会出错,这里假设为语法正确
                    while (StackCompart.Count > 0)
                    {
                        intIndexCurrent += 1;
                        if (intIndexCurrent >= TokenList.Count)
                        {
                            //Error or auto add lossed bracket
                            throw new SyntaxException(Token.Index, Token.Length, "缺少配对的括号");
                        }

                        if (TokenList[intIndexCurrent] is TokenLeftBracket)
                        {
                            StackCompart.Push(TokenList[intIndexCurrent]);
                        }
                        else if (TokenList[intIndexCurrent] is TokenRightBracket)
                        {
                            StackCompart.Pop();
                        }
                    }
后面还有 199 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 算力/个。 规则说明

AI 解读 AI

登录后可用,每次 10 算力,解读结果公开显示在下面。

还没有人解读过这个文件。