Example #1
0
            private int _ruleIdx;                     // 上述列表的索引

            /// <summary>
            /// <see cref="StackFrameFunction"/> 函数的参数
            /// </summary>
            /// <param name="startIdx">从token列表的哪个位置开始分析</param>
            /// <param name="currentNonTerminal">当前使用的BNF产生式,将使用这个式子检查接下来的token</param>
            /// <param name="tokens">Token列表</param>
            /// <param name="bnfDefination">所有的BNF产生式</param>
            /// <param name="backtracings">保存<see cref="Continuation"/>,用于回溯</param>
            public ParserFunc(int startIdx, string currentNonTerminal, IList <Token> tokens,
                              BnfDefination bnfDefination, Stack <Continuation> backtracings)
                : base(0)
            {
                _startIdx           = startIdx;
                _backtracings       = backtracings;
                _tokens             = tokens;
                _bnfDefination      = bnfDefination;
                _currentNonTerminal = currentNonTerminal;
            }
Example #2
0
        /// <summary>
        /// 对Token序列进行语法分析
        /// </summary>
        /// <param name="tokens">要分析的序列</param>
        /// <param name="defination">用来分析的定义</param>
        /// <param name="startSymbol">起始项,一个在defination中出现的非终结符,来表示分析的起点,也是根节点</param>
        /// <param name="startIdx">从序列的哪个位置开始分析,默认是开头</param>
        /// <returns>如果序列符合定义,返回语法分析树;否则返回 null</returns>
        public static NonTerminalTree Parse(IList <Token> tokens, BnfDefination defination, string startSymbol,
                                            int startIdx = 0)
        {
            var machine     = new StackMachine.StackMachine();
            var backtracing = new Stack <Continuation>();

            var(tree, scannedLength) = ((NonTerminalTree, int))
                                       machine.Run(new ParserFunc(startIdx, startSymbol, tokens, defination, backtracing));
            while (tree == null && backtracing.Count > 0)
            {
                var cont = backtracing.Pop();
                (tree, scannedLength) = ((NonTerminalTree, int))machine.RunWithContinuation(cont, true);
            }
            Assert(tree == null || scannedLength == tokens.Count, "在rule遍历时做了判断,这里一定相等");

            return(tree);
        }
Example #3
0
            private ParserFunc(ParserFunc that)
                : base(that)
            {
                _startIdx = that._startIdx;
                // 浅拷贝,因为必须在全局保持状态一致
                _backtracings = that._backtracings;
                // 浅拷贝,因为是不变量
                _tokens        = that._tokens;
                _bnfDefination = that._bnfDefination;

                _currentNonTerminal = that._currentNonTerminal;

                _currentTokenIdx = that._currentTokenIdx;
                _ruleItemIdx     = that._ruleItemIdx;
                // 浅拷贝,因为回溯会覆盖之前的结果,不会产生影响
                _childs = that._childs;
                // 浅拷贝,因为是不变量
                _ruleList = that._ruleList;
                _ruleIdx  = that._ruleIdx;
            }
Example #4
0
 public static LL1Table BuildAnalysisTable(BnfDefination defination)
 {
     throw new NotImplementedException();
 }