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; }
/// <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); }
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; }
public static LL1Table BuildAnalysisTable(BnfDefination defination) { throw new NotImplementedException(); }