示例#1
0
 public virtual void DefinePredicateInAlt(int currentAlt, PredAST predAST)
 {
     actions.Add(predAST);
     alt[currentAlt].actions.Add(predAST);
     if (!g.sempreds.ContainsKey(predAST))
     {
         g.sempreds[predAST] = g.sempreds.Count;
     }
 }
        public virtual void BuildLexerRuleActions(Lexer lexer, Rule r)
        {
            if (r.actions.Count == 0)
            {
                return;
            }

            CodeGenerator      gen     = @delegate.GetGenerator();
            Grammar            g       = @delegate.GetGrammar();
            string             ctxType = @delegate.GetTarget().GetRuleFunctionContextStructName(r);
            RuleActionFunction raf;

            if (!lexer.actionFuncs.TryGetValue(r, out raf) || raf == null)
            {
                raf = new RuleActionFunction(@delegate, r, ctxType);
            }

            foreach (ActionAST a in r.actions)
            {
                if (a is PredAST)
                {
                    PredAST             p = (PredAST)a;
                    RuleSempredFunction rsf;
                    if (!lexer.sempredFuncs.TryGetValue(r, out rsf) || rsf == null)
                    {
                        rsf = new RuleSempredFunction(@delegate, r, ctxType);
                        lexer.sempredFuncs[r] = rsf;
                    }
                    rsf.actions[g.sempreds[p]] = new Action(@delegate, p);
                }
                else if (a.Type == ANTLRParser.ACTION)
                {
                    raf.actions[g.lexerActions[a]] = new Action(@delegate, a);
                }
            }

            if (raf.actions.Count > 0 && !lexer.actionFuncs.ContainsKey(r))
            {
                // only add to lexer if the function actually contains actions
                lexer.actionFuncs[r] = raf;
            }
        }
        /** Create RuleFunction per rule and update semantic predicates, actions of parser
         *  output object with stuff found in r.
         */
        public virtual void BuildRuleFunction(Parser parser, Rule r)
        {
            RuleFunction function = Rule(r);

            parser.funcs.Add(function);
            PushCurrentRule(function);
            function.FillNamedActions(@delegate, r);

            if (r is LeftRecursiveRule)
            {
                BuildLeftRecursiveRuleFunction((LeftRecursiveRule)r,
                                               (LeftRecursiveRuleFunction)function);
            }
            else
            {
                BuildNormalRuleFunction(r, function);
            }

            Grammar g = GetGrammar();

            foreach (ActionAST a in r.actions)
            {
                if (a is PredAST)
                {
                    PredAST             p = (PredAST)a;
                    RuleSempredFunction rsf;
                    if (!parser.sempredFuncs.TryGetValue(r, out rsf) || rsf == null)
                    {
                        rsf = new RuleSempredFunction(@delegate, r, function.ctxType);
                        parser.sempredFuncs[r] = rsf;
                    }
                    rsf.actions[g.sempreds[p]] = new Action(@delegate, p);
                }
            }

            PopCurrentRule();
        }
示例#4
0
        public virtual Handle Sempred([NotNull] PredAST pred)
        {
            //System.out.println("sempred: "+ pred);
            ATNState left = NewState(pred);

            ATNState right = NewState(pred);

            AbstractPredicateTransition p;

            if (pred.GetOptionString(LeftRecursiveRuleTransformer.PRECEDENCE_OPTION_NAME) != null)
            {
                int precedence = int.Parse(pred.GetOptionString(LeftRecursiveRuleTransformer.PRECEDENCE_OPTION_NAME));
                p = new PrecedencePredicateTransition(right, precedence);
            }
            else
            {
                bool isCtxDependent = UseDefAnalyzer.ActionIsContextDependent(pred);
                p = new PredicateTransition(right, currentRule.index, g.sempreds[pred], isCtxDependent);
            }

            left.AddTransition(p);
            pred.atnState = left;
            return(new Handle(left, right));
        }
示例#5
0
 public override void SempredInAlt(PredAST pred)
 {
     currentRule.DefinePredicateInAlt(currentOuterAltNumber, pred);
     pred.resolver = currentRule.alt[currentOuterAltNumber];
 }