Ejemplo n.º 1
0
    public LR_SyntaxTree ParseAll(SyntaxTreeBuilder pSyntaxTreeBuilder)
    {
        if (!pSyntaxTreeBuilder.TokenScanner.MoveNext())
        {
            return(null);
        }

        var kSyntaxTree = new LR_SyntaxTree();
        var rootId      = new ParseNode_Id(Rule_Start.NtName);

        m_dicIdName2RuleOrToken[Rule_Start.NtName] = Rule_Start;
        rootId.Init_PreCheckSet(this);
        Rule_Start.parent = rootId;
        pSyntaxTreeBuilder.SyntaxRule_Cur = kSyntaxTree.root = new SyntaxTreeNode_Rule(rootId);
        pSyntaxTreeBuilder.ParseNode_Cur  = Rule_Start.Parse(pSyntaxTreeBuilder);

        pSyntaxTreeBuilder.SyntaxRule_Err = pSyntaxTreeBuilder.SyntaxRule_Cur;
        pSyntaxTreeBuilder.ParseNode_Err  = pSyntaxTreeBuilder.ParseNode_Cur;

        while (pSyntaxTreeBuilder.ParseNode_Cur != null)
        {
            if (!ParseStep(pSyntaxTreeBuilder))
            {
                break;
            }
        }

        return(kSyntaxTree);
    }
Ejemplo n.º 2
0
 public void Init()
 {
     RootID = new ParseNode_Id(Rule_Start.NtName);
     m_dicIdName2RuleOrToken[Rule_Start.NtName] = Rule_Start;
     RootID.Init_PreCheckSet(this);
     Rule_Start.parent = RootID;
 }
Ejemplo n.º 3
0
 public void _AR_(ParseNode_Id id, ParseNode_Base rhs, SemanticFlags kSF = 0, bool bContextualKeyword = false, bool bAuto = false)
 {
     m_kParseRoot.AddRule(new ParseNode_Rule(id.Name, rhs)
     {
         semantics = kSF, contextualKeyword = bContextualKeyword, autoExclude = bAuto
     });
 }
Ejemplo n.º 4
0
    public ParseNode_Id Clone()
    {
        var clone = new ParseNode_Id(Name)
        {
            LinkedTarget = LinkedTarget, FirstSet = FirstSet, FollowSet = FollowSet
        };
        var token = LinkedTarget as ParseNode_Token;

        if (token != null)
        {
            clone.LinkedTarget        = token.Clone();
            clone.LinkedTarget.parent = this;
        }
        return(clone);
    }
 public SyntaxTreeNode_Rule(ParseNode_Id rule)
 {
     ParseNode = rule;
 }
    public SyntaxTreeNode_Rule AddNode(ParseNode_Id rule, SyntaxTreeBuilder pSyntaxTreeBuilder, out bool skipParsing)
    {
        skipParsing = false;

        bool removedReusable = false;

        if (NumValidNodes < nodes.Count)
        {
            var reusable = nodes[NumValidNodes] as SyntaxTreeNode_Rule;
            if (reusable != null)
            {
                var firstLeaf = reusable.GetFirstLeaf(false);
                if (reusable.ParseNode != rule)
                {
                    if (firstLeaf == null || firstLeaf.token == null || firstLeaf.Line <= pSyntaxTreeBuilder.TokenScanner.CurrentLine)
                    {
                        reusable.Dispose();
                        removedReusable = true;
                    }
                }
                else
                {
                    if (firstLeaf != null && firstLeaf.token != null && firstLeaf.Line > pSyntaxTreeBuilder.TokenScanner.CurrentLine)
                    {
                        // Ignore this node for now
                    }
                    else if (firstLeaf == null || firstLeaf.token != null && firstLeaf.m_sSyntaxError != null)
                    {
                        reusable.Dispose();
                        removedReusable = true;
                    }
                    else if (firstLeaf.token == pSyntaxTreeBuilder.TokenScanner.Current)
                    {
                        var lastLeaf = reusable.GetLastLeaf();
                        if (lastLeaf != null && !reusable.HasErrors())
                        {
                            if (lastLeaf.token != null)
                            {
                                ((SyntaxTreeBuilder_CSharp)pSyntaxTreeBuilder).MoveAfterLeaf(lastLeaf);
                                skipParsing = true;
                                ++NumValidNodes;
                                return(pSyntaxTreeBuilder.SyntaxRule_Cur);
                            }
                        }
                        else
                        {
                            reusable.Dispose();
                            removedReusable = true;
                        }
                    }
                    else if (reusable.NumValidNodes == 0)
                    {
                        ++NumValidNodes;
                        reusable.m_sSyntaxError = null;
                        reusable.m_bMissing     = false;
                        return(reusable);
                    }
                    else if (pSyntaxTreeBuilder.TokenScanner.Current != null && (firstLeaf.token == null || firstLeaf.Line <= pSyntaxTreeBuilder.TokenScanner.CurrentLine))
                    {
                        reusable.Dispose();
                        if (firstLeaf.token == null || firstLeaf.Line == pSyntaxTreeBuilder.TokenScanner.CurrentLine)
                        {
                            removedReusable = true;
                        }
                        else
                        {
                            nodes.RemoveAt(NumValidNodes);
                            for (var i = NumValidNodes; i < nodes.Count; ++i)
                            {
                                --nodes[i].m_iChildIndex;
                            }
                            return(AddNode(rule, pSyntaxTreeBuilder, out skipParsing));
                        }
                    }
                }
            }
        }

        var node = new SyntaxTreeNode_Rule(rule)
        {
            Parent = this, m_iChildIndex = NumValidNodes
        };

        if (NumValidNodes == nodes.Count)
        {
            nodes.Add(node);
            ++NumValidNodes;
        }
        else
        {
            if (removedReusable)
            {
                nodes[NumValidNodes] = node;
            }
            else
            {
                nodes.Insert(NumValidNodes, node);
            }
            ++NumValidNodes;
        }
        if (NumValidNodes < nodes.Count && nodes[NumValidNodes].m_iChildIndex != NumValidNodes)
        {
            for (var i = NumValidNodes; i < nodes.Count; ++i)
            {
                nodes[i].m_iChildIndex = i;
            }
        }
        return(node);
    }